From 3ac5342dfc0d37e7462ed77e9d9b7321ec769ef3 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 1 Aug 2018 15:51:10 +0200 Subject: [PATCH 001/212] Separate firmware updater from USBPrinterOutputDevice --- plugins/USBPrinting/AvrFirmwareUpdater.py | 122 ++++++++++++++++++ plugins/USBPrinting/USBPrinterOutputDevice.py | 118 ++--------------- 2 files changed, 130 insertions(+), 110 deletions(-) create mode 100644 plugins/USBPrinting/AvrFirmwareUpdater.py diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py new file mode 100644 index 0000000000..5c2b8dc19e --- /dev/null +++ b/plugins/USBPrinting/AvrFirmwareUpdater.py @@ -0,0 +1,122 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import QObject, QUrl, pyqtSignal, pyqtProperty + +from cura.PrinterOutputDevice import PrinterOutputDevice + +from .avr_isp import stk500v2, intelHex + +from enum import IntEnum + +@signalemitter +class AvrFirmwareUpdater(QObject): + firmwareProgressChanged = pyqtSignal() + firmwareUpdateStateChanged = pyqtSignal() + + def __init__(self, output_device: PrinterOutputDevice) -> None: + self._output_device = output_device + + self._update_firmware_thread = Thread(target=self._updateFirmware, daemon = True) + + self._firmware_view = None + self._firmware_location = None + self._firmware_progress = 0 + self._firmware_update_state = FirmwareUpdateState.idle + + def updateFirmware(self, file): + # the file path could be url-encoded. + if file.startswith("file://"): + self._firmware_location = QUrl(file).toLocalFile() + else: + self._firmware_location = file + self.showFirmwareInterface() + self.setFirmwareUpdateState(FirmwareUpdateState.updating) + self._update_firmware_thread.start() + + def _updateFirmware(self): + # Ensure that other connections are closed. + if self._connection_state != ConnectionState.closed: + self.close() + + try: + hex_file = intelHex.readHex(self._firmware_location) + assert len(hex_file) > 0 + except (FileNotFoundError, AssertionError): + Logger.log("e", "Unable to read provided hex file. Could not update firmware.") + self.setFirmwareUpdateState(FirmwareUpdateState.firmware_not_found_error) + return + + programmer = stk500v2.Stk500v2() + programmer.progress_callback = self._onFirmwareProgress + + try: + programmer.connect(self._serial_port) + except: + programmer.close() + Logger.logException("e", "Failed to update firmware") + self.setFirmwareUpdateState(FirmwareUpdateState.communication_error) + return + + # Give programmer some time to connect. Might need more in some cases, but this worked in all tested cases. + sleep(1) + if not programmer.isConnected(): + Logger.log("e", "Unable to connect with serial. Could not update firmware") + self.setFirmwareUpdateState(FirmwareUpdateState.communication_error) + try: + programmer.programChip(hex_file) + except SerialException: + self.setFirmwareUpdateState(FirmwareUpdateState.io_error) + return + except: + self.setFirmwareUpdateState(FirmwareUpdateState.unknown_error) + return + + programmer.close() + + # Clean up for next attempt. + self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) + self._firmware_location = "" + self._onFirmwareProgress(100) + self.setFirmwareUpdateState(FirmwareUpdateState.completed) + + # Try to re-connect with the machine again, which must be done on the Qt thread, so we use call later. + CuraApplication.getInstance().callLater(self.connect) + + ## Show firmware interface. + # This will create the view if its not already created. + def showFirmwareInterface(self): + if self._firmware_view is None: + path = os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "FirmwareUpdateWindow.qml") + self._firmware_view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) + + self._firmware_view.show() + + @pyqtProperty(float, notify = firmwareProgressChanged) + def firmwareProgress(self): + return self._firmware_progress + + @pyqtProperty(int, notify=firmwareUpdateStateChanged) + def firmwareUpdateState(self): + return self._firmware_update_state + + def setFirmwareUpdateState(self, state): + if self._firmware_update_state != state: + self._firmware_update_state = state + self.firmwareUpdateStateChanged.emit() + + # Callback function for firmware update progress. + def _onFirmwareProgress(self, progress, max_progress = 100): + self._firmware_progress = (progress / max_progress) * 100 # Convert to scale of 0-100 + self.firmwareProgressChanged.emit() + + +class FirmwareUpdateState(IntEnum): + idle = 0 + updating = 1 + completed = 2 + unknown_error = 3 + communication_error = 4 + io_error = 5 + firmware_not_found_error = 6 + diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 45b566fcab..bc2350e50f 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -13,15 +13,14 @@ from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.GenericOutputController import GenericOutputController from .AutoDetectBaudJob import AutoDetectBaudJob -from .avr_isp import stk500v2, intelHex +from .AvrFirmwareUpdater import AvrFirmwareUpdater -from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty, QUrl +from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty from serial import Serial, SerialException, SerialTimeoutException from threading import Thread, Event from time import time, sleep from queue import Queue -from enum import IntEnum from typing import Union, Optional, List, cast import re @@ -32,9 +31,6 @@ catalog = i18nCatalog("cura") class USBPrinterOutputDevice(PrinterOutputDevice): - firmwareProgressChanged = pyqtSignal() - firmwareUpdateStateChanged = pyqtSignal() - def __init__(self, serial_port: str, baud_rate: Optional[int] = None) -> None: super().__init__(serial_port) self.setName(catalog.i18nc("@item:inmenu", "USB printing")) @@ -61,8 +57,6 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # Instead of using a timer, we really need the update to be as a thread, as reading from serial can block. self._update_thread = Thread(target=self._update, daemon = True) - self._update_firmware_thread = Thread(target=self._updateFirmware, daemon = True) - self._last_temperature_request = None # type: Optional[int] self._is_printing = False # A print is being sent. @@ -75,11 +69,6 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._paused = False - self._firmware_view = None - self._firmware_location = None - self._firmware_progress = 0 - self._firmware_update_state = FirmwareUpdateState.idle - self.setConnectionText(catalog.i18nc("@info:status", "Connected via USB")) # Queue for commands that need to be sent. @@ -88,6 +77,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._command_received = Event() self._command_received.set() + self._firmware_updater = AvrFirmwareUpdater(self) + CuraApplication.getInstance().getOnExitCallbackManager().addCallback(self._checkActivePrintingUponAppExit) # This is a callback function that checks if there is any printing in progress via USB when the application tries @@ -107,6 +98,10 @@ class USBPrinterOutputDevice(PrinterOutputDevice): application = CuraApplication.getInstance() application.triggerNextExitCheck() + @pyqtSlot(str) + def updateFirmware(self, file): + self._firmware_updater.updateFirmware(file) + ## Reset USB device settings # def resetDeviceSettings(self): @@ -135,93 +130,6 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._printGCode(gcode_list) - ## Show firmware interface. - # This will create the view if its not already created. - def showFirmwareInterface(self): - if self._firmware_view is None: - path = os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "FirmwareUpdateWindow.qml") - self._firmware_view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) - - self._firmware_view.show() - - @pyqtSlot(str) - def updateFirmware(self, file): - # the file path could be url-encoded. - if file.startswith("file://"): - self._firmware_location = QUrl(file).toLocalFile() - else: - self._firmware_location = file - self.showFirmwareInterface() - self.setFirmwareUpdateState(FirmwareUpdateState.updating) - self._update_firmware_thread.start() - - def _updateFirmware(self): - # Ensure that other connections are closed. - if self._connection_state != ConnectionState.closed: - self.close() - - try: - hex_file = intelHex.readHex(self._firmware_location) - assert len(hex_file) > 0 - except (FileNotFoundError, AssertionError): - Logger.log("e", "Unable to read provided hex file. Could not update firmware.") - self.setFirmwareUpdateState(FirmwareUpdateState.firmware_not_found_error) - return - - programmer = stk500v2.Stk500v2() - programmer.progress_callback = self._onFirmwareProgress - - try: - programmer.connect(self._serial_port) - except: - programmer.close() - Logger.logException("e", "Failed to update firmware") - self.setFirmwareUpdateState(FirmwareUpdateState.communication_error) - return - - # Give programmer some time to connect. Might need more in some cases, but this worked in all tested cases. - sleep(1) - if not programmer.isConnected(): - Logger.log("e", "Unable to connect with serial. Could not update firmware") - self.setFirmwareUpdateState(FirmwareUpdateState.communication_error) - try: - programmer.programChip(hex_file) - except SerialException: - self.setFirmwareUpdateState(FirmwareUpdateState.io_error) - return - except: - self.setFirmwareUpdateState(FirmwareUpdateState.unknown_error) - return - - programmer.close() - - # Clean up for next attempt. - self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) - self._firmware_location = "" - self._onFirmwareProgress(100) - self.setFirmwareUpdateState(FirmwareUpdateState.completed) - - # Try to re-connect with the machine again, which must be done on the Qt thread, so we use call later. - CuraApplication.getInstance().callLater(self.connect) - - @pyqtProperty(float, notify = firmwareProgressChanged) - def firmwareProgress(self): - return self._firmware_progress - - @pyqtProperty(int, notify=firmwareUpdateStateChanged) - def firmwareUpdateState(self): - return self._firmware_update_state - - def setFirmwareUpdateState(self, state): - if self._firmware_update_state != state: - self._firmware_update_state = state - self.firmwareUpdateStateChanged.emit() - - # Callback function for firmware update progress. - def _onFirmwareProgress(self, progress, max_progress = 100): - self._firmware_progress = (progress / max_progress) * 100 # Convert to scale of 0-100 - self.firmwareProgressChanged.emit() - ## Start a print based on a g-code. # \param gcode_list List with gcode (strings). def _printGCode(self, gcode_list: List[str]): @@ -456,13 +364,3 @@ class USBPrinterOutputDevice(PrinterOutputDevice): print_job.updateTimeTotal(estimated_time) self._gcode_position += 1 - - -class FirmwareUpdateState(IntEnum): - idle = 0 - updating = 1 - completed = 2 - unknown_error = 3 - communication_error = 4 - io_error = 5 - firmware_not_found_error = 6 From 339987be9d3a7cf80d7932c49cd418009e9182df Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 2 Aug 2018 11:50:28 +0200 Subject: [PATCH 002/212] Move hardcoded firmware-file table to definitions --- .../USBPrinterOutputDeviceManager.py | 44 ++++--------------- resources/definitions/bq_hephestos.def.json | 3 +- resources/definitions/bq_witbox.def.json | 3 +- resources/definitions/ultimaker2.def.json | 3 +- .../definitions/ultimaker2_extended.def.json | 3 +- .../ultimaker2_extended_plus.def.json | 3 +- resources/definitions/ultimaker2_go.def.json | 3 +- .../definitions/ultimaker2_plus.def.json | 3 +- .../definitions/ultimaker_original.def.json | 4 +- .../ultimaker_original_dual.def.json | 2 + .../ultimaker_original_plus.def.json | 3 +- 11 files changed, 30 insertions(+), 44 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 2ee85187ee..f444e72908 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -93,57 +93,31 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin): global_container_stack = self._application.getGlobalContainerStack() if not global_container_stack: Logger.log("e", "There is no global container stack. Can not update firmware.") - self._firmware_view.close() return "" # The bottom of the containerstack is the machine definition machine_id = global_container_stack.getBottom().id - machine_has_heated_bed = global_container_stack.getProperty("machine_heated_bed", "value") + baudrate = 250000 if platform.system() == "Linux": + # Linux prefers a baudrate of 115200 here because older versions of + # pySerial did not support a baudrate of 250000 baudrate = 115200 - else: - baudrate = 250000 - # NOTE: The keyword used here is the id of the machine. You can find the id of your machine in the *.json file, eg. - # https://github.com/Ultimaker/Cura/blob/master/resources/machines/ultimaker_original.json#L2 - # The *.hex files are stored at a seperate repository: - # https://github.com/Ultimaker/cura-binary-data/tree/master/cura/resources/firmware - machine_without_extras = {"bq_witbox" : "MarlinWitbox.hex", - "bq_hephestos_2" : "MarlinHephestos2.hex", - "ultimaker_original" : "MarlinUltimaker-{baudrate}.hex", - "ultimaker_original_plus" : "MarlinUltimaker-UMOP-{baudrate}.hex", - "ultimaker_original_dual" : "MarlinUltimaker-{baudrate}-dual.hex", - "ultimaker2" : "MarlinUltimaker2.hex", - "ultimaker2_go" : "MarlinUltimaker2go.hex", - "ultimaker2_plus" : "MarlinUltimaker2plus.hex", - "ultimaker2_extended" : "MarlinUltimaker2extended.hex", - "ultimaker2_extended_plus" : "MarlinUltimaker2extended-plus.hex", - } - machine_with_heated_bed = {"ultimaker_original" : "MarlinUltimaker-HBK-{baudrate}.hex", - "ultimaker_original_dual" : "MarlinUltimaker-HBK-{baudrate}-dual.hex", - } - ##TODO: Add check for multiple extruders - hex_file = None - if machine_id in machine_without_extras.keys(): # The machine needs to be defined here! - if machine_id in machine_with_heated_bed.keys() and machine_has_heated_bed: - Logger.log("d", "Choosing firmware with heated bed enabled for machine %s.", machine_id) - hex_file = machine_with_heated_bed[machine_id] # Return firmware with heated bed enabled - else: - Logger.log("d", "Choosing basic firmware for machine %s.", machine_id) - hex_file = machine_without_extras[machine_id] # Return "basic" firmware - else: - Logger.log("w", "There is no firmware for machine %s.", machine_id) + # If a firmware file is available, it should be specified in the definition for the printer + hex_file = global_container_stack.getMetaDataEntry("firmware_file", None) + if machine_has_heated_bed: + hex_file = global_container_stack.getMetaDataEntry("firmware_hbk_file", hex_file) if hex_file: try: return Resources.getPath(CuraApplication.ResourceTypes.Firmware, hex_file.format(baudrate=baudrate)) except FileNotFoundError: - Logger.log("w", "Could not find any firmware for machine %s.", machine_id) + Logger.log("w", "Firmware file %s not found.", hex_file) return "" else: - Logger.log("w", "Could not find any firmware for machine %s.", machine_id) + Logger.log("w", "There is no firmware for machine %s.", machine_id) return "" ## Helper to identify serial ports (and scan for them) diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json index 8dc67a8cad..be024cd6fa 100644 --- a/resources/definitions/bq_hephestos.def.json +++ b/resources/definitions/bq_hephestos.def.json @@ -12,7 +12,8 @@ "machine_extruder_trains": { "0": "bq_hephestos_extruder_0" - } + }, + "firmware_file": "MarlinHephestos2.hex" }, "overrides": { diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json index 0ae1c5e339..b96da6179c 100644 --- a/resources/definitions/bq_witbox.def.json +++ b/resources/definitions/bq_witbox.def.json @@ -12,7 +12,8 @@ "machine_extruder_trains": { "0": "bq_witbox_extruder_0" - } + }, + "firmware_file": "MarlinWitbox.hex" }, "overrides": { diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index aa684946c2..ca7a784bfc 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -20,7 +20,8 @@ "machine_extruder_trains": { "0": "ultimaker2_extruder_0" - } + }, + "firmware_file": "MarlinUltimaker2.hex" }, "overrides": { "machine_name": { "default_value": "Ultimaker 2" }, diff --git a/resources/definitions/ultimaker2_extended.def.json b/resources/definitions/ultimaker2_extended.def.json index af169c94fb..39a1ca37b3 100644 --- a/resources/definitions/ultimaker2_extended.def.json +++ b/resources/definitions/ultimaker2_extended.def.json @@ -14,7 +14,8 @@ "machine_extruder_trains": { "0": "ultimaker2_extended_extruder_0" - } + }, + "firmware_file": "MarlinUltimaker2extended.hex" }, "overrides": { diff --git a/resources/definitions/ultimaker2_extended_plus.def.json b/resources/definitions/ultimaker2_extended_plus.def.json index f3a8bfcf9f..c296ecd43e 100644 --- a/resources/definitions/ultimaker2_extended_plus.def.json +++ b/resources/definitions/ultimaker2_extended_plus.def.json @@ -14,7 +14,8 @@ "machine_extruder_trains": { "0": "ultimaker2_extended_plus_extruder_0" - } + }, + "firmware_file": "MarlinUltimaker2extended-plus.hex" }, "overrides": { diff --git a/resources/definitions/ultimaker2_go.def.json b/resources/definitions/ultimaker2_go.def.json index c66fb38fc0..5301fd7db9 100644 --- a/resources/definitions/ultimaker2_go.def.json +++ b/resources/definitions/ultimaker2_go.def.json @@ -17,7 +17,8 @@ "machine_extruder_trains": { "0": "ultimaker2_go_extruder_0" - } + }, + "firmware_file": "MarlinUltimaker2go.hex" }, "overrides": { diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json index bc4d3a6230..45019789bf 100644 --- a/resources/definitions/ultimaker2_plus.def.json +++ b/resources/definitions/ultimaker2_plus.def.json @@ -19,7 +19,8 @@ "machine_extruder_trains": { "0": "ultimaker2_plus_extruder_0" - } + }, + "firmware_file": "MarlinUltimaker2plus.hex" }, "overrides": { diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index c961423504..bb6a64d8dc 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -18,7 +18,9 @@ "machine_extruder_trains": { "0": "ultimaker_original_extruder_0" - } + }, + "firmware_file": "MarlinUltimaker-{baudrate}.hex", + "firmware_hbk_file": "MarlinUltimaker-HKB-{baudrate}.hex" }, "overrides": { diff --git a/resources/definitions/ultimaker_original_dual.def.json b/resources/definitions/ultimaker_original_dual.def.json index 55eddba85f..c6002ef396 100644 --- a/resources/definitions/ultimaker_original_dual.def.json +++ b/resources/definitions/ultimaker_original_dual.def.json @@ -19,6 +19,8 @@ "0": "ultimaker_original_dual_1st", "1": "ultimaker_original_dual_2nd" }, + "firmware_file": "MarlinUltimaker-{baudrate}-dual.hex", + "firmware_hbk_file": "MarlinUltimaker-HKB-{baudrate}-dual.hex", "first_start_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel"], "supported_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel", "UpgradeFirmware"] }, diff --git a/resources/definitions/ultimaker_original_plus.def.json b/resources/definitions/ultimaker_original_plus.def.json index 71aa53b2bf..46d95f8028 100644 --- a/resources/definitions/ultimaker_original_plus.def.json +++ b/resources/definitions/ultimaker_original_plus.def.json @@ -16,7 +16,8 @@ "machine_extruder_trains": { "0": "ultimaker_original_plus_extruder_0" - } + }, + "firmware_file": "MarlinUltimaker-UMOP-{baudrate}.hex" }, "overrides": { From bc0a53c15a51c3c4f6476f41c053cccd84bef1b8 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 6 Aug 2018 10:38:21 +0200 Subject: [PATCH 003/212] JSON fix: only enable skin settings when there is skin --- resources/definitions/fdmprinter.def.json | 29 ++++++++++++++++------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b767aac7b9..4b04e520b9 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -831,6 +831,7 @@ "default_value": 0.4, "type": "float", "value": "line_width", + "enabled": "top_layers > 0 or bottom_layers > 0", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true }, @@ -1177,6 +1178,7 @@ "zigzag": "Zig Zag" }, "default_value": "lines", + "enabled": "top_layers > 0 or bottom_layers > 0", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true }, @@ -1192,6 +1194,7 @@ "zigzag": "Zig Zag" }, "default_value": "lines", + "enabled": "top_layers > 0 or bottom_layers > 0", "value": "top_bottom_pattern", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true @@ -1202,7 +1205,7 @@ "description": "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality.", "type": "bool", "default_value": false, - "enabled": "top_bottom_pattern == 'concentric'", + "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern == 'concentric'", "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, @@ -1212,7 +1215,7 @@ "description": "A list of integer line directions to use when the top/bottom layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees).", "type": "[int]", "default_value": "[ ]", - "enabled": "top_bottom_pattern != 'concentric'", + "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true }, @@ -1439,6 +1442,7 @@ "description": "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting.", "type": "bool", "default_value": true, + "enabled": "top_layers > 0 or bottom_layers > 0", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true }, @@ -1450,6 +1454,7 @@ "minimum_value": "0", "maximum_value_warning": "10", "type": "int", + "enabled": "top_layers > 0 or bottom_layers > 0", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true }, @@ -1778,7 +1783,7 @@ "minimum_value_warning": "-50", "maximum_value_warning": "100", "value": "5 if top_bottom_pattern != 'concentric' else 0", - "enabled": "top_bottom_pattern != 'concentric'", + "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true, "children": @@ -1793,7 +1798,7 @@ "minimum_value_warning": "-0.5 * machine_nozzle_size", "maximum_value_warning": "machine_nozzle_size", "value": "0.5 * (skin_line_width + (wall_line_width_x if wall_line_count > 1 else wall_line_width_0)) * skin_overlap / 100 if top_bottom_pattern != 'concentric' else 0", - "enabled": "top_bottom_pattern != 'concentric'", + "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'", "settable_per_mesh": true } } @@ -1906,6 +1911,7 @@ "default_value": 0, "value": "wall_line_width_0 + (wall_line_count - 1) * wall_line_width_x", "minimum_value": "0", + "enabled": "top_layers > 0 or bottom_layers > 0", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true, "children": @@ -1919,6 +1925,7 @@ "default_value": 0, "value": "skin_preshrink", "minimum_value": "0", + "enabled": "top_layers > 0 or bottom_layers > 0", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true }, @@ -1931,6 +1938,7 @@ "default_value": 0, "value": "skin_preshrink", "minimum_value": "0", + "enabled": "top_layers > 0 or bottom_layers > 0", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true } @@ -1946,6 +1954,7 @@ "value": "wall_line_width_0 + (wall_line_count - 1) * wall_line_width_x", "minimum_value": "-skin_preshrink", "limit_to_extruder": "top_bottom_extruder_nr", + "enabled": "top_layers > 0 or bottom_layers > 0", "settable_per_mesh": true, "children": { @@ -1958,6 +1967,7 @@ "default_value": 2.8, "value": "expand_skins_expand_distance", "minimum_value": "-top_skin_preshrink", + "enabled": "top_layers > 0 or bottom_layers > 0", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true }, @@ -1970,6 +1980,7 @@ "default_value": 2.8, "value": "expand_skins_expand_distance", "minimum_value": "-bottom_skin_preshrink", + "enabled": "top_layers > 0 or bottom_layers > 0", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true } @@ -1985,7 +1996,7 @@ "minimum_value_warning": "2", "maximum_value": "90", "default_value": 90, - "enabled": "top_skin_expand_distance > 0 or bottom_skin_expand_distance > 0", + "enabled": "(top_layers > 0 or bottom_layers > 0) and (top_skin_expand_distance > 0 or bottom_skin_expand_distance > 0)", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true, "children": @@ -1999,7 +2010,7 @@ "default_value": 2.24, "value": "top_layers * layer_height / math.tan(math.radians(max_skin_angle_for_expansion))", "minimum_value": "0", - "enabled": "top_skin_expand_distance > 0 or bottom_skin_expand_distance > 0", + "enabled": "(top_layers > 0 or bottom_layers > 0) and (top_skin_expand_distance > 0 or bottom_skin_expand_distance > 0)", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true } @@ -2548,6 +2559,7 @@ "default_value": 30, "value": "speed_print / 2", "limit_to_extruder": "top_bottom_extruder_nr", + "enabled": "top_layers > 0 or bottom_layers > 0", "settable_per_mesh": true }, "speed_support": @@ -2872,6 +2884,7 @@ "default_value": 3000, "value": "acceleration_topbottom", "enabled": "resolveOrValue('acceleration_enabled') and roofing_layer_count > 0 and top_layers > 0", + "enabled": "top_layers > 0 or bottom_layers > 0", "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true }, @@ -3172,7 +3185,7 @@ "maximum_value_warning": "50", "default_value": 20, "value": "jerk_print", - "enabled": "resolveOrValue('jerk_enabled')", + "enabled": "(top_layers > 0 or bottom_layers > 0) and resolveOrValue('jerk_enabled')", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true }, @@ -5819,7 +5832,7 @@ "description": "Alternate the direction in which the top/bottom layers are printed. Normally they are printed diagonally only. This setting adds the X-only and Y-only directions.", "type": "bool", "default_value": false, - "enabled": "top_bottom_pattern != 'concentric'", + "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true }, From 688a5083d223b84067d9c4b6a7ccc301b6618db1 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 8 Aug 2018 15:53:26 +0200 Subject: [PATCH 004/212] Add canUpdateFirmware property to printer output devices --- cura/PrinterOutput/GenericOutputController.py | 2 ++ cura/PrinterOutput/PrinterOutputController.py | 1 + cura/PrinterOutput/PrinterOutputModel.py | 7 +++++++ plugins/USBPrinting/AvrFirmwareUpdater.py | 1 - .../UpgradeFirmwareMachineAction.qml | 1 + 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/cura/PrinterOutput/GenericOutputController.py b/cura/PrinterOutput/GenericOutputController.py index e6310e5bff..32ad9d8022 100644 --- a/cura/PrinterOutput/GenericOutputController.py +++ b/cura/PrinterOutput/GenericOutputController.py @@ -29,6 +29,8 @@ class GenericOutputController(PrinterOutputController): self._output_device.printersChanged.connect(self._onPrintersChanged) self._active_printer = None + self.can_update_firmware = True + def _onPrintersChanged(self): if self._active_printer: self._active_printer.stateChanged.disconnect(self._onPrinterStateChanged) diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index 58c6ef05a7..4fe5c04a65 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -18,6 +18,7 @@ class PrinterOutputController: self.can_pre_heat_hotends = True self.can_send_raw_gcode = True self.can_control_manually = True + self.can_update_firmware = False self._output_device = output_device def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOutputModel", temperature: int): diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 6fafa368bb..f43dbf570e 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -277,6 +277,13 @@ class PrinterOutputModel(QObject): return self._controller.can_control_manually return False + # Does the printer support upgrading firmware + @pyqtProperty(bool, notify = canUpdateFirmwareChanged) + def canUpdateFirmware(self): + if self._controller: + return self._controller.can_update_firmware + return False + # Returns the configuration (material, variant and buildplate) of the current printer @pyqtProperty(QObject, notify = configurationChanged) def printerConfiguration(self): diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py index 5c2b8dc19e..681601e3a5 100644 --- a/plugins/USBPrinting/AvrFirmwareUpdater.py +++ b/plugins/USBPrinting/AvrFirmwareUpdater.py @@ -9,7 +9,6 @@ from .avr_isp import stk500v2, intelHex from enum import IntEnum -@signalemitter class AvrFirmwareUpdater(QObject): firmwareProgressChanged = pyqtSignal() firmwareUpdateStateChanged = pyqtSignal() diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml index ed771d2a04..03c17cd811 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml @@ -16,6 +16,7 @@ Cura.MachineAction anchors.fill: parent; property bool printerConnected: Cura.MachineManager.printerConnected property var activeOutputDevice: printerConnected ? Cura.MachineManager.printerOutputDevices[0] : null + property var canUpdateFirmware: activeOutputDevice ? activeOutputDevice.canUpdateFirmware : False Item { From b9f1f8c400372bfe4782e7a2fd4d4e0cbefb527f Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Mon, 20 Aug 2018 09:48:59 +0100 Subject: [PATCH 005/212] Add machine_extruder_cooling_fan_number setting to specify print cooling fan for each extruder. --- resources/definitions/fdmextruder.def.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json index 3f84ed69a4..19c9e92d18 100644 --- a/resources/definitions/fdmextruder.def.json +++ b/resources/definitions/fdmextruder.def.json @@ -178,7 +178,19 @@ "maximum_value": "machine_height", "settable_per_mesh": false, "settable_per_extruder": true - } + }, + "machine_extruder_cooling_fan_number": + { + "label": "Extruder Print Cooling Fan", + "description": "The number of the print cooling fan associated with this extruder. Only change this from the default value of 0 when you have a different print cooling fan for each extruder.", + "type": "int", + "default_value": 0, + "minimum_value": "0", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "setttable_globally": false + } } }, "platform_adhesion": From a0787a03ea11f149feb897c7d74d20c210cb50f8 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Mon, 20 Aug 2018 09:49:31 +0100 Subject: [PATCH 006/212] Added extruder setting field for cooling fan number. --- .../MachineSettingsAction/MachineSettingsAction.qml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index b12f8f8696..c9b47ba3c0 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -433,6 +433,18 @@ Cura.MachineAction property bool allowNegative: true } + Loader + { + id: extruderCoolingFanNumberField + sourceComponent: numericTextFieldWithUnit + property string settingKey: "machine_extruder_cooling_fan_number" + property string label: catalog.i18nc("@label", "Cooling Fan Number") + property string unit: catalog.i18nc("@label", "") + property bool isExtruderSetting: true + property bool forceUpdateOnChange: true + property bool allowNegative: false + } + Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } Row From 4bea1410b8ca194ed64dec4f53864c89b84667e8 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 22 Aug 2018 14:37:48 +0200 Subject: [PATCH 007/212] Allow printer output devices to set their ability to update firmware --- cura/PrinterOutput/GenericOutputController.py | 2 -- cura/PrinterOutput/PrinterOutputController.py | 7 ++++ cura/PrinterOutput/PrinterOutputModel.py | 6 ++++ plugins/USBPrinting/USBPrinterOutputDevice.py | 8 +++-- .../UpgradeFirmwareMachineAction.qml | 34 ++++++++++++------- 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/cura/PrinterOutput/GenericOutputController.py b/cura/PrinterOutput/GenericOutputController.py index 32ad9d8022..e6310e5bff 100644 --- a/cura/PrinterOutput/GenericOutputController.py +++ b/cura/PrinterOutput/GenericOutputController.py @@ -29,8 +29,6 @@ class GenericOutputController(PrinterOutputController): self._output_device.printersChanged.connect(self._onPrintersChanged) self._active_printer = None - self.can_update_firmware = True - def _onPrintersChanged(self): if self._active_printer: self._active_printer.stateChanged.disconnect(self._onPrinterStateChanged) diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index 4fe5c04a65..eb5f15cceb 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. from UM.Logger import Logger +from UM.Signal import Signal MYPY = False if MYPY: @@ -56,3 +57,9 @@ class PrinterOutputController: def sendRawCommand(self, printer: "PrinterOutputModel", command: str): Logger.log("w", "Custom command not implemented in controller") + + canUpdateFirmwareChanged = Signal() + def setCanUpdateFirmware(self, can_update_firmware: bool): + if can_update_firmware != self.can_update_firmware: + self.can_update_firmware = can_update_firmware + self.canUpdateFirmwareChanged.emit() \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 252fc35080..5d63f6f1ce 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -26,6 +26,7 @@ class PrinterOutputModel(QObject): buildplateChanged = pyqtSignal() cameraChanged = pyqtSignal() configurationChanged = pyqtSignal() + canUpdateFirmwareChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None, firmware_version = "") -> None: super().__init__(parent) @@ -34,6 +35,7 @@ class PrinterOutputModel(QObject): self._name = "" self._key = "" # Unique identifier self._controller = output_controller + self._controller.canUpdateFirmwareChanged.connect(self._onControllerCanUpdateFirmwareChanged) self._extruders = [ExtruderOutputModel(printer = self, position = i) for i in range(number_of_extruders)] self._printer_configuration = ConfigurationModel() # Indicates the current configuration setup in this printer self._head_position = Vector(0, 0, 0) @@ -284,6 +286,10 @@ class PrinterOutputModel(QObject): return self._controller.can_update_firmware return False + # Stub to connect UM.Signal to pyqtSignal + def _onControllerCanUpdateFirmwareChanged(self): + self.canUpdateFirmwareChanged.emit() + # Returns the configuration (material, variant and buildplate) of the current printer @pyqtProperty(QObject, notify = configurationChanged) def printerConfiguration(self): diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index bc2350e50f..957269f155 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -183,7 +183,9 @@ class USBPrinterOutputDevice(PrinterOutputDevice): container_stack = CuraApplication.getInstance().getGlobalContainerStack() num_extruders = container_stack.getProperty("machine_extruder_count", "value") # Ensure that a printer is created. - self._printers = [PrinterOutputModel(output_controller=GenericOutputController(self), number_of_extruders=num_extruders)] + controller = GenericOutputController(self) + controller.setCanUpdateFirmware(True) + self._printers = [PrinterOutputModel(output_controller=controller, number_of_extruders=num_extruders)] self._printers[0].updateName(container_stack.getName()) self.setConnectionState(ConnectionState.connected) self._update_thread.start() @@ -353,7 +355,9 @@ class USBPrinterOutputDevice(PrinterOutputDevice): elapsed_time = int(time() - self._print_start_time) print_job = self._printers[0].activePrintJob if print_job is None: - print_job = PrintJobOutputModel(output_controller = GenericOutputController(self), name= CuraApplication.getInstance().getPrintInformation().jobName) + controller = GenericOutputController(self) + controller.setCanUpdateFirmware(True) + print_job = PrintJobOutputModel(output_controller = controller, name= CuraApplication.getInstance().getPrintInformation().jobName) print_job.updateState("printing") self._printers[0].updateActivePrintJob(print_job) diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml index 03c17cd811..7c15c303b5 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml @@ -16,17 +16,17 @@ Cura.MachineAction anchors.fill: parent; property bool printerConnected: Cura.MachineManager.printerConnected property var activeOutputDevice: printerConnected ? Cura.MachineManager.printerOutputDevices[0] : null - property var canUpdateFirmware: activeOutputDevice ? activeOutputDevice.canUpdateFirmware : False + property var canUpdateFirmware: activeOutputDevice ? activeOutputDevice.activePrinter.canUpdateFirmware : False - Item + Column { id: upgradeFirmwareMachineAction anchors.fill: parent; UM.I18nCatalog { id: catalog; name:"cura"} + spacing: UM.Theme.getSize("default_margin").height Label { - id: pageTitle width: parent.width text: catalog.i18nc("@title", "Upgrade Firmware") wrapMode: Text.WordWrap @@ -34,9 +34,6 @@ Cura.MachineAction } Label { - id: pageDescription - anchors.top: pageTitle.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height width: parent.width wrapMode: Text.WordWrap text: catalog.i18nc("@label", "Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates the temperature and ultimately makes your printer work.") @@ -44,9 +41,6 @@ Cura.MachineAction Label { - id: upgradeText1 - anchors.top: pageDescription.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height width: parent.width wrapMode: Text.WordWrap text: catalog.i18nc("@label", "The firmware shipping with new printers works, but new versions tend to have more features and improvements."); @@ -54,8 +48,6 @@ Cura.MachineAction Row { - anchors.top: upgradeText1.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.horizontalCenter: parent.horizontalCenter width: childrenRect.width spacing: UM.Theme.getSize("default_margin").width @@ -64,7 +56,7 @@ Cura.MachineAction { id: autoUpgradeButton text: catalog.i18nc("@action:button", "Automatically upgrade Firmware"); - enabled: parent.firmwareName != "" && activeOutputDevice + enabled: parent.firmwareName != "" && canUpdateFirmware onClicked: { activeOutputDevice.updateFirmware(parent.firmwareName) @@ -74,7 +66,7 @@ Cura.MachineAction { id: manualUpgradeButton text: catalog.i18nc("@action:button", "Upload custom Firmware"); - enabled: activeOutputDevice != null + enabled: canUpdateFirmware onClicked: { customFirmwareDialog.open() @@ -82,6 +74,22 @@ Cura.MachineAction } } + Label + { + width: parent.width + wrapMode: Text.WordWrap + visible: !printerConnected + text: catalog.i18nc("@label", "Firmware can not be upgraded because there is no connection with the printer."); + } + + Label + { + width: parent.width + wrapMode: Text.WordWrap + visible: printerConnected && !canUpdateFirmware + text: catalog.i18nc("@label", "Firmware can not be upgraded because the connection with the printer does not support upgrading firmware."); + } + FileDialog { id: customFirmwareDialog From 5f81c6d1f4a0c7f52feaa0d860946a90d762ee82 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 22 Aug 2018 15:21:03 +0200 Subject: [PATCH 008/212] Add a FirmwareUpdater class and make AvrFirmwareUpdater a subclass --- cura/FirmwareUpdater.py | 81 +++++++++++++++++++ plugins/USBPrinting/AvrFirmwareUpdater.py | 77 +----------------- .../qml}/FirmwareUpdateWindow.qml | 0 3 files changed, 85 insertions(+), 73 deletions(-) create mode 100644 cura/FirmwareUpdater.py rename {plugins/USBPrinting => resources/qml}/FirmwareUpdateWindow.qml (100%) diff --git a/cura/FirmwareUpdater.py b/cura/FirmwareUpdater.py new file mode 100644 index 0000000000..ca5997bfb1 --- /dev/null +++ b/cura/FirmwareUpdater.py @@ -0,0 +1,81 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import QObject, QUrl, pyqtSignal, pyqtProperty + +from UM.Resources import Resources +from cura.PrinterOutputDevice import PrinterOutputDevice + +from enum import IntEnum + +class FirmwareUpdater(QObject): + firmwareProgressChanged = pyqtSignal() + firmwareUpdateStateChanged = pyqtSignal() + + def __init__(self, output_device: PrinterOutputDevice) -> None: + self._output_device = output_device + + self._update_firmware_thread = Thread(target=self._updateFirmware, daemon = True) + + self._firmware_view = None + self._firmware_location = None + self._firmware_progress = 0 + self._firmware_update_state = FirmwareUpdateState.idle + + def updateFirmware(self, file): + # the file path could be url-encoded. + if file.startswith("file://"): + self._firmware_location = QUrl(file).toLocalFile() + else: + self._firmware_location = file + self.showFirmwareInterface() + self.setFirmwareUpdateState(FirmwareUpdateState.updating) + self._update_firmware_thread.start() + + def _updateFirmware(self): + raise NotImplementedError("_updateFirmware needs to be implemented") + + def cleanupAfterUpdate(self): + # Clean up for next attempt. + self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) + self._firmware_location = "" + self._onFirmwareProgress(100) + self.setFirmwareUpdateState(FirmwareUpdateState.completed) + + ## Show firmware interface. + # This will create the view if its not already created. + def showFirmwareInterface(self): + if self._firmware_view is None: + path = Resources.getPath(self.ResourceTypes.QmlFiles, "FirmwareUpdateWindow.qml") + self._firmware_view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) + + self._firmware_view.show() + + @pyqtProperty(float, notify = firmwareProgressChanged) + def firmwareProgress(self): + return self._firmware_progress + + @pyqtProperty(int, notify=firmwareUpdateStateChanged) + def firmwareUpdateState(self): + return self._firmware_update_state + + def setFirmwareUpdateState(self, state): + if self._firmware_update_state != state: + self._firmware_update_state = state + self.firmwareUpdateStateChanged.emit() + + # Callback function for firmware update progress. + def _onFirmwareProgress(self, progress, max_progress = 100): + self._firmware_progress = (progress / max_progress) * 100 # Convert to scale of 0-100 + self.firmwareProgressChanged.emit() + + +class FirmwareUpdateState(IntEnum): + idle = 0 + updating = 1 + completed = 2 + unknown_error = 3 + communication_error = 4 + io_error = 5 + firmware_not_found_error = 6 + diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py index 681601e3a5..d3028be0e4 100644 --- a/plugins/USBPrinting/AvrFirmwareUpdater.py +++ b/plugins/USBPrinting/AvrFirmwareUpdater.py @@ -1,43 +1,16 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from PyQt5.QtCore import QObject, QUrl, pyqtSignal, pyqtProperty - from cura.PrinterOutputDevice import PrinterOutputDevice +from cura.FirmwareUpdater import FirmwareUpdater, FirmwareUpdateState from .avr_isp import stk500v2, intelHex -from enum import IntEnum - -class AvrFirmwareUpdater(QObject): - firmwareProgressChanged = pyqtSignal() - firmwareUpdateStateChanged = pyqtSignal() - +class AvrFirmwareUpdater(FirmwareUpdater): def __init__(self, output_device: PrinterOutputDevice) -> None: - self._output_device = output_device - - self._update_firmware_thread = Thread(target=self._updateFirmware, daemon = True) - - self._firmware_view = None - self._firmware_location = None - self._firmware_progress = 0 - self._firmware_update_state = FirmwareUpdateState.idle - - def updateFirmware(self, file): - # the file path could be url-encoded. - if file.startswith("file://"): - self._firmware_location = QUrl(file).toLocalFile() - else: - self._firmware_location = file - self.showFirmwareInterface() - self.setFirmwareUpdateState(FirmwareUpdateState.updating) - self._update_firmware_thread.start() + super().__init__(output_device) def _updateFirmware(self): - # Ensure that other connections are closed. - if self._connection_state != ConnectionState.closed: - self.close() - try: hex_file = intelHex.readHex(self._firmware_location) assert len(hex_file) > 0 @@ -73,49 +46,7 @@ class AvrFirmwareUpdater(QObject): programmer.close() - # Clean up for next attempt. - self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) - self._firmware_location = "" - self._onFirmwareProgress(100) - self.setFirmwareUpdateState(FirmwareUpdateState.completed) - # Try to re-connect with the machine again, which must be done on the Qt thread, so we use call later. CuraApplication.getInstance().callLater(self.connect) - ## Show firmware interface. - # This will create the view if its not already created. - def showFirmwareInterface(self): - if self._firmware_view is None: - path = os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "FirmwareUpdateWindow.qml") - self._firmware_view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) - - self._firmware_view.show() - - @pyqtProperty(float, notify = firmwareProgressChanged) - def firmwareProgress(self): - return self._firmware_progress - - @pyqtProperty(int, notify=firmwareUpdateStateChanged) - def firmwareUpdateState(self): - return self._firmware_update_state - - def setFirmwareUpdateState(self, state): - if self._firmware_update_state != state: - self._firmware_update_state = state - self.firmwareUpdateStateChanged.emit() - - # Callback function for firmware update progress. - def _onFirmwareProgress(self, progress, max_progress = 100): - self._firmware_progress = (progress / max_progress) * 100 # Convert to scale of 0-100 - self.firmwareProgressChanged.emit() - - -class FirmwareUpdateState(IntEnum): - idle = 0 - updating = 1 - completed = 2 - unknown_error = 3 - communication_error = 4 - io_error = 5 - firmware_not_found_error = 6 - + self.cleanupAfterUpdate() diff --git a/plugins/USBPrinting/FirmwareUpdateWindow.qml b/resources/qml/FirmwareUpdateWindow.qml similarity index 100% rename from plugins/USBPrinting/FirmwareUpdateWindow.qml rename to resources/qml/FirmwareUpdateWindow.qml From 7b00d6879a5cd197f220e2351686e40d71dcb1d4 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 22 Aug 2018 15:44:11 +0200 Subject: [PATCH 009/212] Factor out USBPrinterManager singleton --- cura/Settings/MachineManager.py | 34 ++++++++++++++++++ .../USBPrinterOutputDeviceManager.py | 35 ------------------- plugins/USBPrinting/__init__.py | 1 - .../UMOCheckupMachineAction.qml | 32 ++++++++--------- .../UpgradeFirmwareMachineAction.qml | 2 +- 5 files changed, 51 insertions(+), 53 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index d65bbfddd9..f330d70225 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -4,6 +4,7 @@ import collections import time from typing import Any, Callable, List, Dict, TYPE_CHECKING, Optional, cast +import platform from UM.ConfigurationErrorMessage import ConfigurationErrorMessage from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator @@ -16,6 +17,7 @@ from UM.FlameProfiler import pyqtSlot from UM import Util from UM.Logger import Logger from UM.Message import Message +from UM.Resources import Resources from UM.Settings.SettingFunction import SettingFunction from UM.Signal import postponeSignals, CompressTechnique @@ -1531,3 +1533,35 @@ class MachineManager(QObject): with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): self.updateMaterialWithVariant(None) self._updateQualityWithMaterial() + + ## Get default firmware file name if one is specified in the firmware + @pyqtSlot(result = str) + def getDefaultFirmwareName(self): + # Check if there is a valid global container stack + if not self._global_container_stack: + return "" + + # The bottom of the containerstack is the machine definition + machine_id = self._global_container_stack.getBottom().id + machine_has_heated_bed = self._global_container_stack.getProperty("machine_heated_bed", "value") + + baudrate = 250000 + if platform.system() == "Linux": + # Linux prefers a baudrate of 115200 here because older versions of + # pySerial did not support a baudrate of 250000 + baudrate = 115200 + + # If a firmware file is available, it should be specified in the definition for the printer + hex_file = self._global_container_stack.getMetaDataEntry("firmware_file", None) + if machine_has_heated_bed: + hex_file = self._global_container_stack.getMetaDataEntry("firmware_hbk_file", hex_file) + + if hex_file: + try: + return Resources.getPath(cura.CuraApplication.CuraApplication.ResourceTypes.Firmware, hex_file.format(baudrate=baudrate)) + except FileNotFoundError: + Logger.log("w", "Firmware file %s not found.", hex_file) + return "" + else: + Logger.log("w", "There is no firmware for machine %s.", machine_id) + return "" diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index f444e72908..bd207d9d96 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -2,14 +2,12 @@ # Cura is released under the terms of the LGPLv3 or higher. import threading -import platform import time import serial.tools.list_ports from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from UM.Logger import Logger -from UM.Resources import Resources from UM.Signal import Signal, signalemitter from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin from UM.i18n import i18nCatalog @@ -87,39 +85,6 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin): self._addRemovePorts(port_list) time.sleep(5) - @pyqtSlot(result = str) - def getDefaultFirmwareName(self): - # Check if there is a valid global container stack - global_container_stack = self._application.getGlobalContainerStack() - if not global_container_stack: - Logger.log("e", "There is no global container stack. Can not update firmware.") - return "" - - # The bottom of the containerstack is the machine definition - machine_id = global_container_stack.getBottom().id - machine_has_heated_bed = global_container_stack.getProperty("machine_heated_bed", "value") - - baudrate = 250000 - if platform.system() == "Linux": - # Linux prefers a baudrate of 115200 here because older versions of - # pySerial did not support a baudrate of 250000 - baudrate = 115200 - - # If a firmware file is available, it should be specified in the definition for the printer - hex_file = global_container_stack.getMetaDataEntry("firmware_file", None) - if machine_has_heated_bed: - hex_file = global_container_stack.getMetaDataEntry("firmware_hbk_file", hex_file) - - if hex_file: - try: - return Resources.getPath(CuraApplication.ResourceTypes.Firmware, hex_file.format(baudrate=baudrate)) - except FileNotFoundError: - Logger.log("w", "Firmware file %s not found.", hex_file) - return "" - else: - Logger.log("w", "There is no firmware for machine %s.", machine_id) - return "" - ## Helper to identify serial ports (and scan for them) def _addRemovePorts(self, serial_ports): # First, find and add all new or changed keys diff --git a/plugins/USBPrinting/__init__.py b/plugins/USBPrinting/__init__.py index fd5488eead..0cb68d3865 100644 --- a/plugins/USBPrinting/__init__.py +++ b/plugins/USBPrinting/__init__.py @@ -14,5 +14,4 @@ def getMetaData(): def register(app): # We are violating the QT API here (as we use a factory, which is technically not allowed). # but we don't really have another means for doing this (and it seems to you know -work-) - qmlRegisterSingletonType(USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager, "Cura", 1, 0, "USBPrinterManager", USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager.getInstance) return {"output_device": USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager(app)} diff --git a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml index b92638aa12..4a1d42e248 100644 --- a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml +++ b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml @@ -17,7 +17,7 @@ Cura.MachineAction property int rightRow: (checkupMachineAction.width * 0.60) | 0 property bool heatupHotendStarted: false property bool heatupBedStarted: false - property bool usbConnected: Cura.USBPrinterManager.connectedPrinterList.rowCount() > 0 + property bool printerConnected: Cura.MachineManager.printerConnected UM.I18nCatalog { id: catalog; name:"cura"} Label @@ -86,7 +86,7 @@ Cura.MachineAction anchors.left: connectionLabel.right anchors.top: parent.top wrapMode: Text.WordWrap - text: checkupMachineAction.usbConnected ? catalog.i18nc("@info:status","Connected"): catalog.i18nc("@info:status","Not connected") + text: checkupMachineAction.printerConnected ? catalog.i18nc("@info:status","Connected"): catalog.i18nc("@info:status","Not connected") } ////////////////////////////////////////////////////////// Label @@ -97,7 +97,7 @@ Cura.MachineAction anchors.top: connectionLabel.bottom wrapMode: Text.WordWrap text: catalog.i18nc("@label","Min endstop X: ") - visible: checkupMachineAction.usbConnected + visible: checkupMachineAction.printerConnected } Label { @@ -107,7 +107,7 @@ Cura.MachineAction anchors.top: connectionLabel.bottom wrapMode: Text.WordWrap text: manager.xMinEndstopTestCompleted ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") - visible: checkupMachineAction.usbConnected + visible: checkupMachineAction.printerConnected } ////////////////////////////////////////////////////////////// Label @@ -118,7 +118,7 @@ Cura.MachineAction anchors.top: endstopXLabel.bottom wrapMode: Text.WordWrap text: catalog.i18nc("@label","Min endstop Y: ") - visible: checkupMachineAction.usbConnected + visible: checkupMachineAction.printerConnected } Label { @@ -128,7 +128,7 @@ Cura.MachineAction anchors.top: endstopXLabel.bottom wrapMode: Text.WordWrap text: manager.yMinEndstopTestCompleted ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") - visible: checkupMachineAction.usbConnected + visible: checkupMachineAction.printerConnected } ///////////////////////////////////////////////////////////////////// Label @@ -139,7 +139,7 @@ Cura.MachineAction anchors.top: endstopYLabel.bottom wrapMode: Text.WordWrap text: catalog.i18nc("@label","Min endstop Z: ") - visible: checkupMachineAction.usbConnected + visible: checkupMachineAction.printerConnected } Label { @@ -149,7 +149,7 @@ Cura.MachineAction anchors.top: endstopYLabel.bottom wrapMode: Text.WordWrap text: manager.zMinEndstopTestCompleted ? catalog.i18nc("@info:status","Works") : catalog.i18nc("@info:status","Not checked") - visible: checkupMachineAction.usbConnected + visible: checkupMachineAction.printerConnected } //////////////////////////////////////////////////////////// Label @@ -161,7 +161,7 @@ Cura.MachineAction anchors.top: endstopZLabel.bottom wrapMode: Text.WordWrap text: catalog.i18nc("@label","Nozzle temperature check: ") - visible: checkupMachineAction.usbConnected + visible: checkupMachineAction.printerConnected } Label { @@ -171,7 +171,7 @@ Cura.MachineAction anchors.left: nozzleTempLabel.right wrapMode: Text.WordWrap text: catalog.i18nc("@info:status","Not checked") - visible: checkupMachineAction.usbConnected + visible: checkupMachineAction.printerConnected } Item { @@ -181,7 +181,7 @@ Cura.MachineAction anchors.top: nozzleTempLabel.top anchors.left: bedTempStatus.right anchors.leftMargin: Math.round(UM.Theme.getSize("default_margin").width/2) - visible: checkupMachineAction.usbConnected + visible: checkupMachineAction.printerConnected Button { text: checkupMachineAction.heatupHotendStarted ? catalog.i18nc("@action:button","Stop Heating") : catalog.i18nc("@action:button","Start Heating") @@ -209,7 +209,7 @@ Cura.MachineAction wrapMode: Text.WordWrap text: manager.hotendTemperature + "°C" font.bold: true - visible: checkupMachineAction.usbConnected + visible: checkupMachineAction.printerConnected } ///////////////////////////////////////////////////////////////////////////// Label @@ -221,7 +221,7 @@ Cura.MachineAction anchors.top: nozzleTempLabel.bottom wrapMode: Text.WordWrap text: catalog.i18nc("@label","Build plate temperature check:") - visible: checkupMachineAction.usbConnected && manager.hasHeatedBed + visible: checkupMachineAction.printerConnected && manager.hasHeatedBed } Label @@ -232,7 +232,7 @@ Cura.MachineAction anchors.left: bedTempLabel.right wrapMode: Text.WordWrap text: manager.bedTestCompleted ? catalog.i18nc("@info:status","Not checked"): catalog.i18nc("@info:status","Checked") - visible: checkupMachineAction.usbConnected && manager.hasHeatedBed + visible: checkupMachineAction.printerConnected && manager.hasHeatedBed } Item { @@ -242,7 +242,7 @@ Cura.MachineAction anchors.top: bedTempLabel.top anchors.left: bedTempStatus.right anchors.leftMargin: Math.round(UM.Theme.getSize("default_margin").width/2) - visible: checkupMachineAction.usbConnected && manager.hasHeatedBed + visible: checkupMachineAction.printerConnected && manager.hasHeatedBed Button { text: checkupMachineAction.heatupBedStarted ?catalog.i18nc("@action:button","Stop Heating") : catalog.i18nc("@action:button","Start Heating") @@ -270,7 +270,7 @@ Cura.MachineAction wrapMode: Text.WordWrap text: manager.bedTemperature + "°C" font.bold: true - visible: checkupMachineAction.usbConnected && manager.hasHeatedBed + visible: checkupMachineAction.printerConnected && manager.hasHeatedBed } Label { diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml index 7c15c303b5..0d12f72a0a 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml @@ -51,7 +51,7 @@ Cura.MachineAction anchors.horizontalCenter: parent.horizontalCenter width: childrenRect.width spacing: UM.Theme.getSize("default_margin").width - property var firmwareName: Cura.USBPrinterManager.getDefaultFirmwareName() + property var firmwareName: Cura.MachineManager.getDefaultFirmwareName() Button { id: autoUpgradeButton From 5d5223920194e20108d7666e7ce6c8350323728e Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 24 Aug 2018 09:09:49 +0200 Subject: [PATCH 010/212] Code style --- plugins/USBPrinting/USBPrinterOutputDevice.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 957269f155..18373d34d2 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -205,6 +205,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._command_queue.put(command) else: self._sendCommand(command) + def _sendCommand(self, command: Union[str, bytes]): if self._serial is None or self._connection_state != ConnectionState.connected: return From 77f99ecf20a6f70662ba0304366567d602e411dc Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 24 Aug 2018 15:48:11 +0200 Subject: [PATCH 011/212] Moved FirmwareUpdater to cura.PrinterOutput --- cura/{ => PrinterOutput}/FirmwareUpdater.py | 0 plugins/USBPrinting/AvrFirmwareUpdater.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename cura/{ => PrinterOutput}/FirmwareUpdater.py (100%) diff --git a/cura/FirmwareUpdater.py b/cura/PrinterOutput/FirmwareUpdater.py similarity index 100% rename from cura/FirmwareUpdater.py rename to cura/PrinterOutput/FirmwareUpdater.py diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py index d3028be0e4..171c81d557 100644 --- a/plugins/USBPrinting/AvrFirmwareUpdater.py +++ b/plugins/USBPrinting/AvrFirmwareUpdater.py @@ -2,7 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. from cura.PrinterOutputDevice import PrinterOutputDevice -from cura.FirmwareUpdater import FirmwareUpdater, FirmwareUpdateState +from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdater, FirmwareUpdateState from .avr_isp import stk500v2, intelHex From 6dbf0a5fb705f36547c794c42ea7d8c3c69a4fa0 Mon Sep 17 00:00:00 2001 From: Amanda de Castilho Date: Wed, 29 Aug 2018 00:39:13 -0700 Subject: [PATCH 012/212] Create DisplayFilenameAndLayerOnLCD This plugin inserts M117 into the g-code so that the filename is displayed on the LCD and updates at each layer to display the current layer --- .../scripts/DisplayFilenameAndLayerOnLCD | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD diff --git a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD new file mode 100644 index 0000000000..f7ddd01e1e --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD @@ -0,0 +1,50 @@ +# Cura PostProcessingPlugin +# Author: Amanda de Castilho +# Date: August 28, 2018 + +# Description: This plugin inserts a line at the start of each layer, +# M117 displays the filename and layer height to the LCD +# ** user must enter 'filename' +# ** future update: include actual filename + +from ..Script import Script + +class DisplayFilenameAndLayerOnLCD(Script): + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name": "Display filename and layer on LCD", + "key": "DisplayFilenameAndLayerOnLCD", + "metadata": {}, + "version": 2, + "settings": + { + "name": + { + "label": "filename", + "description": "Enter filename", + "type": "str", + "default_value": "default" + } + } + }""" + + def execute(self, data): + name = self.getSettingValueByKey("name") + lcd_text = "M117 " + name + " layer: " + i = 0 + for layer in data: + display_text = lcd_text + str(i) + layer_index = data.index(layer) + lines = layer.split("\n") + for line in lines: + if line.startswith(";LAYER:"): + line_index = lines.index(line) + lines.insert(line_index + 1, display_text) + i += 1 + final_lines = "\n".join(lines) + data[layer_index] = final_lines + + return data From a5baa9008637b7f28a9c5c198671f8bb492c2930 Mon Sep 17 00:00:00 2001 From: Amanda de Castilho Date: Wed, 29 Aug 2018 08:09:57 -0700 Subject: [PATCH 013/212] Rename DisplayFilenameAndLayerOnLCD to DisplayFilenameAndLayerOnLCD.py added the .py extention --- ...splayFilenameAndLayerOnLCD => DisplayFilenameAndLayerOnLCD.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename plugins/PostProcessingPlugin/scripts/{DisplayFilenameAndLayerOnLCD => DisplayFilenameAndLayerOnLCD.py} (100%) diff --git a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py similarity index 100% rename from plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD rename to plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py From f7fbc685d8ffa8ebebc7aa887e4045a6a373d2d8 Mon Sep 17 00:00:00 2001 From: Amanda de Castilho Date: Wed, 29 Aug 2018 08:43:16 -0700 Subject: [PATCH 014/212] Update DisplayFilenameAndLayerOnLCD.py changed so that actual filename is displayed (or alternatively user can enter text to display) to LCD during print --- .../scripts/DisplayFilenameAndLayerOnLCD.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py index f7ddd01e1e..2ae07f914c 100644 --- a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py +++ b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py @@ -3,11 +3,11 @@ # Date: August 28, 2018 # Description: This plugin inserts a line at the start of each layer, -# M117 displays the filename and layer height to the LCD -# ** user must enter 'filename' -# ** future update: include actual filename +# M117 - displays the filename and layer height to the LCD +# Alternatively, user can override the filename to display alt text + layer height -from ..Script import Script +..Script import Script +from UM.Application import Application class DisplayFilenameAndLayerOnLCD(Script): def __init__(self): @@ -23,16 +23,19 @@ class DisplayFilenameAndLayerOnLCD(Script): { "name": { - "label": "filename", - "description": "Enter filename", + "label": "text to display:", + "description": "By default the current filename will be displayed on the LCD. Enter text here to override the filename and display something else.", "type": "str", - "default_value": "default" + "default_value": "" } } }""" def execute(self, data): - name = self.getSettingValueByKey("name") + if self.getSettingValueByKey("name") != "": + name = self.getSettingValueByKey("name") + else: + name = Application.getInstance().getPrintInformation().jobName lcd_text = "M117 " + name + " layer: " i = 0 for layer in data: From 7e7f2aab6b9846ca9235d302250308c50c94a10c Mon Sep 17 00:00:00 2001 From: Amanda de Castilho Date: Wed, 29 Aug 2018 09:48:37 -0700 Subject: [PATCH 015/212] Update DisplayFilenameAndLayerOnLCD.py --- .../scripts/DisplayFilenameAndLayerOnLCD.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py index 2ae07f914c..9fd9e08d7d 100644 --- a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py +++ b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py @@ -6,7 +6,7 @@ # M117 - displays the filename and layer height to the LCD # Alternatively, user can override the filename to display alt text + layer height -..Script import Script +from ..Script import Script from UM.Application import Application class DisplayFilenameAndLayerOnLCD(Script): From 9739dbd5f69597b281b61f773d9d6418e0e3eaae Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 2 Sep 2018 17:18:04 +0200 Subject: [PATCH 016/212] Fix missing import --- cura/PrinterOutput/FirmwareUpdater.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/PrinterOutput/FirmwareUpdater.py b/cura/PrinterOutput/FirmwareUpdater.py index ca5997bfb1..17089ad17f 100644 --- a/cura/PrinterOutput/FirmwareUpdater.py +++ b/cura/PrinterOutput/FirmwareUpdater.py @@ -7,6 +7,7 @@ from UM.Resources import Resources from cura.PrinterOutputDevice import PrinterOutputDevice from enum import IntEnum +from threading import Thread class FirmwareUpdater(QObject): firmwareProgressChanged = pyqtSignal() From 43b4ca30440a56b843a538ad464e15fccb2fc5f5 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 2 Sep 2018 18:02:33 +0200 Subject: [PATCH 017/212] Fix code-style --- cura/PrinterOutput/FirmwareUpdater.py | 2 +- plugins/USBPrinting/USBPrinterOutputDevice.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutput/FirmwareUpdater.py b/cura/PrinterOutput/FirmwareUpdater.py index 17089ad17f..e7ffc2a2b5 100644 --- a/cura/PrinterOutput/FirmwareUpdater.py +++ b/cura/PrinterOutput/FirmwareUpdater.py @@ -16,7 +16,7 @@ class FirmwareUpdater(QObject): def __init__(self, output_device: PrinterOutputDevice) -> None: self._output_device = output_device - self._update_firmware_thread = Thread(target=self._updateFirmware, daemon = True) + self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) self._firmware_view = None self._firmware_location = None diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 18373d34d2..b04b51314c 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -55,7 +55,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._all_baud_rates = [115200, 250000, 230400, 57600, 38400, 19200, 9600] # Instead of using a timer, we really need the update to be as a thread, as reading from serial can block. - self._update_thread = Thread(target=self._update, daemon = True) + self._update_thread = Thread(target=self._update, daemon=True) self._last_temperature_request = None # type: Optional[int] @@ -358,7 +358,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if print_job is None: controller = GenericOutputController(self) controller.setCanUpdateFirmware(True) - print_job = PrintJobOutputModel(output_controller = controller, name= CuraApplication.getInstance().getPrintInformation().jobName) + print_job = PrintJobOutputModel(output_controller=controller, name=CuraApplication.getInstance().getPrintInformation().jobName) print_job.updateState("printing") self._printers[0].updateActivePrintJob(print_job) From 4a5451576d1894b7eb40bda7f27ac81a20ea6c0f Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 2 Sep 2018 18:07:30 +0200 Subject: [PATCH 018/212] Update copyright --- cura/PrinterOutput/PrinterOutputController.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index eb5f15cceb..dd2276d771 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from UM.Logger import Logger From 28324ff2f6b36a26246290db7d1976d53502932e Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 7 Sep 2018 15:28:35 +0200 Subject: [PATCH 019/212] Monitor Tab - Font improvements Contributes to CL-1046 --- .../UM3NetworkPrinting/resources/qml/ClusterControlItem.qml | 2 +- .../resources/qml/PrintCoreConfiguration.qml | 2 +- plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 1164e383db..529566a7eb 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -337,7 +337,7 @@ Component { id: printJobName text: modelData.activePrintJob != null ? modelData.activePrintJob.name : "" - font: UM.Theme.getFont("default_bold") + font: UM.Theme.getFont("default") anchors.left: parent.left anchors.right: contextButton.left anchors.rightMargin: UM.Theme.getSize("default_margin").width diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintCoreConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintCoreConfiguration.qml index 0ae1fec920..b2f4e85f9a 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrintCoreConfiguration.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrintCoreConfiguration.qml @@ -67,7 +67,7 @@ Item } return "" } - font: UM.Theme.getFont("default_bold") + font: UM.Theme.getFont("default") elide: Text.ElideRight width: parent.width } diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml index f39b430e19..ee96887969 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml @@ -62,7 +62,7 @@ Item { id: printJobName text: printJob.name - font: UM.Theme.getFont("default_bold") + font: UM.Theme.getFont("default") width: parent.width elide: Text.ElideRight } @@ -105,7 +105,6 @@ Item Label { id: totalTimeLabel - opacity: 0.6 anchors.bottom: parent.bottom anchors.right: parent.right font: UM.Theme.getFont("default") From 13717d3ce6895f9ceb60c0fe61fb0e2937253261 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 7 Sep 2018 16:05:24 +0200 Subject: [PATCH 020/212] Monitor Tab - Fix -1h -1m bug Contributes to CL-1047 --- .../resources/qml/ClusterControlItem.qml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 529566a7eb..69db8843d1 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -668,7 +668,12 @@ Component case "queued": return catalog.i18nc("@label:status", "Action required") default: - OutputDevice.formatDuration(modelData.activePrintJob.timeTotal - modelData.activePrintJob.timeElapsed) + /* Sometimes total minus elapsed is less than 0. Use Math.max() to prevent + remaining time from ever being less than 0. Negative durations cause + strange behavior such as displaying "-1h -1m". */ + var activeJob = modelData.activePrintJob + var remaining = activeJob.timeTotal - activeJob.timeElapsed; + OutputDevice.formatDuration(Math.max(remaining, 0)) } } From 90e8c41fa2976ae17c4dc9836ffc63dfacd44ef8 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 7 Sep 2018 16:09:25 +0200 Subject: [PATCH 021/212] Show time remaining instead of "Paused" Contributes to CL-1047 --- .../resources/qml/ClusterControlItem.qml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 69db8843d1..d6c7dd7a8b 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -645,6 +645,12 @@ Component return "" } + /* Sometimes total minus elapsed is less than 0. Use Math.max() to prevent remaining + time from ever being less than 0. Negative durations cause strange behavior such + as displaying "-1h -1m". */ + var activeJob = modelData.activePrintJob + var remainingTime = Math.max(activeJob.timeTotal - activeJob.timeElapsed, 0); + switch(modelData.activePrintJob.state) { case "wait_cleanup": @@ -662,18 +668,13 @@ Component case "pausing": return catalog.i18nc("@label:status", "Pausing") case "paused": - return catalog.i18nc("@label:status", "Paused") + return OutputDevice.formatDuration( remainingTime ) case "resuming": return catalog.i18nc("@label:status", "Resuming") case "queued": return catalog.i18nc("@label:status", "Action required") default: - /* Sometimes total minus elapsed is less than 0. Use Math.max() to prevent - remaining time from ever being less than 0. Negative durations cause - strange behavior such as displaying "-1h -1m". */ - var activeJob = modelData.activePrintJob - var remaining = activeJob.timeTotal - activeJob.timeElapsed; - OutputDevice.formatDuration(Math.max(remaining, 0)) + return OutputDevice.formatDuration( remainingTime ) } } From 97e8db577aed4813c973df47750ff08e5c333d0b Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 7 Sep 2018 16:45:30 +0200 Subject: [PATCH 022/212] Monitor Tab - Add grey monitor tab text Contributes to CL-1047 --- .../UM3NetworkPrinting/resources/qml/ClusterControlItem.qml | 2 +- resources/themes/cura-light/theme.json | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index d6c7dd7a8b..90ceb1ed6e 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -223,7 +223,7 @@ Component width: parent.width elide: Text.ElideRight font: UM.Theme.getFont("default") - opacity: 0.6 + color: UM.Theme.getColor("monitor_secondary_text") } } diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index c408146669..c70aa512cf 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -321,7 +321,9 @@ "favorites_header_hover": [245, 245, 245, 255], "favorites_header_text": [31, 36, 39, 255], "favorites_header_text_hover": [31, 36, 39, 255], - "favorites_row_selected": [196, 239, 255, 255] + "favorites_row_selected": [196, 239, 255, 255], + + "monitor_secondary_text": [153, 153, 153, 255] }, "sizes": { From 79aeca9663fae958b2a28ad79f905bfa88aadd8e Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 7 Sep 2018 16:46:11 +0200 Subject: [PATCH 023/212] Monitor Tab - Grey progress bar for pause/abort Contributes to CL-1047 --- .../resources/qml/ClusterControlItem.qml | 39 +++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 90ceb1ed6e..9d6c31a73f 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -638,19 +638,24 @@ Component style: ProgressBarStyle { + property var remainingTime: + { + if(modelData.activePrintJob == null) + { + return 0 + } + /* Sometimes total minus elapsed is less than 0. Use Math.max() to prevent remaining + time from ever being less than 0. Negative durations cause strange behavior such + as displaying "-1h -1m". */ + var activeJob = modelData.activePrintJob + return Math.max(activeJob.timeTotal - activeJob.timeElapsed, 0); + } property var progressText: { if(modelData.activePrintJob == null) { return "" } - - /* Sometimes total minus elapsed is less than 0. Use Math.max() to prevent remaining - time from ever being less than 0. Negative durations cause strange behavior such - as displaying "-1h -1m". */ - var activeJob = modelData.activePrintJob - var remainingTime = Math.max(activeJob.timeTotal - activeJob.timeElapsed, 0); - switch(modelData.activePrintJob.state) { case "wait_cleanup": @@ -663,6 +668,7 @@ Component case "sent_to_printer": return catalog.i18nc("@label:status", "Preparing") case "aborted": + return catalog.i18nc("@label:status", "Aborted") case "wait_user_action": return catalog.i18nc("@label:status", "Aborted") case "pausing": @@ -687,7 +693,24 @@ Component progress: Rectangle { - color: UM.Theme.getColor("primary") + color: + { + var state = modelData.activePrintJob.state + var deactiveStates = [ + "pausing", + "paused", + "resuming", + "wait_cleanup" + ] + if(deactiveStates.indexOf(state) > -1 && remainingTime > 0) + { + return UM.Theme.getColor("monitor_secondary_text") + } + else + { + return UM.Theme.getColor("primary") + } + } id: progressItem function getTextOffset() { From 90426749a294382a7b6899b3e28a7e65b238d4c5 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 10 Sep 2018 11:35:58 +0200 Subject: [PATCH 024/212] Change deactiveStates to inactiveStates Contributes to CL-1047 --- .../UM3NetworkPrinting/resources/qml/ClusterControlItem.qml | 4 ++-- .../UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml | 2 +- resources/themes/cura-light/theme.json | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 9d6c31a73f..aee374c95c 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -696,13 +696,13 @@ Component color: { var state = modelData.activePrintJob.state - var deactiveStates = [ + var inactiveStates = [ "pausing", "paused", "resuming", "wait_cleanup" ] - if(deactiveStates.indexOf(state) > -1 && remainingTime > 0) + if(inactiveStates.indexOf(state) > -1 && remainingTime > 0) { return UM.Theme.getColor("monitor_secondary_text") } diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml index ee96887969..3e36ec6534 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml @@ -10,7 +10,7 @@ Item { id: base property var printJob: null - property var shadowRadius: 5 + property var shadowRadius: 5 * screenScaleFactor function getPrettyTime(time) { return OutputDevice.formatDuration(time) diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index c70aa512cf..61f60e034c 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -471,6 +471,8 @@ "toolbox_progress_bar": [8.0, 0.5], "toolbox_chart_row": [1.0, 2.0], "toolbox_action_button": [8.0, 2.5], - "toolbox_loader": [2.0, 2.0] + "toolbox_loader": [2.0, 2.0], + + "drop_shadow_radius": [1.0, 1.0] } } From 0d67420601b93d1eb32e075e7509e6bf281c930e Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 10 Sep 2018 13:38:26 +0200 Subject: [PATCH 025/212] Monitor Tab - Accordion-style printer blocks Includes some unsuccessful attempts at scaling the outer-shadow Contributes to CL-1048 --- .../resources/qml/ClusterControlItem.qml | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index aee374c95c..4e5b875457 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -15,7 +15,7 @@ Component { id: base property var lineColor: "#DCDCDC" // TODO: Should be linked to theme. - + property var shadowRadius: 5 * screenScaleFactor property var cornerRadius: 4 * screenScaleFactor // TODO: Should be linked to theme. visible: OutputDevice != null anchors.fill: parent @@ -82,6 +82,8 @@ Component ListView { + id: printer_list + property var current_index: -1 anchors { top: parent.top @@ -105,17 +107,23 @@ Component anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter id: base - property var shadowRadius: 5 + property var shadowRadius: 5 * screenScaleFactor property var collapsed: true layer.enabled: true layer.effect: DropShadow { - radius: base.shadowRadius + radius: 5 * screenScaleFactor verticalOffset: 2 color: "#3F000000" // 25% shadow } + Connections + { + target: printer_list + onCurrent_indexChanged: { base.collapsed = printer_list.current_index != model.index } + } + Item { id: printerInfo @@ -131,7 +139,17 @@ Component MouseArea { anchors.fill: parent - onClicked: base.collapsed = !base.collapsed + onClicked: + { + + if (base.collapsed) { + printer_list.current_index = model.index + } + else + { + printer_list.current_index = -1 + } + } } Item From 1c8b086403a345a71c6dd0d07e596c76f51ed480 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 10 Sep 2018 14:35:05 +0200 Subject: [PATCH 026/212] Improve inactive coloring Contributes to CL-1048 --- .../resources/qml/ClusterControlItem.qml | 61 ++++++++++++++++--- resources/themes/cura-light/theme.json | 5 +- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 4e5b875457..93c29708b2 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -106,6 +106,17 @@ Component height: childrenRect.height + UM.Theme.getSize("default_margin").height anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter + color: + { + if(modelData.state == "disabled") + { + return UM.Theme.getColor("monitor_background_inactive") + } + else + { + return UM.Theme.getColor("monitor_background_active") + } + } id: base property var shadowRadius: 5 * screenScaleFactor property var collapsed: true @@ -141,7 +152,6 @@ Component anchors.fill: parent onClicked: { - if (base.collapsed) { printer_list.current_index = model.index } @@ -185,7 +195,7 @@ Component { if(modelData.state == "disabled") { - return UM.Theme.getColor("setting_control_disabled") + return UM.Theme.getColor("monitor_text_inactive") } if(modelData.activePrintJob != undefined) @@ -193,7 +203,7 @@ Component return UM.Theme.getColor("primary") } - return UM.Theme.getColor("setting_control_disabled") + return UM.Theme.getColor("monitor_text_inactive") } } } @@ -241,7 +251,7 @@ Component width: parent.width elide: Text.ElideRight font: UM.Theme.getFont("default") - color: UM.Theme.getColor("monitor_secondary_text") + color: UM.Theme.getColor("monitor_text_inactive") } } @@ -274,8 +284,16 @@ Component Rectangle { id: topSpacer - color: UM.Theme.getColor("viewport_background") - height: 2 + color: + { + if(modelData.state == "disabled") + { + return UM.Theme.getColor("monitor_lining_inactive") + } + return UM.Theme.getColor("viewport_background") + } + // UM.Theme.getColor("viewport_background") + height: 1 anchors { left: parent.left @@ -288,7 +306,14 @@ Component PrinterFamilyPill { id: printerFamilyPill - color: UM.Theme.getColor("viewport_background") + color: + { + if(modelData.state == "disabled") + { + return "transparent" + } + return UM.Theme.getColor("viewport_background") + } anchors.top: topSpacer.bottom anchors.topMargin: 2 * UM.Theme.getSize("default_margin").height text: modelData.type @@ -722,7 +747,7 @@ Component ] if(inactiveStates.indexOf(state) > -1 && remainingTime > 0) { - return UM.Theme.getColor("monitor_secondary_text") + return UM.Theme.getColor("monitor_background_inactive") } else { @@ -749,7 +774,25 @@ Component anchors.leftMargin: getTextOffset() text: progressText anchors.verticalCenter: parent.verticalCenter - color: progressItem.width + progressLabel.width < control.width ? "black" : "white" + // color: progressItem.width + progressLabel.width < control.width ? "black" : "white" + color: + { + var state = modelData.activePrintJob.state + var inactiveStates = [ + "pausing", + "paused", + "resuming", + "wait_cleanup" + ] + if(inactiveStates.indexOf(state) > -1 && remainingTime > 0) + { + return "black" + } + else + { + return progressItem.width + progressLabel.width < control.width ? "black" : "white" + } + } width: contentWidth font: UM.Theme.getFont("default") } diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 61f60e034c..43d892c34c 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -323,7 +323,10 @@ "favorites_header_text_hover": [31, 36, 39, 255], "favorites_row_selected": [196, 239, 255, 255], - "monitor_secondary_text": [153, 153, 153, 255] + "monitor_text_inactive": [154, 154, 154, 255], + "monitor_background_inactive": [240, 240, 240, 255], + "monitor_background_active": [255, 255, 255, 255], + "monitor_lining_inactive": [230, 230, 230, 255] }, "sizes": { From 333cea4e6d8f13f6af25c8c7a464afe04ccba5d4 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 10 Sep 2018 15:06:19 +0200 Subject: [PATCH 027/212] Some tweaks were not really improvements Contributes to CL-1048 --- .../resources/qml/ClusterControlItem.qml | 23 +++---------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 93c29708b2..889235c023 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -747,7 +747,7 @@ Component ] if(inactiveStates.indexOf(state) > -1 && remainingTime > 0) { - return UM.Theme.getColor("monitor_background_inactive") + return UM.Theme.getColor("monitor_text_inactive") } else { @@ -757,7 +757,7 @@ Component id: progressItem function getTextOffset() { - if(progressItem.width + progressLabel.width < control.width) + if(progressItem.width + progressLabel.width + 16 < control.width) { return progressItem.width + UM.Theme.getSize("default_margin").width } @@ -774,24 +774,7 @@ Component anchors.leftMargin: getTextOffset() text: progressText anchors.verticalCenter: parent.verticalCenter - // color: progressItem.width + progressLabel.width < control.width ? "black" : "white" - color: - { - var state = modelData.activePrintJob.state - var inactiveStates = [ - "pausing", - "paused", - "resuming", - "wait_cleanup" - ] - if(inactiveStates.indexOf(state) > -1 && remainingTime > 0) - { - return "black" - } - else - { - return progressItem.width + progressLabel.width < control.width ? "black" : "white" - } + color: progressItem.width + progressLabel.width < control.width ? "black" : "white" } width: contentWidth font: UM.Theme.getFont("default") From ac5a038065caa19b06ba3fc17222599a99a85608 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Tue, 11 Sep 2018 10:27:50 +0200 Subject: [PATCH 028/212] Monitor Tab - Fix syntax error Contributes to CL-1048 --- plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 889235c023..2f65983ac4 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -775,7 +775,6 @@ Component text: progressText anchors.verticalCenter: parent.verticalCenter color: progressItem.width + progressLabel.width < control.width ? "black" : "white" - } width: contentWidth font: UM.Theme.getFont("default") } From e7704ede3c8c10562ddd9303a5768cce8a1f023c Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Tue, 11 Sep 2018 17:01:26 +0200 Subject: [PATCH 029/212] Monitor Tab - Fix queue/manage queue alignment Contributes to CL-1052 --- .../UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml | 2 +- .../UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml index 71b598d05c..3832d6eace 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml @@ -26,7 +26,7 @@ Component Label { id: manageQueueLabel - anchors.rightMargin: 4 * UM.Theme.getSize("default_margin").width + anchors.rightMargin: 3 * UM.Theme.getSize("default_margin").width anchors.right: queuedPrintJobs.right anchors.bottom: queuedLabel.bottom text: catalog.i18nc("@label link to connect manager", "Manage queue") diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml index 3e36ec6534..58be8c1638 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml @@ -16,6 +16,8 @@ Item return OutputDevice.formatDuration(time) } + width: parent.width + UM.I18nCatalog { id: catalog @@ -54,7 +56,7 @@ Item bottom: parent.bottom left: parent.left right: parent.horizontalCenter - margins: 2 * UM.Theme.getSize("default_margin").width + margins: UM.Theme.getSize("wide_margin").width rightMargin: UM.Theme.getSize("default_margin").width } @@ -124,6 +126,7 @@ Item right: parent.right margins: 2 * UM.Theme.getSize("default_margin").width leftMargin: UM.Theme.getSize("default_margin").width + rightMargin: UM.Theme.getSize("default_margin").width } Label From e51089a88039498f390c506f0ecb64533a55a764 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Wed, 12 Sep 2018 13:03:12 +0200 Subject: [PATCH 030/212] Mointor Tab - CL-1046 Make fonts bold --- plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml | 2 +- plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 2f65983ac4..a5145cc201 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -380,7 +380,7 @@ Component { id: printJobName text: modelData.activePrintJob != null ? modelData.activePrintJob.name : "" - font: UM.Theme.getFont("default") + font: UM.Theme.getFont("default_bold") anchors.left: parent.left anchors.right: contextButton.left anchors.rightMargin: UM.Theme.getSize("default_margin").width diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml index 58be8c1638..005c274a29 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml @@ -64,7 +64,7 @@ Item { id: printJobName text: printJob.name - font: UM.Theme.getFont("default") + font: UM.Theme.getFont("default_bold") width: parent.width elide: Text.ElideRight } From 0a01e7c25b6ca470396452cf5a25cf177d899537 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Wed, 12 Sep 2018 16:31:59 +0200 Subject: [PATCH 031/212] Monitor Tab - Improved camera icon - Fixed: Camera icon is too small, and the icon does not look centred - Fixed: No hover effect for the camera button Contributes to CL-1049 --- .../resources/qml/ClusterControlItem.qml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index a5145cc201..8ad6e5ea87 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -628,24 +628,28 @@ Component Rectangle { - id: showCameraIcon - width: 35 * screenScaleFactor + id: showCameraButton + width: 36 * screenScaleFactor height: width radius: 0.5 * width anchors.left: parent.left anchors.bottom: printJobPreview.bottom - color: UM.Theme.getColor("setting_control_border_highlight") - Image + color: showCameraMouseArea.containsMouse ? UM.Theme.getColor("primary_hover") : UM.Theme.getColor("primary") + UM.RecolorImage { - width: parent.width + id: showCameraIcon + width: parent.width - 1 height: width - anchors.right: parent.right - anchors.rightMargin: parent.rightMargin + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + color: UM.Theme.getColor("primary_text") source: "../svg/camera-icon.svg" } MouseArea { + id: showCameraMouseArea anchors.fill:parent + hoverEnabled: true onClicked: { OutputDevice.setActiveCamera(modelData.camera) From dccc95f81716dac465695cc4dd997136f250199a Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Wed, 12 Sep 2018 16:46:18 +0200 Subject: [PATCH 032/212] Monitor Tab - Camera button toggles Contributes to CL-1049 --- .../resources/qml/ClusterControlItem.qml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 8ad6e5ea87..79c64defd6 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -652,7 +652,14 @@ Component hoverEnabled: true onClicked: { - OutputDevice.setActiveCamera(modelData.camera) + if (OutputDevice.activeCamera !== null) + { + OutputDevice.setActiveCamera(null) + } + else + { + OutputDevice.setActiveCamera(modelData.camera) + } } } } From 08d5e48407a39555fc138a2d1a3105f6ce1d2e4e Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Wed, 12 Sep 2018 16:52:26 +0200 Subject: [PATCH 033/212] Monitor Tab - Create reusable button Contributes to CL-1049 --- .../resources/qml/ClusterControlItem.qml | 37 ++------------- .../resources/qml/DotButton.qml | 47 +++++++++++++++++++ 2 files changed, 52 insertions(+), 32 deletions(-) create mode 100644 plugins/UM3NetworkPrinting/resources/qml/DotButton.qml diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 79c64defd6..c9fc0bc46c 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -626,41 +626,14 @@ Component color: "black" } - Rectangle + DotButton { id: showCameraButton - width: 36 * screenScaleFactor - height: width - radius: 0.5 * width - anchors.left: parent.left - anchors.bottom: printJobPreview.bottom - color: showCameraMouseArea.containsMouse ? UM.Theme.getColor("primary_hover") : UM.Theme.getColor("primary") - UM.RecolorImage + iconSource: "../svg/camera-icon.svg" + anchors { - id: showCameraIcon - width: parent.width - 1 - height: width - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - color: UM.Theme.getColor("primary_text") - source: "../svg/camera-icon.svg" - } - MouseArea - { - id: showCameraMouseArea - anchors.fill:parent - hoverEnabled: true - onClicked: - { - if (OutputDevice.activeCamera !== null) - { - OutputDevice.setActiveCamera(null) - } - else - { - OutputDevice.setActiveCamera(modelData.camera) - } - } + left: parent.left + bottom: printJobPreview.bottom } } } diff --git a/plugins/UM3NetworkPrinting/resources/qml/DotButton.qml b/plugins/UM3NetworkPrinting/resources/qml/DotButton.qml new file mode 100644 index 0000000000..e36634fc5c --- /dev/null +++ b/plugins/UM3NetworkPrinting/resources/qml/DotButton.qml @@ -0,0 +1,47 @@ +import QtQuick 2.3 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.3 +import QtQuick.Controls 2.0 as Controls2 +import QtGraphicalEffects 1.0 + +import UM 1.3 as UM +import Cura 1.0 as Cura + +Rectangle +{ + property var iconSource: null + + width: 36 * screenScaleFactor + height: width + radius: 0.5 * width + color: clickArea.containsMouse ? UM.Theme.getColor("primary_hover") : UM.Theme.getColor("primary") + + UM.RecolorImage + { + id: icon + width: parent.width - 1 + height: width + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + color: UM.Theme.getColor("primary_text") + source: iconSource + } + + MouseArea + { + id: clickArea + anchors.fill:parent + hoverEnabled: true + onClicked: + { + if (OutputDevice.activeCamera !== null) + { + OutputDevice.setActiveCamera(null) + } + else + { + OutputDevice.setActiveCamera(modelData.camera) + } + } + } +} \ No newline at end of file From 0b66bf0448ae7edda6d82a435e90f528c4a9d87b Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Wed, 12 Sep 2018 17:07:10 +0200 Subject: [PATCH 034/212] Monitor Tab - Use camera button on camera stream - Fixes: Video feed close button is always out of sight - Makes improvement to camera icon Contributes to CL-1049 --- .../qml/{DotButton.qml => CameraButton.qml} | 2 +- .../resources/qml/ClusterControlItem.qml | 2 +- .../resources/qml/PrinterVideoStream.qml | 66 +++++++++++-------- .../resources/svg/camera-icon.svg | 10 +-- 4 files changed, 47 insertions(+), 33 deletions(-) rename plugins/UM3NetworkPrinting/resources/qml/{DotButton.qml => CameraButton.qml} (97%) diff --git a/plugins/UM3NetworkPrinting/resources/qml/DotButton.qml b/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml similarity index 97% rename from plugins/UM3NetworkPrinting/resources/qml/DotButton.qml rename to plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml index e36634fc5c..1ceebccf89 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/DotButton.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml @@ -19,7 +19,7 @@ Rectangle UM.RecolorImage { id: icon - width: parent.width - 1 + width: parent.width / 2 height: width anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index c9fc0bc46c..52fe0f544a 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -626,7 +626,7 @@ Component color: "black" } - DotButton + CameraButton { id: showCameraButton iconSource: "../svg/camera-icon.svg" diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml b/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml index 74c8ec8483..c193d0ed71 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml @@ -23,38 +23,50 @@ Item z: 0 } - Button + CameraButton { - id: backButton - anchors.bottom: cameraImage.top - anchors.bottomMargin: UM.Theme.getSize("default_margin").width - anchors.right: cameraImage.right - - // TODO: Hardcoded sizes - width: 20 * screenScaleFactor - height: 20 * screenScaleFactor - - onClicked: OutputDevice.setActiveCamera(null) - - style: ButtonStyle + id: closeCameraButton + iconSource: UM.Theme.getIcon("cross1") + anchors { - label: Item - { - UM.RecolorImage - { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - width: control.width - height: control.height - sourceSize.width: width - sourceSize.height: width - source: UM.Theme.getIcon("cross1") - } - } - background: Item {} + top: cameraImage.top + topMargin: UM.Theme.getSize("default_margin").height + right: cameraImage.right + rightMargin: UM.Theme.getSize("default_margin").width } + z: 999 } + // Button + // { + // id: backButton + + + // // TODO: Hardcoded sizes + // width: 20 * screenScaleFactor + // height: 20 * screenScaleFactor + + // onClicked: OutputDevice.setActiveCamera(null) + + // style: ButtonStyle + // { + // label: Item + // { + // UM.RecolorImage + // { + // anchors.verticalCenter: parent.verticalCenter + // anchors.horizontalCenter: parent.horizontalCenter + // width: control.width + // height: control.height + // sourceSize.width: width + // sourceSize.height: width + // source: UM.Theme.getIcon("cross1") + // } + // } + // background: Item {} + // } + // } + Image { id: cameraImage diff --git a/plugins/UM3NetworkPrinting/resources/svg/camera-icon.svg b/plugins/UM3NetworkPrinting/resources/svg/camera-icon.svg index 29adfa5875..66bed04508 100644 --- a/plugins/UM3NetworkPrinting/resources/svg/camera-icon.svg +++ b/plugins/UM3NetworkPrinting/resources/svg/camera-icon.svg @@ -1,6 +1,8 @@ - - - - + + + Created with Sketch. + + + \ No newline at end of file From 7226bc45b519c022a9e703a180c1500e1938bee0 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Thu, 13 Sep 2018 10:35:31 +0200 Subject: [PATCH 035/212] Monitor Tab - Queued header is properly aligned Contributes to CL-1052 --- plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml index 3832d6eace..f6cf6607c7 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml @@ -50,7 +50,7 @@ Component anchors.left: queuedPrintJobs.left anchors.top: parent.top anchors.topMargin: 2 * UM.Theme.getSize("default_margin").height - anchors.leftMargin: 3 * UM.Theme.getSize("default_margin").width + anchors.leftMargin: 3 * UM.Theme.getSize("default_margin").width + 5 text: catalog.i18nc("@label", "Queued") font: UM.Theme.getFont("large") color: UM.Theme.getColor("text") From 6068ed10c14ffde7dbb62f301cb413a1b0cf309e Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 13 Sep 2018 13:06:50 +0200 Subject: [PATCH 036/212] JSON fix: connect_infill_polygons by default only when polygons can be connected via the outline. Also let the user be able to edit the setting in some more situations, for example when choosing concentric infill when the infill_line_distance = nozzle_size --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 4c87a3bcf0..83f633b775 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1664,8 +1664,8 @@ "description": "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time.", "type": "bool", "default_value": true, - "value": "infill_pattern == 'cross' or infill_pattern == 'cross_3d' or infill_multiplier % 2 == 0", - "enabled": "infill_pattern == 'cross' or infill_pattern == 'cross_3d' or infill_multiplier % 2 == 0", + "value": "(infill_pattern == 'cross' or infill_pattern == 'cross_3d' or infill_multiplier % 2 == 0) and infill_wall_line_count > 0", + "enabled": "infill_pattern == 'cross' or infill_pattern == 'cross_3d' or infill_pattern == 'concentric' or infill_multiplier % 2 == 0 or infill_wall_line_count > 1", "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, From eb253827be2e331502ec7892286549f66e037eb9 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 13 Sep 2018 13:48:08 +0200 Subject: [PATCH 037/212] JSON setting: option to let support be replaced by brim or not --- resources/definitions/fdmprinter.def.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 4c87a3bcf0..e5726afdca 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4538,6 +4538,17 @@ } } }, + "brim_replaces_support": + { + "label": "Brim Replaces Support", + "description": "Enforce brim to be printed around the model even if that space would otherwise be occupied by support. This replaces some regions fo the first layer of supprot by brim regions.", + "type": "bool", + "default_value": true, + "enabled": "resolveOrValue('adhesion_type') == 'brim' and support_enable", + "settable_per_mesh": false, + "settable_per_extruder": true, + "limit_to_extruder": "adhesion_extruder_nr" + }, "brim_outside_only": { "label": "Brim Only on Outside", From 945cc7c3e63d70fa3f66be601dda6be14302b608 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 13 Sep 2018 14:25:57 +0200 Subject: [PATCH 038/212] JSon feat: support brim settings --- resources/definitions/fdmprinter.def.json | 42 +++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index e5726afdca..74e9bab14d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3888,6 +3888,48 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "support_brim_enable": + { + "label": "Enable Support Brim", + "description": "Generate a brim within the support infill regions of the first layer. This brim is printed underneath the support, not around it. Enabling this setting increases the adhesion of support to the build plate.", + "type": "bool", + "default_value": false, + "enabled": "support_enable or support_tree_enable", + "limit_to_extruder": "support_infill_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_brim_width": + { + "label": "Support Brim Width", + "description": "The width of the brim to print underneath the support. A larger brim enhances adhesion to the build plate, at the cost of some extra material.", + "type": "float", + "unit": "mm", + "default_value": 8.0, + "minimum_value": "0.0", + "maximum_value_warning": "50.0", + "enabled": "support_enable", + "settable_per_mesh": false, + "settable_per_extruder": true, + "limit_to_extruder": "support_infill_extruder_nr", + "children": + { + "support_brim_line_count": + { + "label": "Support Brim Line Count", + "description": "The number of lines used for the support brim. More brim lines enhance adhesion to the build plate, at the cost of some extra material.", + "type": "int", + "default_value": 20, + "minimum_value": "0", + "maximum_value_warning": "50 / skirt_brim_line_width", + "value": "math.ceil(support_brim_width / (skirt_brim_line_width * initial_layer_line_width_factor / 100.0))", + "enabled": "support_enable", + "settable_per_mesh": false, + "settable_per_extruder": true, + "limit_to_extruder": "support_infill_extruder_nr" + } + } + }, "support_z_distance": { "label": "Support Z Distance", From f93413d3a3ab080a40a82ca743202789b943dd46 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Thu, 13 Sep 2018 14:52:52 +0200 Subject: [PATCH 039/212] Monitor Tab - Context menu improvements Fixed: - In the Queued jobs area, the context menu doesn't close when clicking on the right half of the card. - Context menu trigger button should be more in the corner for both the print job tiles and the printer tiles - Context menu text should not be centered - Context menu should be closer to the context menu trigger button - Context menu should be aligned further right in relation to the context menu trigger button - Context menu options that are not available should not be shown. - Context button dots should be grey. Contributes to CL-1050 --- .../resources/qml/ClusterControlItem.qml | 67 +++++++++++------- .../resources/qml/PrintJobInfoBlock.qml | 70 +++++++++++++------ 2 files changed, 91 insertions(+), 46 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 52fe0f544a..76aff7103a 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -399,21 +399,13 @@ Component function switchPopupState() { - if (popup.visible) - { - popup.close() - } - else - { - popup.open() - } + popup.visible ? popup.close() : popup.open() } Controls2.Button { id: contextButton text: "\u22EE" //Unicode; Three stacked points. - font.pixelSize: 25 width: 35 height: width anchors @@ -431,6 +423,14 @@ Component radius: 0.5 * width color: UM.Theme.getColor("viewport_background") } + contentItem: Label + { + text: contextButton.text + color: UM.Theme.getColor("monitor_text_inactive") + font.pixelSize: 25 + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } onClicked: parent.switchPopupState() } @@ -440,18 +440,21 @@ Component // TODO Change once updating to Qt5.10 - The 'opened' property is in 5.10 but the behavior is now implemented with the visible property id: popup clip: true - closePolicy: Controls2.Popup.CloseOnPressOutsideParent - x: parent.width - width - y: contextButton.height - width: 160 + closePolicy: Popup.CloseOnPressOutside + x: (parent.width - width) + 26 * screenScaleFactor + y: contextButton.height - 5 * screenScaleFactor // Because shadow + width: 182 * screenScaleFactor height: contentItem.height + 2 * padding visible: false + padding: 5 * screenScaleFactor // Because shadow - transformOrigin: Controls2.Popup.Top + transformOrigin: Popup.Top contentItem: Item { - width: popup.width - 2 * popup.padding - height: childrenRect.height + 15 + width: popup.width + height: childrenRect.height + 36 * screenScaleFactor + anchors.topMargin: 10 * screenScaleFactor + anchors.bottomMargin: 10 * screenScaleFactor Controls2.Button { id: pauseButton @@ -470,14 +473,22 @@ Component } width: parent.width enabled: modelData.activePrintJob != null && ["paused", "printing"].indexOf(modelData.activePrintJob.state) >= 0 + visible: enabled anchors.top: parent.top - anchors.topMargin: 10 + anchors.topMargin: 18 * screenScaleFactor + height: visible ? 39 * screenScaleFactor : 0 * screenScaleFactor hoverEnabled: true - background: Rectangle + background: Rectangle { opacity: pauseButton.down || pauseButton.hovered ? 1 : 0 color: UM.Theme.getColor("viewport_background") } + contentItem: Label + { + text: sendToTopButton.text + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + } } Controls2.Button @@ -490,6 +501,7 @@ Component popup.close() } width: parent.width + height: 39 * screenScaleFactor anchors.top: pauseButton.bottom hoverEnabled: true enabled: modelData.activePrintJob != null && ["paused", "printing", "pre_print"].indexOf(modelData.activePrintJob.state) >= 0 @@ -498,6 +510,12 @@ Component opacity: abortButton.down || abortButton.hovered ? 1 : 0 color: UM.Theme.getColor("viewport_background") } + contentItem: Label + { + text: abortButton.text + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + } } } @@ -519,19 +537,20 @@ Component Item { id: pointedRectangle - width: parent.width -10 - height: parent.height -10 + width: parent.width - 10 * screenScaleFactor // Because of the shadow + height: parent.height - 10 * screenScaleFactor // Because of the shadow anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter Rectangle { id: point - height: 13 - width: 13 + height: 14 * screenScaleFactor + width: 14 * screenScaleFactor color: UM.Theme.getColor("setting_control") transform: Rotation { angle: 45} anchors.right: bloop.right + anchors.rightMargin: 24 y: 1 } @@ -541,9 +560,9 @@ Component color: UM.Theme.getColor("setting_control") width: parent.width anchors.top: parent.top - anchors.topMargin: 10 + anchors.topMargin: 8 * screenScaleFactor // Because of the shadow + point anchors.bottom: parent.bottom - anchors.bottomMargin: 5 + anchors.bottomMargin: 8 * screenScaleFactor // Because of the shadow } } } diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml index 005c274a29..71c2104318 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml @@ -30,7 +30,7 @@ Item anchors { top: parent.top - topMargin: 3 + topMargin: 3 * screenScaleFactor left: parent.left leftMargin: base.shadowRadius rightMargin: base.shadowRadius @@ -43,7 +43,7 @@ Item layer.effect: DropShadow { radius: base.shadowRadius - verticalOffset: 2 + verticalOffset: 2 * screenScaleFactor color: "#3F000000" // 25% shadow } @@ -126,7 +126,7 @@ Item right: parent.right margins: 2 * UM.Theme.getSize("default_margin").width leftMargin: UM.Theme.getSize("default_margin").width - rightMargin: UM.Theme.getSize("default_margin").width + rightMargin: UM.Theme.getSize("default_margin").width / 2 } Label @@ -169,7 +169,6 @@ Item { id: contextButton text: "\u22EE" //Unicode; Three stacked points. - font.pixelSize: 25 width: 35 height: width anchors @@ -187,6 +186,14 @@ Item radius: 0.5 * width color: UM.Theme.getColor("viewport_background") } + contentItem: Label + { + text: contextButton.text + color: UM.Theme.getColor("monitor_text_inactive") + font.pixelSize: 25 + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } onClicked: parent.switchPopupState() } @@ -196,18 +203,21 @@ Item // TODO Change once updating to Qt5.10 - The 'opened' property is in 5.10 but the behavior is now implemented with the visible property id: popup clip: true - closePolicy: Popup.CloseOnPressOutsideParent - x: parent.width - width - y: contextButton.height - width: 160 + closePolicy: Popup.CloseOnPressOutside + x: (parent.width - width) + 26 * screenScaleFactor + y: contextButton.height - 5 * screenScaleFactor // Because shadow + width: 182 * screenScaleFactor height: contentItem.height + 2 * padding visible: false + padding: 5 * screenScaleFactor // Because shadow transformOrigin: Popup.Top contentItem: Item { - width: popup.width - 2 * popup.padding - height: childrenRect.height + 15 + width: popup.width + height: childrenRect.height + 36 * screenScaleFactor + anchors.topMargin: 10 * screenScaleFactor + anchors.bottomMargin: 10 * screenScaleFactor Button { id: sendToTopButton @@ -219,14 +229,22 @@ Item } width: parent.width enabled: OutputDevice.queuedPrintJobs[0].key != printJob.key + visible: enabled anchors.top: parent.top - anchors.topMargin: 10 + anchors.topMargin: 18 * screenScaleFactor + height: visible ? 39 * screenScaleFactor : 0 * screenScaleFactor hoverEnabled: true - background: Rectangle + background: Rectangle { opacity: sendToTopButton.down || sendToTopButton.hovered ? 1 : 0 color: UM.Theme.getColor("viewport_background") } + contentItem: Label + { + text: sendToTopButton.text + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + } } Button @@ -239,6 +257,7 @@ Item popup.close() } width: parent.width + height: 39 * screenScaleFactor anchors.top: sendToTopButton.bottom hoverEnabled: true background: Rectangle @@ -246,6 +265,12 @@ Item opacity: deleteButton.down || deleteButton.hovered ? 1 : 0 color: UM.Theme.getColor("viewport_background") } + contentItem: Label + { + text: deleteButton.text + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + } } } @@ -267,19 +292,20 @@ Item Item { id: pointedRectangle - width: parent.width -10 - height: parent.height -10 + width: parent.width - 10 * screenScaleFactor // Because of the shadow + height: parent.height - 10 * screenScaleFactor // Because of the shadow anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter Rectangle { id: point - height: 13 - width: 13 + height: 14 * screenScaleFactor + width: 14 * screenScaleFactor color: UM.Theme.getColor("setting_control") transform: Rotation { angle: 45} anchors.right: bloop.right + anchors.rightMargin: 24 y: 1 } @@ -289,9 +315,9 @@ Item color: UM.Theme.getColor("setting_control") width: parent.width anchors.top: parent.top - anchors.topMargin: 10 + anchors.topMargin: 8 * screenScaleFactor // Because of the shadow + point anchors.bottom: parent.bottom - anchors.bottomMargin: 5 + anchors.bottomMargin: 8 * screenScaleFactor // Because of the shadow } } } @@ -331,7 +357,7 @@ Item { text: modelData color: UM.Theme.getColor("viewport_background") - padding: 3 + padding: 3 * screenScaleFactor } } } @@ -353,14 +379,14 @@ Item PrintCoreConfiguration { id: leftExtruderInfo - width: Math.round(parent.width / 2) + width: Math.round(parent.width / 2) * screenScaleFactor printCoreConfiguration: printJob.configuration.extruderConfigurations[0] } PrintCoreConfiguration { id: rightExtruderInfo - width: Math.round(parent.width / 2) + width: Math.round(parent.width / 2) * screenScaleFactor printCoreConfiguration: printJob.configuration.extruderConfigurations[1] } } @@ -370,7 +396,7 @@ Item Rectangle { color: UM.Theme.getColor("viewport_background") - width: 2 + width: 2 * screenScaleFactor anchors.top: parent.top anchors.bottom: parent.bottom anchors.margins: UM.Theme.getSize("default_margin").height From 3ee9ed0cf3cb809e10f2454c072357e988a85a2b Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Thu, 13 Sep 2018 15:15:29 +0100 Subject: [PATCH 040/212] Add gyroid infill pattern. --- resources/definitions/fdmprinter.def.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 4c87a3bcf0..a4141e9c1a 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1624,7 +1624,7 @@ "infill_pattern": { "label": "Infill Pattern", - "description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction.", + "description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Gyroid, cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction.", "type": "enum", "options": { @@ -1639,7 +1639,8 @@ "concentric": "Concentric", "zigzag": "Zig Zag", "cross": "Cross", - "cross_3d": "Cross 3D" + "cross_3d": "Cross 3D", + "gyroid": "Gyroid" }, "default_value": "grid", "enabled": "infill_sparse_density > 0", From 942d20a8d888c22bb91168416b21034bac40328b Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Thu, 13 Sep 2018 16:31:07 +0200 Subject: [PATCH 041/212] Monitor Tab - Fix pause button Contributes to CL-1050 --- .../resources/qml/ClusterControlItem.qml | 2 +- .../resources/qml/PrinterVideoStream.qml | 30 ------------------- 2 files changed, 1 insertion(+), 31 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml index 76aff7103a..3362c70bc5 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml @@ -485,7 +485,7 @@ Component } contentItem: Label { - text: sendToTopButton.text + text: pauseButton.text horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter } diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml b/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml index c193d0ed71..d0213a4571 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml @@ -37,36 +37,6 @@ Item z: 999 } - // Button - // { - // id: backButton - - - // // TODO: Hardcoded sizes - // width: 20 * screenScaleFactor - // height: 20 * screenScaleFactor - - // onClicked: OutputDevice.setActiveCamera(null) - - // style: ButtonStyle - // { - // label: Item - // { - // UM.RecolorImage - // { - // anchors.verticalCenter: parent.verticalCenter - // anchors.horizontalCenter: parent.horizontalCenter - // width: control.width - // height: control.height - // sourceSize.width: width - // sourceSize.height: width - // source: UM.Theme.getIcon("cross1") - // } - // } - // background: Item {} - // } - // } - Image { id: cameraImage From 6bf91d2b3a2ea71c7bbf6869057ad5616280df97 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 14 Sep 2018 13:59:05 +0200 Subject: [PATCH 042/212] Fix updating temperature while preheating bed or extruder While preheating the bed/extruder with M190 or M109, the firmware keeps outputting temperature lines, but these do not contain "ok" because no new command was acknowledged. Fixes #3741 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 4ceda52875..39b358224c 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -313,6 +313,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): while self._connection_state == ConnectionState.connected and self._serial is not None: try: line = self._serial.readline() + print(line) except: continue @@ -326,8 +327,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if self._firmware_name is None: self.sendCommand("M115") - if (b"ok " in line and b"T:" in line) or line.startswith(b"T:") or b"ok B:" in line or line.startswith(b"B:"): # Temperature message. 'T:' for extruder and 'B:' for bed - extruder_temperature_matches = re.findall(b"T(\d*): ?([\d\.]+) ?\/?([\d\.]+)?", line) + if re.search(b"[B|T\d*]: ?\d+\.?\d*", line): # Temperature message. 'T:' for extruder and 'B:' for bed + extruder_temperature_matches = re.findall(b"T(\d*): ?(\d+\.?\d*) ?\/?(\d+\.?\d*)?", line) # Update all temperature values matched_extruder_nrs = [] for match in extruder_temperature_matches: @@ -349,7 +350,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if match[2]: extruder.updateTargetHotendTemperature(float(match[2])) - bed_temperature_matches = re.findall(b"B: ?([\d\.]+) ?\/?([\d\.]+)?", line) + bed_temperature_matches = re.findall(b"B: ?(\d+\.?\d*) ?\/?(\d+\.?\d*) ?", line) if bed_temperature_matches: match = bed_temperature_matches[0] if match[0]: From 8efc5fe345e837d00d9b64f96363cfde46efe9f2 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Fri, 14 Sep 2018 18:05:33 +0100 Subject: [PATCH 043/212] Now zig_zaggify_infill is enabled for gyroid infill. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index a4141e9c1a..cbc7f19f2f 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1655,7 +1655,7 @@ "type": "bool", "default_value": false, "value": "infill_pattern == 'cross' or infill_pattern == 'cross_3d'", - "enabled": "infill_pattern == 'lines' or infill_pattern == 'grid' or infill_pattern == 'triangles' or infill_pattern == 'trihexagon' or infill_pattern == 'cubic' or infill_pattern == 'tetrahedral' or infill_pattern == 'quarter_cubic' or infill_pattern == 'cross' or infill_pattern == 'cross_3d'", + "enabled": "infill_pattern == 'lines' or infill_pattern == 'grid' or infill_pattern == 'triangles' or infill_pattern == 'trihexagon' or infill_pattern == 'cubic' or infill_pattern == 'tetrahedral' or infill_pattern == 'quarter_cubic' or infill_pattern == 'cross' or infill_pattern == 'cross_3d' or infill_pattern == 'gyroid'", "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, From 9c865e80d113438699c34cee724d0c9945f7b8db Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 14 Sep 2018 19:15:23 +0200 Subject: [PATCH 044/212] Remove debug print --- plugins/USBPrinting/USBPrinterOutputDevice.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 39b358224c..36c5321180 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -313,7 +313,6 @@ class USBPrinterOutputDevice(PrinterOutputDevice): while self._connection_state == ConnectionState.connected and self._serial is not None: try: line = self._serial.readline() - print(line) except: continue From 5a235a59ddeb7123924acd94854edc5ac12789cb Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 20 Sep 2018 12:55:29 +0200 Subject: [PATCH 045/212] Reset send slice info and show privacy dialog CURA-5095 Because the data Cura collects has been changed. --- .../VersionUpgrade34to35/VersionUpgrade34to35.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/VersionUpgrade/VersionUpgrade34to35/VersionUpgrade34to35.py b/plugins/VersionUpgrade/VersionUpgrade34to35/VersionUpgrade34to35.py index 9e3ea03c55..40add072c9 100644 --- a/plugins/VersionUpgrade/VersionUpgrade34to35/VersionUpgrade34to35.py +++ b/plugins/VersionUpgrade/VersionUpgrade34to35/VersionUpgrade34to35.py @@ -92,6 +92,11 @@ class VersionUpgrade34to35(VersionUpgrade): parser["metadata"] = {} parser["metadata"]["setting_version"] = "5" + # Need to show the data collection agreement again because the data Cura collects has been changed. + if parser.has_option("info", "asked_send_slice_info"): + parser.remove_option("info", "asked_send_slice_info") + parser.remove_option("info", "send_slice_info") + result = io.StringIO() parser.write(result) return [filename], [result.getvalue()] From 5fc8b95425ea5d7417a5c022a8301f83bfa24e84 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 20 Sep 2018 12:59:25 +0200 Subject: [PATCH 046/212] Better data handling CURA-5095 Avoid missing sections/options --- .../VersionUpgrade34to35/VersionUpgrade34to35.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade34to35/VersionUpgrade34to35.py b/plugins/VersionUpgrade/VersionUpgrade34to35/VersionUpgrade34to35.py index 40add072c9..7acea7ab5e 100644 --- a/plugins/VersionUpgrade/VersionUpgrade34to35/VersionUpgrade34to35.py +++ b/plugins/VersionUpgrade/VersionUpgrade34to35/VersionUpgrade34to35.py @@ -86,17 +86,18 @@ class VersionUpgrade34to35(VersionUpgrade): parser = configparser.ConfigParser(interpolation = None) parser.read_string(serialized) + # Need to show the data collection agreement again because the data Cura collects has been changed. + if parser.has_option("info", "asked_send_slice_info"): + parser.remove_option("info", "asked_send_slice_info") + if parser.has_option("info", "send_slice_info"): + parser.remove_option("info", "send_slice_info") + # Update version number. parser["general"]["version"] = "6" if "metadata" not in parser: parser["metadata"] = {} parser["metadata"]["setting_version"] = "5" - # Need to show the data collection agreement again because the data Cura collects has been changed. - if parser.has_option("info", "asked_send_slice_info"): - parser.remove_option("info", "asked_send_slice_info") - parser.remove_option("info", "send_slice_info") - result = io.StringIO() parser.write(result) return [filename], [result.getvalue()] From 3830fa0fd9deb1129013087343ee340cf1befe5e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 21 Sep 2018 11:58:30 +0200 Subject: [PATCH 047/212] Initial move of the code of CuraPluginOAuth2Module CURA-5744 --- cura/OAuth2/AuthorizationHelpers.py | 127 +++++++++++++++++ cura/OAuth2/AuthorizationRequestHandler.py | 105 ++++++++++++++ cura/OAuth2/AuthorizationRequestServer.py | 25 ++++ cura/OAuth2/AuthorizationService.py | 151 +++++++++++++++++++++ cura/OAuth2/LocalAuthorizationServer.py | 67 +++++++++ cura/OAuth2/Models.py | 60 ++++++++ cura/OAuth2/__init__.py | 2 + 7 files changed, 537 insertions(+) create mode 100644 cura/OAuth2/AuthorizationHelpers.py create mode 100644 cura/OAuth2/AuthorizationRequestHandler.py create mode 100644 cura/OAuth2/AuthorizationRequestServer.py create mode 100644 cura/OAuth2/AuthorizationService.py create mode 100644 cura/OAuth2/LocalAuthorizationServer.py create mode 100644 cura/OAuth2/Models.py create mode 100644 cura/OAuth2/__init__.py diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py new file mode 100644 index 0000000000..10041f70ce --- /dev/null +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -0,0 +1,127 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. +import json +import random +from _sha512 import sha512 +from base64 import b64encode +from typing import Optional + +import requests + +# As this module is specific for Cura plugins, we can rely on these imports. +from UM.Logger import Logger + +# Plugin imports need to be relative to work in final builds. +from .models import AuthenticationResponse, UserProfile, OAuth2Settings + + +class AuthorizationHelpers: + """Class containing several helpers to deal with the authorization flow.""" + + def __init__(self, settings: "OAuth2Settings"): + self._settings = settings + self._token_url = "{}/token".format(self._settings.OAUTH_SERVER_URL) + + @property + def settings(self) -> "OAuth2Settings": + """Get the OAuth2 settings object.""" + return self._settings + + def getAccessTokenUsingAuthorizationCode(self, authorization_code: str, verification_code: str)->\ + Optional["AuthenticationResponse"]: + """ + Request the access token from the authorization server. + :param authorization_code: The authorization code from the 1st step. + :param verification_code: The verification code needed for the PKCE extension. + :return: An AuthenticationResponse object. + """ + return self.parseTokenResponse(requests.post(self._token_url, data={ + "client_id": self._settings.CLIENT_ID, + "redirect_uri": self._settings.CALLBACK_URL, + "grant_type": "authorization_code", + "code": authorization_code, + "code_verifier": verification_code, + "scope": self._settings.CLIENT_SCOPES + })) + + def getAccessTokenUsingRefreshToken(self, refresh_token: str) -> Optional["AuthenticationResponse"]: + """ + Request the access token from the authorization server using a refresh token. + :param refresh_token: + :return: An AuthenticationResponse object. + """ + return self.parseTokenResponse(requests.post(self._token_url, data={ + "client_id": self._settings.CLIENT_ID, + "redirect_uri": self._settings.CALLBACK_URL, + "grant_type": "refresh_token", + "refresh_token": refresh_token, + "scope": self._settings.CLIENT_SCOPES + })) + + @staticmethod + def parseTokenResponse(token_response: "requests.request") -> Optional["AuthenticationResponse"]: + """ + Parse the token response from the authorization server into an AuthenticationResponse object. + :param token_response: The JSON string data response from the authorization server. + :return: An AuthenticationResponse object. + """ + token_data = None + + try: + token_data = json.loads(token_response.text) + except ValueError: + Logger.log("w", "Could not parse token response data: %s", token_response.text) + + if not token_data: + return AuthenticationResponse(success=False, err_message="Could not read response.") + + if token_response.status_code not in (200, 201): + return AuthenticationResponse(success=False, err_message=token_data["error_description"]) + + return AuthenticationResponse(success=True, + token_type=token_data["token_type"], + access_token=token_data["access_token"], + refresh_token=token_data["refresh_token"], + expires_in=token_data["expires_in"], + scope=token_data["scope"]) + + def parseJWT(self, access_token: str) -> Optional["UserProfile"]: + """ + Calls the authentication API endpoint to get the token data. + :param access_token: The encoded JWT token. + :return: Dict containing some profile data. + """ + token_request = requests.get("{}/check-token".format(self._settings.OAUTH_SERVER_URL), headers = { + "Authorization": "Bearer {}".format(access_token) + }) + if token_request.status_code not in (200, 201): + Logger.log("w", "Could not retrieve token data from auth server: %s", token_request.text) + return None + user_data = token_request.json().get("data") + if not user_data or not isinstance(user_data, dict): + Logger.log("w", "Could not parse user data from token: %s", user_data) + return None + return UserProfile( + user_id = user_data["user_id"], + username = user_data["username"], + profile_image_url = user_data.get("profile_image_url", "") + ) + + @staticmethod + def generateVerificationCode(code_length: int = 16) -> str: + """ + Generate a 16-character verification code. + :param code_length: + :return: + """ + return "".join(random.choice("0123456789ABCDEF") for i in range(code_length)) + + @staticmethod + def generateVerificationCodeChallenge(verification_code: str) -> str: + """ + Generates a base64 encoded sha512 encrypted version of a given string. + :param verification_code: + :return: The encrypted code in base64 format. + """ + encoded = sha512(verification_code.encode()).digest() + return b64encode(encoded, altchars = b"_-").decode() diff --git a/cura/OAuth2/AuthorizationRequestHandler.py b/cura/OAuth2/AuthorizationRequestHandler.py new file mode 100644 index 0000000000..eb703fc5c1 --- /dev/null +++ b/cura/OAuth2/AuthorizationRequestHandler.py @@ -0,0 +1,105 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. +from typing import Optional, Callable + +from http.server import BaseHTTPRequestHandler +from urllib.parse import parse_qs, urlparse + +# Plugin imports need to be relative to work in final builds. +from .AuthorizationHelpers import AuthorizationHelpers +from .models import AuthenticationResponse, ResponseData, HTTP_STATUS, ResponseStatus + + +class AuthorizationRequestHandler(BaseHTTPRequestHandler): + """ + This handler handles all HTTP requests on the local web server. + It also requests the access token for the 2nd stage of the OAuth flow. + """ + + def __init__(self, request, client_address, server): + super().__init__(request, client_address, server) + + # These values will be injected by the HTTPServer that this handler belongs to. + self.authorization_helpers = None # type: AuthorizationHelpers + self.authorization_callback = None # type: Callable[[AuthenticationResponse], None] + self.verification_code = None # type: str + + def do_GET(self): + """Entry point for GET requests""" + + # Extract values from the query string. + parsed_url = urlparse(self.path) + query = parse_qs(parsed_url.query) + + # Handle the possible requests + if parsed_url.path == "/callback": + server_response, token_response = self._handleCallback(query) + else: + server_response = self._handleNotFound() + token_response = None + + # Send the data to the browser. + self._sendHeaders(server_response.status, server_response.content_type, server_response.redirect_uri) + + if server_response.data_stream: + # If there is data in the response, we send it. + self._sendData(server_response.data_stream) + + if token_response: + # Trigger the callback if we got a response. + # This will cause the server to shut down, so we do it at the very end of the request handling. + self.authorization_callback(token_response) + + def _handleCallback(self, query: dict) -> ("ResponseData", Optional["AuthenticationResponse"]): + """ + Handler for the callback URL redirect. + :param query: Dict containing the HTTP query parameters. + :return: HTTP ResponseData containing a success page to show to the user. + """ + if self._queryGet(query, "code"): + # If the code was returned we get the access token. + token_response = self.authorization_helpers.getAccessTokenUsingAuthorizationCode( + self._queryGet(query, "code"), self.verification_code) + + elif self._queryGet(query, "error_code") == "user_denied": + # Otherwise we show an error message (probably the user clicked "Deny" in the auth dialog). + token_response = AuthenticationResponse( + success=False, + err_message="Please give the required permissions when authorizing this application." + ) + + else: + # We don't know what went wrong here, so instruct the user to check the logs. + token_response = AuthenticationResponse( + success=False, + error_message="Something unexpected happened when trying to log in, please try again." + ) + + return ResponseData( + status=HTTP_STATUS["REDIRECT"], + data_stream=b"Redirecting...", + redirect_uri=self.authorization_helpers.settings.AUTH_SUCCESS_REDIRECT if token_response.success else + self.authorization_helpers.settings.AUTH_FAILED_REDIRECT + ), token_response + + @staticmethod + def _handleNotFound() -> "ResponseData": + """Handle all other non-existing server calls.""" + return ResponseData(status=HTTP_STATUS["NOT_FOUND"], content_type="text/html", data_stream=b"Not found.") + + def _sendHeaders(self, status: "ResponseStatus", content_type: str, redirect_uri: str = None) -> None: + """Send out the headers""" + self.send_response(status.code, status.message) + self.send_header("Content-type", content_type) + if redirect_uri: + self.send_header("Location", redirect_uri) + self.end_headers() + + def _sendData(self, data: bytes) -> None: + """Send out the data""" + self.wfile.write(data) + + @staticmethod + def _queryGet(query_data: dict, key: str, default=None) -> Optional[str]: + """Helper for getting values from a pre-parsed query string""" + return query_data.get(key, [default])[0] diff --git a/cura/OAuth2/AuthorizationRequestServer.py b/cura/OAuth2/AuthorizationRequestServer.py new file mode 100644 index 0000000000..ee428bc236 --- /dev/null +++ b/cura/OAuth2/AuthorizationRequestServer.py @@ -0,0 +1,25 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. +from http.server import HTTPServer + +from .AuthorizationHelpers import AuthorizationHelpers + + +class AuthorizationRequestServer(HTTPServer): + """ + The authorization request callback handler server. + This subclass is needed to be able to pass some data to the request handler. + This cannot be done on the request handler directly as the HTTPServer creates an instance of the handler after init. + """ + + def setAuthorizationHelpers(self, authorization_helpers: "AuthorizationHelpers") -> None: + """Set the authorization helpers instance on the request handler.""" + self.RequestHandlerClass.authorization_helpers = authorization_helpers + + def setAuthorizationCallback(self, authorization_callback) -> None: + """Set the authorization callback on the request handler.""" + self.RequestHandlerClass.authorization_callback = authorization_callback + + def setVerificationCode(self, verification_code: str) -> None: + """Set the verification code on the request handler.""" + self.RequestHandlerClass.verification_code = verification_code diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py new file mode 100644 index 0000000000..f425e3a003 --- /dev/null +++ b/cura/OAuth2/AuthorizationService.py @@ -0,0 +1,151 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. +import json +import webbrowser +from typing import Optional +from urllib.parse import urlencode + +# As this module is specific for Cura plugins, we can rely on these imports. +from UM.Logger import Logger +from UM.Signal import Signal + +# Plugin imports need to be relative to work in final builds. +from .LocalAuthorizationServer import LocalAuthorizationServer +from .AuthorizationHelpers import AuthorizationHelpers +from .models import OAuth2Settings, AuthenticationResponse, UserProfile + + +class AuthorizationService: + """ + The authorization service is responsible for handling the login flow, + storing user credentials and providing account information. + """ + + # Emit signal when authentication is completed. + onAuthStateChanged = Signal() + + # Emit signal when authentication failed. + onAuthenticationError = Signal() + + def __init__(self, preferences, settings: "OAuth2Settings"): + self._settings = settings + self._auth_helpers = AuthorizationHelpers(settings) + self._auth_url = "{}/authorize".format(self._settings.OAUTH_SERVER_URL) + self._auth_data = None # type: Optional[AuthenticationResponse] + self._user_profile = None # type: Optional[UserProfile] + self._cura_preferences = preferences + self._server = LocalAuthorizationServer(self._auth_helpers, self._onAuthStateChanged, daemon=True) + self._loadAuthData() + + def getUserProfile(self) -> Optional["UserProfile"]: + """ + Get the user data that is stored in the JWT token. + :return: Dict containing some user data. + """ + if not self._user_profile: + # If no user profile was stored locally, we try to get it from JWT. + self._user_profile = self._parseJWT() + if not self._user_profile: + # If there is still no user profile from the JWT, we have to log in again. + return None + return self._user_profile + + def _parseJWT(self) -> Optional["UserProfile"]: + """ + Tries to parse the JWT if all the needed data exists. + :return: UserProfile if found, otherwise None. + """ + if not self._auth_data: + # If no auth data exists, we should always log in again. + return None + user_data = self._auth_helpers.parseJWT(self._auth_data.access_token) + if user_data: + # If the profile was found, we return it immediately. + return user_data + # The JWT was expired or invalid and we should request a new one. + self._auth_data = self._auth_helpers.getAccessTokenUsingRefreshToken(self._auth_data.refresh_token) + if not self._auth_data: + # The token could not be refreshed using the refresh token. We should login again. + return None + return self._auth_helpers.parseJWT(self._auth_data.access_token) + + def getAccessToken(self) -> Optional[str]: + """ + Get the access token response data. + :return: Dict containing token data. + """ + if not self.getUserProfile(): + # We check if we can get the user profile. + # If we can't get it, that means the access token (JWT) was invalid or expired. + return None + return self._auth_data.access_token + + def refreshAccessToken(self) -> None: + """ + Refresh the access token when it expired. + """ + self._storeAuthData(self._auth_helpers.getAccessTokenUsingRefreshToken(self._auth_data.refresh_token)) + self.onAuthStateChanged.emit(logged_in=True) + + def deleteAuthData(self): + """Delete authentication data from preferences and locally.""" + self._storeAuthData() + self.onAuthStateChanged.emit(logged_in=False) + + def startAuthorizationFlow(self) -> None: + """Start a new OAuth2 authorization flow.""" + + Logger.log("d", "Starting new OAuth2 flow...") + + # Create the tokens needed for the code challenge (PKCE) extension for OAuth2. + # This is needed because the CuraDrivePlugin is a untrusted (open source) client. + # More details can be found at https://tools.ietf.org/html/rfc7636. + verification_code = self._auth_helpers.generateVerificationCode() + challenge_code = self._auth_helpers.generateVerificationCodeChallenge(verification_code) + + # Create the query string needed for the OAuth2 flow. + query_string = urlencode({ + "client_id": self._settings.CLIENT_ID, + "redirect_uri": self._settings.CALLBACK_URL, + "scope": self._settings.CLIENT_SCOPES, + "response_type": "code", + "state": "CuraDriveIsAwesome", + "code_challenge": challenge_code, + "code_challenge_method": "S512" + }) + + # Open the authorization page in a new browser window. + webbrowser.open_new("{}?{}".format(self._auth_url, query_string)) + + # Start a local web server to receive the callback URL on. + self._server.start(verification_code) + + def _onAuthStateChanged(self, auth_response: "AuthenticationResponse") -> None: + """Callback method for an authentication flow.""" + if auth_response.success: + self._storeAuthData(auth_response) + self.onAuthStateChanged.emit(logged_in=True) + else: + self.onAuthenticationError.emit(logged_in=False, error_message=auth_response.err_message) + self._server.stop() # Stop the web server at all times. + + def _loadAuthData(self) -> None: + """Load authentication data from preferences if available.""" + self._cura_preferences.addPreference(self._settings.AUTH_DATA_PREFERENCE_KEY, "{}") + try: + preferences_data = json.loads(self._cura_preferences.getValue(self._settings.AUTH_DATA_PREFERENCE_KEY)) + if preferences_data: + self._auth_data = AuthenticationResponse(**preferences_data) + self.onAuthStateChanged.emit(logged_in=True) + except ValueError as err: + Logger.log("w", "Could not load auth data from preferences: %s", err) + + def _storeAuthData(self, auth_data: Optional["AuthenticationResponse"] = None) -> None: + """Store authentication data in preferences and locally.""" + self._auth_data = auth_data + if auth_data: + self._user_profile = self.getUserProfile() + self._cura_preferences.setValue(self._settings.AUTH_DATA_PREFERENCE_KEY, json.dumps(vars(auth_data))) + else: + self._user_profile = None + self._cura_preferences.resetPreference(self._settings.AUTH_DATA_PREFERENCE_KEY) diff --git a/cura/OAuth2/LocalAuthorizationServer.py b/cura/OAuth2/LocalAuthorizationServer.py new file mode 100644 index 0000000000..5dc05786bf --- /dev/null +++ b/cura/OAuth2/LocalAuthorizationServer.py @@ -0,0 +1,67 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. +import threading +from http.server import HTTPServer +from typing import Optional, Callable + +# As this module is specific for Cura plugins, we can rely on these imports. +from UM.Logger import Logger + +# Plugin imports need to be relative to work in final builds. +from .AuthorizationHelpers import AuthorizationHelpers +from .AuthorizationRequestServer import AuthorizationRequestServer +from .AuthorizationRequestHandler import AuthorizationRequestHandler +from .models import AuthenticationResponse + + +class LocalAuthorizationServer: + def __init__(self, auth_helpers: "AuthorizationHelpers", + auth_state_changed_callback: "Callable[[AuthenticationResponse], any]", + daemon: bool): + """ + :param auth_helpers: An instance of the authorization helpers class. + :param auth_state_changed_callback: A callback function to be called when the authorization state changes. + :param daemon: Whether the server thread should be run in daemon mode. Note: Daemon threads are abruptly stopped + at shutdown. Their resources (e.g. open files) may never be released. + """ + self._web_server = None # type: Optional[HTTPServer] + self._web_server_thread = None # type: Optional[threading.Thread] + self._web_server_port = auth_helpers.settings.CALLBACK_PORT + self._auth_helpers = auth_helpers + self._auth_state_changed_callback = auth_state_changed_callback + self._daemon = daemon + + def start(self, verification_code: "str") -> None: + """ + Starts the local web server to handle the authorization callback. + :param verification_code: The verification code part of the OAuth2 client identification. + """ + if self._web_server: + # If the server is already running (because of a previously aborted auth flow), we don't have to start it. + # We still inject the new verification code though. + self._web_server.setVerificationCode(verification_code) + return + + Logger.log("d", "Starting local web server to handle authorization callback on port %s", + self._web_server_port) + + # Create the server and inject the callback and code. + self._web_server = AuthorizationRequestServer(("0.0.0.0", self._web_server_port), + AuthorizationRequestHandler) + self._web_server.setAuthorizationHelpers(self._auth_helpers) + self._web_server.setAuthorizationCallback(self._auth_state_changed_callback) + self._web_server.setVerificationCode(verification_code) + + # Start the server on a new thread. + self._web_server_thread = threading.Thread(None, self._web_server.serve_forever, daemon = self._daemon) + self._web_server_thread.start() + + def stop(self) -> None: + """ Stops the web server if it was running. Also deletes the objects. """ + + Logger.log("d", "Stopping local web server...") + + if self._web_server: + self._web_server.server_close() + self._web_server = None + self._web_server_thread = None diff --git a/cura/OAuth2/Models.py b/cura/OAuth2/Models.py new file mode 100644 index 0000000000..08bed7e6d9 --- /dev/null +++ b/cura/OAuth2/Models.py @@ -0,0 +1,60 @@ +# Copyright (c) 2018 Ultimaker B.V. +from typing import Optional + + +class BaseModel: + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +# OAuth OAuth2Settings data template. +class OAuth2Settings(BaseModel): + CALLBACK_PORT = None # type: Optional[str] + OAUTH_SERVER_URL = None # type: Optional[str] + CLIENT_ID = None # type: Optional[str] + CLIENT_SCOPES = None # type: Optional[str] + CALLBACK_URL = None # type: Optional[str] + AUTH_DATA_PREFERENCE_KEY = None # type: Optional[str] + AUTH_SUCCESS_REDIRECT = "https://ultimaker.com" # type: str + AUTH_FAILED_REDIRECT = "https://ultimaker.com" # type: str + + +# User profile data template. +class UserProfile(BaseModel): + user_id = None # type: Optional[str] + username = None # type: Optional[str] + profile_image_url = None # type: Optional[str] + + +# Authentication data template. +class AuthenticationResponse(BaseModel): + """Data comes from the token response with success flag and error message added.""" + success = True # type: bool + token_type = None # type: Optional[str] + access_token = None # type: Optional[str] + refresh_token = None # type: Optional[str] + expires_in = None # type: Optional[str] + scope = None # type: Optional[str] + err_message = None # type: Optional[str] + + +# Response status template. +class ResponseStatus(BaseModel): + code = 200 # type: int + message = "" # type str + + +# Response data template. +class ResponseData(BaseModel): + status = None # type: Optional[ResponseStatus] + data_stream = None # type: Optional[bytes] + redirect_uri = None # type: Optional[str] + content_type = "text/html" # type: str + + +# Possible HTTP responses. +HTTP_STATUS = { + "OK": ResponseStatus(code=200, message="OK"), + "NOT_FOUND": ResponseStatus(code=404, message="NOT FOUND"), + "REDIRECT": ResponseStatus(code=302, message="REDIRECT") +} diff --git a/cura/OAuth2/__init__.py b/cura/OAuth2/__init__.py new file mode 100644 index 0000000000..f3f6970c54 --- /dev/null +++ b/cura/OAuth2/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. From 3ae223334f550474e536600ff3519385e18241eb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 21 Sep 2018 12:02:11 +0200 Subject: [PATCH 048/212] Removed relative imports Since the oauth module isn't just in a plugin anymore, there is no need for any of the relative imports CURA-5744 --- cura/OAuth2/AuthorizationHelpers.py | 4 +--- cura/OAuth2/AuthorizationRequestHandler.py | 5 ++--- cura/OAuth2/AuthorizationRequestServer.py | 2 +- cura/OAuth2/AuthorizationService.py | 6 +++--- cura/OAuth2/LocalAuthorizationServer.py | 8 ++++---- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py index 10041f70ce..a122290c38 100644 --- a/cura/OAuth2/AuthorizationHelpers.py +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -8,11 +8,9 @@ from typing import Optional import requests -# As this module is specific for Cura plugins, we can rely on these imports. from UM.Logger import Logger -# Plugin imports need to be relative to work in final builds. -from .models import AuthenticationResponse, UserProfile, OAuth2Settings +from cura.OAuth2.Models import AuthenticationResponse, UserProfile, OAuth2Settings class AuthorizationHelpers: diff --git a/cura/OAuth2/AuthorizationRequestHandler.py b/cura/OAuth2/AuthorizationRequestHandler.py index eb703fc5c1..923787d33f 100644 --- a/cura/OAuth2/AuthorizationRequestHandler.py +++ b/cura/OAuth2/AuthorizationRequestHandler.py @@ -5,9 +5,8 @@ from typing import Optional, Callable from http.server import BaseHTTPRequestHandler from urllib.parse import parse_qs, urlparse -# Plugin imports need to be relative to work in final builds. -from .AuthorizationHelpers import AuthorizationHelpers -from .models import AuthenticationResponse, ResponseData, HTTP_STATUS, ResponseStatus +from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers +from cura.OAuth2.Models import AuthenticationResponse, ResponseData, HTTP_STATUS, ResponseStatus class AuthorizationRequestHandler(BaseHTTPRequestHandler): diff --git a/cura/OAuth2/AuthorizationRequestServer.py b/cura/OAuth2/AuthorizationRequestServer.py index ee428bc236..270c558167 100644 --- a/cura/OAuth2/AuthorizationRequestServer.py +++ b/cura/OAuth2/AuthorizationRequestServer.py @@ -2,7 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. from http.server import HTTPServer -from .AuthorizationHelpers import AuthorizationHelpers +from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers class AuthorizationRequestServer(HTTPServer): diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index f425e3a003..eb68d5c0a4 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -10,9 +10,9 @@ from UM.Logger import Logger from UM.Signal import Signal # Plugin imports need to be relative to work in final builds. -from .LocalAuthorizationServer import LocalAuthorizationServer -from .AuthorizationHelpers import AuthorizationHelpers -from .models import OAuth2Settings, AuthenticationResponse, UserProfile +from cura.OAuth2.LocalAuthorizationServer import LocalAuthorizationServer +from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers +from cura.OAuth2.Models import OAuth2Settings, AuthenticationResponse, UserProfile class AuthorizationService: diff --git a/cura/OAuth2/LocalAuthorizationServer.py b/cura/OAuth2/LocalAuthorizationServer.py index 5dc05786bf..9979eaaa08 100644 --- a/cura/OAuth2/LocalAuthorizationServer.py +++ b/cura/OAuth2/LocalAuthorizationServer.py @@ -8,10 +8,10 @@ from typing import Optional, Callable from UM.Logger import Logger # Plugin imports need to be relative to work in final builds. -from .AuthorizationHelpers import AuthorizationHelpers -from .AuthorizationRequestServer import AuthorizationRequestServer -from .AuthorizationRequestHandler import AuthorizationRequestHandler -from .models import AuthenticationResponse +from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers +from cura.OAuth2.AuthorizationRequestServer import AuthorizationRequestServer +from cura.OAuth2.AuthorizationRequestHandler import AuthorizationRequestHandler +from cura.OAuth2.Models import AuthenticationResponse class LocalAuthorizationServer: From d0fc4878c29a04bbcfcb289775d93a04b62b9517 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 21 Sep 2018 13:54:37 +0200 Subject: [PATCH 049/212] Fix number of mypy mistakes CURA-5744 --- cura/OAuth2/AuthorizationHelpers.py | 9 ++++----- cura/OAuth2/AuthorizationRequestHandler.py | 11 ++++++----- cura/OAuth2/AuthorizationService.py | 18 ++++++++++++++---- cura/OAuth2/LocalAuthorizationServer.py | 13 ++++++++----- cura/OAuth2/Models.py | 2 +- 5 files changed, 33 insertions(+), 20 deletions(-) diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py index a122290c38..06cc0a6061 100644 --- a/cura/OAuth2/AuthorizationHelpers.py +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -16,7 +16,7 @@ from cura.OAuth2.Models import AuthenticationResponse, UserProfile, OAuth2Settin class AuthorizationHelpers: """Class containing several helpers to deal with the authorization flow.""" - def __init__(self, settings: "OAuth2Settings"): + def __init__(self, settings: "OAuth2Settings") -> None: self._settings = settings self._token_url = "{}/token".format(self._settings.OAUTH_SERVER_URL) @@ -25,8 +25,7 @@ class AuthorizationHelpers: """Get the OAuth2 settings object.""" return self._settings - def getAccessTokenUsingAuthorizationCode(self, authorization_code: str, verification_code: str)->\ - Optional["AuthenticationResponse"]: + def getAccessTokenUsingAuthorizationCode(self, authorization_code: str, verification_code: str)-> "AuthenticationResponse": """ Request the access token from the authorization server. :param authorization_code: The authorization code from the 1st step. @@ -42,7 +41,7 @@ class AuthorizationHelpers: "scope": self._settings.CLIENT_SCOPES })) - def getAccessTokenUsingRefreshToken(self, refresh_token: str) -> Optional["AuthenticationResponse"]: + def getAccessTokenUsingRefreshToken(self, refresh_token: str) -> AuthenticationResponse: """ Request the access token from the authorization server using a refresh token. :param refresh_token: @@ -57,7 +56,7 @@ class AuthorizationHelpers: })) @staticmethod - def parseTokenResponse(token_response: "requests.request") -> Optional["AuthenticationResponse"]: + def parseTokenResponse(token_response: requests.models.Response) -> AuthenticationResponse: """ Parse the token response from the authorization server into an AuthenticationResponse object. :param token_response: The JSON string data response from the authorization server. diff --git a/cura/OAuth2/AuthorizationRequestHandler.py b/cura/OAuth2/AuthorizationRequestHandler.py index 923787d33f..d13639c45d 100644 --- a/cura/OAuth2/AuthorizationRequestHandler.py +++ b/cura/OAuth2/AuthorizationRequestHandler.py @@ -1,6 +1,6 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Optional, Callable +from typing import Optional, Callable, Tuple, Dict, Any, List from http.server import BaseHTTPRequestHandler from urllib.parse import parse_qs, urlparse @@ -49,16 +49,17 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): # This will cause the server to shut down, so we do it at the very end of the request handling. self.authorization_callback(token_response) - def _handleCallback(self, query: dict) -> ("ResponseData", Optional["AuthenticationResponse"]): + def _handleCallback(self, query: Dict[Any, List]) -> Tuple["ResponseData", Optional["AuthenticationResponse"]]: """ Handler for the callback URL redirect. :param query: Dict containing the HTTP query parameters. :return: HTTP ResponseData containing a success page to show to the user. """ - if self._queryGet(query, "code"): + code = self._queryGet(query, "code") + if code: # If the code was returned we get the access token. token_response = self.authorization_helpers.getAccessTokenUsingAuthorizationCode( - self._queryGet(query, "code"), self.verification_code) + code, self.verification_code) elif self._queryGet(query, "error_code") == "user_denied": # Otherwise we show an error message (probably the user clicked "Deny" in the auth dialog). @@ -99,6 +100,6 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): self.wfile.write(data) @staticmethod - def _queryGet(query_data: dict, key: str, default=None) -> Optional[str]: + def _queryGet(query_data: Dict[Any, List], key: str, default=None) -> Optional[str]: """Helper for getting values from a pre-parsed query string""" return query_data.get(key, [default])[0] diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index eb68d5c0a4..4c66170c32 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -27,7 +27,7 @@ class AuthorizationService: # Emit signal when authentication failed. onAuthenticationError = Signal() - def __init__(self, preferences, settings: "OAuth2Settings"): + def __init__(self, preferences, settings: "OAuth2Settings") -> None: self._settings = settings self._auth_helpers = AuthorizationHelpers(settings) self._auth_url = "{}/authorize".format(self._settings.OAUTH_SERVER_URL) @@ -55,7 +55,7 @@ class AuthorizationService: Tries to parse the JWT if all the needed data exists. :return: UserProfile if found, otherwise None. """ - if not self._auth_data: + if not self._auth_data or self._auth_data.access_token is None: # If no auth data exists, we should always log in again. return None user_data = self._auth_helpers.parseJWT(self._auth_data.access_token) @@ -63,10 +63,13 @@ class AuthorizationService: # If the profile was found, we return it immediately. return user_data # The JWT was expired or invalid and we should request a new one. + if self._auth_data.refresh_token is None: + return None self._auth_data = self._auth_helpers.getAccessTokenUsingRefreshToken(self._auth_data.refresh_token) - if not self._auth_data: + if not self._auth_data or self._auth_data.access_token is None: # The token could not be refreshed using the refresh token. We should login again. return None + return self._auth_helpers.parseJWT(self._auth_data.access_token) def getAccessToken(self) -> Optional[str]: @@ -78,16 +81,23 @@ class AuthorizationService: # We check if we can get the user profile. # If we can't get it, that means the access token (JWT) was invalid or expired. return None + + if self._auth_data is None: + return None + return self._auth_data.access_token def refreshAccessToken(self) -> None: """ Refresh the access token when it expired. """ + if self._auth_data is None or self._auth_data.refresh_token is None: + Logger.log("w", "Unable to refresh acces token, since there is no refresh token.") + return self._storeAuthData(self._auth_helpers.getAccessTokenUsingRefreshToken(self._auth_data.refresh_token)) self.onAuthStateChanged.emit(logged_in=True) - def deleteAuthData(self): + def deleteAuthData(self) -> None: """Delete authentication data from preferences and locally.""" self._storeAuthData() self.onAuthStateChanged.emit(logged_in=False) diff --git a/cura/OAuth2/LocalAuthorizationServer.py b/cura/OAuth2/LocalAuthorizationServer.py index 9979eaaa08..d6a4bf5216 100644 --- a/cura/OAuth2/LocalAuthorizationServer.py +++ b/cura/OAuth2/LocalAuthorizationServer.py @@ -2,7 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. import threading from http.server import HTTPServer -from typing import Optional, Callable +from typing import Optional, Callable, Any # As this module is specific for Cura plugins, we can rely on these imports. from UM.Logger import Logger @@ -16,22 +16,22 @@ from cura.OAuth2.Models import AuthenticationResponse class LocalAuthorizationServer: def __init__(self, auth_helpers: "AuthorizationHelpers", - auth_state_changed_callback: "Callable[[AuthenticationResponse], any]", - daemon: bool): + auth_state_changed_callback: "Callable[[AuthenticationResponse], Any]", + daemon: bool) -> None: """ :param auth_helpers: An instance of the authorization helpers class. :param auth_state_changed_callback: A callback function to be called when the authorization state changes. :param daemon: Whether the server thread should be run in daemon mode. Note: Daemon threads are abruptly stopped at shutdown. Their resources (e.g. open files) may never be released. """ - self._web_server = None # type: Optional[HTTPServer] + self._web_server = None # type: Optional[AuthorizationRequestServer] self._web_server_thread = None # type: Optional[threading.Thread] self._web_server_port = auth_helpers.settings.CALLBACK_PORT self._auth_helpers = auth_helpers self._auth_state_changed_callback = auth_state_changed_callback self._daemon = daemon - def start(self, verification_code: "str") -> None: + def start(self, verification_code: str) -> None: """ Starts the local web server to handle the authorization callback. :param verification_code: The verification code part of the OAuth2 client identification. @@ -42,6 +42,9 @@ class LocalAuthorizationServer: self._web_server.setVerificationCode(verification_code) return + if self._web_server_port is None: + raise Exception("Unable to start server without specifying the port.") + Logger.log("d", "Starting local web server to handle authorization callback on port %s", self._web_server_port) diff --git a/cura/OAuth2/Models.py b/cura/OAuth2/Models.py index 08bed7e6d9..a6b91cae26 100644 --- a/cura/OAuth2/Models.py +++ b/cura/OAuth2/Models.py @@ -9,7 +9,7 @@ class BaseModel: # OAuth OAuth2Settings data template. class OAuth2Settings(BaseModel): - CALLBACK_PORT = None # type: Optional[str] + CALLBACK_PORT = None # type: Optional[int] OAUTH_SERVER_URL = None # type: Optional[str] CLIENT_ID = None # type: Optional[str] CLIENT_SCOPES = None # type: Optional[str] From 060ea0b762ae6dce1a1f041f56c7617346be118a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 21 Sep 2018 14:12:31 +0200 Subject: [PATCH 050/212] Fixed up final bit of mypy issues CURA-5744 --- cura/OAuth2/AuthorizationRequestHandler.py | 27 +++++++++++++--------- cura/OAuth2/AuthorizationRequestServer.py | 13 +++++++---- cura/OAuth2/AuthorizationService.py | 16 ++++++------- cura/OAuth2/LocalAuthorizationServer.py | 13 +++++------ cura/OAuth2/Models.py | 2 +- 5 files changed, 39 insertions(+), 32 deletions(-) diff --git a/cura/OAuth2/AuthorizationRequestHandler.py b/cura/OAuth2/AuthorizationRequestHandler.py index d13639c45d..0558db784f 100644 --- a/cura/OAuth2/AuthorizationRequestHandler.py +++ b/cura/OAuth2/AuthorizationRequestHandler.py @@ -1,12 +1,15 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Optional, Callable, Tuple, Dict, Any, List +from typing import Optional, Callable, Tuple, Dict, Any, List, TYPE_CHECKING from http.server import BaseHTTPRequestHandler from urllib.parse import parse_qs, urlparse from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers -from cura.OAuth2.Models import AuthenticationResponse, ResponseData, HTTP_STATUS, ResponseStatus +from cura.OAuth2.Models import AuthenticationResponse, ResponseData, HTTP_STATUS + +if TYPE_CHECKING: + from cura.OAuth2.Models import ResponseStatus class AuthorizationRequestHandler(BaseHTTPRequestHandler): @@ -15,15 +18,15 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): It also requests the access token for the 2nd stage of the OAuth flow. """ - def __init__(self, request, client_address, server): + def __init__(self, request, client_address, server) -> None: super().__init__(request, client_address, server) # These values will be injected by the HTTPServer that this handler belongs to. - self.authorization_helpers = None # type: AuthorizationHelpers - self.authorization_callback = None # type: Callable[[AuthenticationResponse], None] - self.verification_code = None # type: str + self.authorization_helpers = None # type: Optional[AuthorizationHelpers] + self.authorization_callback = None # type: Optional[Callable[[AuthenticationResponse], None]] + self.verification_code = None # type: Optional[str] - def do_GET(self): + def do_GET(self) -> None: """Entry point for GET requests""" # Extract values from the query string. @@ -44,7 +47,7 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): # If there is data in the response, we send it. self._sendData(server_response.data_stream) - if token_response: + if token_response and self.authorization_callback is not None: # Trigger the callback if we got a response. # This will cause the server to shut down, so we do it at the very end of the request handling. self.authorization_callback(token_response) @@ -56,7 +59,7 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): :return: HTTP ResponseData containing a success page to show to the user. """ code = self._queryGet(query, "code") - if code: + if code and self.authorization_helpers is not None and self.verification_code is not None: # If the code was returned we get the access token. token_response = self.authorization_helpers.getAccessTokenUsingAuthorizationCode( code, self.verification_code) @@ -74,6 +77,8 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): success=False, error_message="Something unexpected happened when trying to log in, please try again." ) + if self.authorization_helpers is None: + return ResponseData(), token_response return ResponseData( status=HTTP_STATUS["REDIRECT"], @@ -83,7 +88,7 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): ), token_response @staticmethod - def _handleNotFound() -> "ResponseData": + def _handleNotFound() -> ResponseData: """Handle all other non-existing server calls.""" return ResponseData(status=HTTP_STATUS["NOT_FOUND"], content_type="text/html", data_stream=b"Not found.") @@ -100,6 +105,6 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): self.wfile.write(data) @staticmethod - def _queryGet(query_data: Dict[Any, List], key: str, default=None) -> Optional[str]: + def _queryGet(query_data: Dict[Any, List], key: str, default: Optional[str]=None) -> Optional[str]: """Helper for getting values from a pre-parsed query string""" return query_data.get(key, [default])[0] diff --git a/cura/OAuth2/AuthorizationRequestServer.py b/cura/OAuth2/AuthorizationRequestServer.py index 270c558167..514a4ab5de 100644 --- a/cura/OAuth2/AuthorizationRequestServer.py +++ b/cura/OAuth2/AuthorizationRequestServer.py @@ -1,8 +1,11 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from http.server import HTTPServer +from typing import Callable, Any, TYPE_CHECKING -from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers +if TYPE_CHECKING: + from cura.OAuth2.Models import AuthenticationResponse + from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers class AuthorizationRequestServer(HTTPServer): @@ -14,12 +17,12 @@ class AuthorizationRequestServer(HTTPServer): def setAuthorizationHelpers(self, authorization_helpers: "AuthorizationHelpers") -> None: """Set the authorization helpers instance on the request handler.""" - self.RequestHandlerClass.authorization_helpers = authorization_helpers + self.RequestHandlerClass.authorization_helpers = authorization_helpers # type: ignore - def setAuthorizationCallback(self, authorization_callback) -> None: + def setAuthorizationCallback(self, authorization_callback: Callable[["AuthenticationResponse"], Any]) -> None: """Set the authorization callback on the request handler.""" - self.RequestHandlerClass.authorization_callback = authorization_callback + self.RequestHandlerClass.authorization_callback = authorization_callback # type: ignore def setVerificationCode(self, verification_code: str) -> None: """Set the verification code on the request handler.""" - self.RequestHandlerClass.verification_code = verification_code + self.RequestHandlerClass.verification_code = verification_code # type: ignore diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 4c66170c32..33ea419ff5 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -2,17 +2,18 @@ # Cura is released under the terms of the LGPLv3 or higher. import json import webbrowser -from typing import Optional +from typing import Optional, TYPE_CHECKING from urllib.parse import urlencode -# As this module is specific for Cura plugins, we can rely on these imports. from UM.Logger import Logger from UM.Signal import Signal -# Plugin imports need to be relative to work in final builds. from cura.OAuth2.LocalAuthorizationServer import LocalAuthorizationServer from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers -from cura.OAuth2.Models import OAuth2Settings, AuthenticationResponse, UserProfile +from cura.OAuth2.Models import AuthenticationResponse + +if TYPE_CHECKING: + from cura.OAuth2.Models import UserProfile, OAuth2Settings class AuthorizationService: @@ -32,7 +33,7 @@ class AuthorizationService: self._auth_helpers = AuthorizationHelpers(settings) self._auth_url = "{}/authorize".format(self._settings.OAUTH_SERVER_URL) self._auth_data = None # type: Optional[AuthenticationResponse] - self._user_profile = None # type: Optional[UserProfile] + self._user_profile = None # type: Optional["UserProfile"] self._cura_preferences = preferences self._server = LocalAuthorizationServer(self._auth_helpers, self._onAuthStateChanged, daemon=True) self._loadAuthData() @@ -75,7 +76,6 @@ class AuthorizationService: def getAccessToken(self) -> Optional[str]: """ Get the access token response data. - :return: Dict containing token data. """ if not self.getUserProfile(): # We check if we can get the user profile. @@ -130,7 +130,7 @@ class AuthorizationService: # Start a local web server to receive the callback URL on. self._server.start(verification_code) - def _onAuthStateChanged(self, auth_response: "AuthenticationResponse") -> None: + def _onAuthStateChanged(self, auth_response: AuthenticationResponse) -> None: """Callback method for an authentication flow.""" if auth_response.success: self._storeAuthData(auth_response) @@ -150,7 +150,7 @@ class AuthorizationService: except ValueError as err: Logger.log("w", "Could not load auth data from preferences: %s", err) - def _storeAuthData(self, auth_data: Optional["AuthenticationResponse"] = None) -> None: + def _storeAuthData(self, auth_data: Optional[AuthenticationResponse] = None) -> None: """Store authentication data in preferences and locally.""" self._auth_data = auth_data if auth_data: diff --git a/cura/OAuth2/LocalAuthorizationServer.py b/cura/OAuth2/LocalAuthorizationServer.py index d6a4bf5216..d1d07b5c91 100644 --- a/cura/OAuth2/LocalAuthorizationServer.py +++ b/cura/OAuth2/LocalAuthorizationServer.py @@ -1,22 +1,21 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import threading -from http.server import HTTPServer -from typing import Optional, Callable, Any +from typing import Optional, Callable, Any, TYPE_CHECKING -# As this module is specific for Cura plugins, we can rely on these imports. from UM.Logger import Logger -# Plugin imports need to be relative to work in final builds. from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers from cura.OAuth2.AuthorizationRequestServer import AuthorizationRequestServer from cura.OAuth2.AuthorizationRequestHandler import AuthorizationRequestHandler -from cura.OAuth2.Models import AuthenticationResponse + +if TYPE_CHECKING: + from cura.OAuth2.Models import AuthenticationResponse class LocalAuthorizationServer: def __init__(self, auth_helpers: "AuthorizationHelpers", - auth_state_changed_callback: "Callable[[AuthenticationResponse], Any]", + auth_state_changed_callback: Callable[["AuthenticationResponse"], Any], daemon: bool) -> None: """ :param auth_helpers: An instance of the authorization helpers class. @@ -62,7 +61,7 @@ class LocalAuthorizationServer: def stop(self) -> None: """ Stops the web server if it was running. Also deletes the objects. """ - Logger.log("d", "Stopping local web server...") + Logger.log("d", "Stopping local oauth2 web server...") if self._web_server: self._web_server.server_close() diff --git a/cura/OAuth2/Models.py b/cura/OAuth2/Models.py index a6b91cae26..796fdf8746 100644 --- a/cura/OAuth2/Models.py +++ b/cura/OAuth2/Models.py @@ -46,7 +46,7 @@ class ResponseStatus(BaseModel): # Response data template. class ResponseData(BaseModel): - status = None # type: Optional[ResponseStatus] + status = None # type: ResponseStatus data_stream = None # type: Optional[bytes] redirect_uri = None # type: Optional[str] content_type = "text/html" # type: str From b54383e685a0fc5909a4a3f3c9a3d414bf0e8c44 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 21 Sep 2018 16:43:32 +0200 Subject: [PATCH 051/212] Added account object to API CURA-5744 --- cura/API/Account.py | 88 +++++++++++++++++++++++++++++ cura/API/__init__.py | 5 +- cura/OAuth2/AuthorizationService.py | 1 + 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 cura/API/Account.py diff --git a/cura/API/Account.py b/cura/API/Account.py new file mode 100644 index 0000000000..377464f438 --- /dev/null +++ b/cura/API/Account.py @@ -0,0 +1,88 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. +from typing import Tuple, Optional, Dict + +from PyQt5.QtCore.QObject import QObject, pyqtSignal, pyqtSlot, pyqtProperty + +from UM.Message import Message +from cura.OAuth2.AuthorizationService import AuthorizationService +from cura.OAuth2.Models import OAuth2Settings +from UM.Application import Application + +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("cura") + + +## The account API provides a version-proof bridge to use Ultimaker Accounts +# +# Usage: +# ``from cura.API import CuraAPI +# api = CuraAPI() +# api.account.login() +# api.account.logout() +# api.account.userProfile # Who is logged in`` +# +class Account(QObject): + # Signal emitted when user logged in or out. + loginStateChanged = pyqtSignal() + + def __init__(self, parent = None) -> None: + super().__init__(parent) + self._callback_port = 32118 + self._oauth_root = "https://account.ultimaker.com" + self._cloud_api_root = "https://api.ultimaker.com" + + self._oauth_settings = OAuth2Settings( + OAUTH_SERVER_URL= self._oauth_root, + CALLBACK_PORT=self._callback_port, + CALLBACK_URL="http://localhost:{}/callback".format(self._callback_port), + CLIENT_ID="um---------------ultimaker_cura_drive_plugin", + CLIENT_SCOPES="user.read drive.backups.read drive.backups.write", + AUTH_DATA_PREFERENCE_KEY="cura_drive/auth_data", + AUTH_SUCCESS_REDIRECT="{}/cura-drive/v1/auth-success".format(self._cloud_api_root), + AUTH_FAILED_REDIRECT="{}/cura-drive/v1/auth-error".format(self._cloud_api_root) + ) + + self._authorization_service = AuthorizationService(Application.getInstance().getPreferences(), self._oauth_settings) + + self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged) + self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged) + + self._error_message = None + self._logged_in = False + + @pyqtProperty(bool, notify=loginStateChanged) + def isLoggedIn(self) -> bool: + return self._logged_in + + def _onLoginStateChanged(self, logged_in: bool = False, error_message: Optional[str] = None) -> None: + if error_message: + if self._error_message: + self._error_message.hide() + self._error_message = Message(error_message, title = i18n_catalog.i18nc("@info:title", "Login failed")) + self._error_message.show() + + if self._logged_in != logged_in: + self._logged_in = logged_in + self.loginStateChanged.emit() + + def login(self) -> None: + if self._logged_in: + # Nothing to do, user already logged in. + return + self._authorization_service.startAuthorizationFlow() + + # Get the profile of the logged in user + # @returns None if no user is logged in, a dict containing user_id, username and profile_image_url + @pyqtProperty("QVariantMap", notify = loginStateChanged) + def userProfile(self) -> Optional[Dict[str, Optional[str]]]: + user_profile = self._authorization_service.getUserProfile() + if not user_profile: + return None + return user_profile.__dict__ + + def logout(self) -> None: + if not self._logged_in: + return # Nothing to do, user isn't logged in. + + self._authorization_service.deleteAuthData() diff --git a/cura/API/__init__.py b/cura/API/__init__.py index 64d636903d..d6d9092219 100644 --- a/cura/API/__init__.py +++ b/cura/API/__init__.py @@ -3,6 +3,8 @@ from UM.PluginRegistry import PluginRegistry from cura.API.Backups import Backups from cura.API.Interface import Interface +from cura.API.Account import Account + ## The official Cura API that plug-ins can use to interact with Cura. # @@ -10,7 +12,6 @@ from cura.API.Interface import Interface # this API provides a version-safe interface with proper deprecation warnings # etc. Usage of any other methods than the ones provided in this API can cause # plug-ins to be unstable. - class CuraAPI: # For now we use the same API version to be consistent. @@ -21,3 +22,5 @@ class CuraAPI: # Interface API interface = Interface() + + account = Account() diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 33ea419ff5..868dbe8034 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -49,6 +49,7 @@ class AuthorizationService: if not self._user_profile: # If there is still no user profile from the JWT, we have to log in again. return None + return self._user_profile def _parseJWT(self) -> Optional["UserProfile"]: From 081b2a28fe6a3b6d8136ec6e8bc67745262e9ede Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 21 Sep 2018 17:23:30 +0200 Subject: [PATCH 052/212] Expose Account API to QML This is done by adding the API as an SingletonType to Cura. CURA-5744 --- cura/API/Account.py | 18 +++++++++++++++++- cura/API/__init__.py | 10 ++++++++-- cura/CuraApplication.py | 10 ++++++++++ resources/qml/Cura.qml | 3 +-- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index 377464f438..7ccd995be3 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -2,7 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. from typing import Tuple, Optional, Dict -from PyQt5.QtCore.QObject import QObject, pyqtSignal, pyqtSlot, pyqtProperty +from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty from UM.Message import Message from cura.OAuth2.AuthorizationService import AuthorizationService @@ -66,12 +66,27 @@ class Account(QObject): self._logged_in = logged_in self.loginStateChanged.emit() + @pyqtSlot() def login(self) -> None: if self._logged_in: # Nothing to do, user already logged in. return self._authorization_service.startAuthorizationFlow() + @pyqtProperty(str, notify=loginStateChanged) + def userName(self): + user_profile = self._authorization_service.getUserProfile() + if not user_profile: + return None + return user_profile.username + + @pyqtProperty(str, notify = loginStateChanged) + def profileImageUrl(self): + user_profile = self._authorization_service.getUserProfile() + if not user_profile: + return None + return user_profile.profile_image_url + # Get the profile of the logged in user # @returns None if no user is logged in, a dict containing user_id, username and profile_image_url @pyqtProperty("QVariantMap", notify = loginStateChanged) @@ -81,6 +96,7 @@ class Account(QObject): return None return user_profile.__dict__ + @pyqtSlot() def logout(self) -> None: if not self._logged_in: return # Nothing to do, user isn't logged in. diff --git a/cura/API/__init__.py b/cura/API/__init__.py index d6d9092219..54f5c1f8b0 100644 --- a/cura/API/__init__.py +++ b/cura/API/__init__.py @@ -1,5 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from PyQt5.QtCore import QObject, pyqtProperty + from UM.PluginRegistry import PluginRegistry from cura.API.Backups import Backups from cura.API.Interface import Interface @@ -12,7 +14,7 @@ from cura.API.Account import Account # this API provides a version-safe interface with proper deprecation warnings # etc. Usage of any other methods than the ones provided in this API can cause # plug-ins to be unstable. -class CuraAPI: +class CuraAPI(QObject): # For now we use the same API version to be consistent. VERSION = PluginRegistry.APIVersion @@ -23,4 +25,8 @@ class CuraAPI: # Interface API interface = Interface() - account = Account() + _account = Account() + + @pyqtProperty(QObject, constant = True) + def account(self) -> Account: + return CuraAPI._account diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a94814502e..cd0cfb95d6 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -204,6 +204,7 @@ class CuraApplication(QtApplication): self._quality_profile_drop_down_menu_model = None self._custom_quality_profile_drop_down_menu_model = None + self._cura_API = None self._physics = None self._volume = None @@ -894,6 +895,12 @@ class CuraApplication(QtApplication): self._custom_quality_profile_drop_down_menu_model = CustomQualityProfilesDropDownMenuModel(self) return self._custom_quality_profile_drop_down_menu_model + def getCuraAPI(self, *args, **kwargs): + if self._cura_API is None: + from cura.API import CuraAPI + self._cura_API = CuraAPI() + return self._cura_API + ## Registers objects for the QML engine to use. # # \param engine The QML engine. @@ -942,6 +949,9 @@ class CuraApplication(QtApplication): qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.getInstance) qmlRegisterType(SidebarCustomMenuItemsModel, "Cura", 1, 0, "SidebarCustomMenuItemsModel") + from cura.API import CuraAPI + qmlRegisterSingletonType(CuraAPI, "Cura", 1, 1, "API", self.getCuraAPI) + # As of Qt5.7, it is necessary to get rid of any ".." in the path for the singleton to work. actions_url = QUrl.fromLocalFile(os.path.abspath(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml"))) qmlRegisterSingletonType(actions_url, "Cura", 1, 0, "Actions") diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 07154a0729..b3367471ad 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -8,7 +8,7 @@ import QtQuick.Layouts 1.1 import QtQuick.Dialogs 1.2 import UM 1.3 as UM -import Cura 1.0 as Cura +import Cura 1.1 as Cura import "Menus" @@ -21,7 +21,6 @@ UM.MainWindow property bool showPrintMonitor: false backgroundColor: UM.Theme.getColor("viewport_background") - // This connection is here to support legacy printer output devices that use the showPrintMonitor signal on Application to switch to the monitor stage // It should be phased out in newer plugin versions. Connections From c29d38361b754d1acbbf4391b5b333a0b5ef2edd Mon Sep 17 00:00:00 2001 From: Cherubim Date: Sun, 23 Sep 2018 00:27:50 +0200 Subject: [PATCH 053/212] Fix initial start-up when providing model parameter If you're adding a model file as command line argument to Cura, it should auto-load this file upon start-up. However when adding this command line argument upon first launch of Cura, there is no printer yet so Cura would crash because it tries to load a model before there is a build volume. This prevents that crash and instead doesn't load the model at all. --- cura/CuraApplication.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index dbaef4df34..65e95f1c11 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1580,6 +1580,11 @@ class CuraApplication(QtApplication): job.start() def _readMeshFinished(self, job): + global_container_stack = self.getGlobalContainerStack() + if not global_container_stack: + Logger.log("w", "Can't load meshes before a printer is added.") + return + nodes = job.getResult() file_name = job.getFileName() file_name_lower = file_name.lower() @@ -1594,7 +1599,6 @@ class CuraApplication(QtApplication): for node_ in DepthFirstIterator(root): if node_.callDecoration("isSliceable") and node_.callDecoration("getBuildPlateNumber") == target_build_plate: fixed_nodes.append(node_) - global_container_stack = self.getGlobalContainerStack() machine_width = global_container_stack.getProperty("machine_width", "value") machine_depth = global_container_stack.getProperty("machine_depth", "value") arranger = Arrange.create(x = machine_width, y = machine_depth, fixed_nodes = fixed_nodes) From 8c6f2dc86a7c6df973d14ff6cf42da1260b2f60b Mon Sep 17 00:00:00 2001 From: drzejkopf <41212609+drzejkopf@users.noreply.github.com> Date: Sun, 23 Sep 2018 15:21:14 +0200 Subject: [PATCH 054/212] Complete Polish translation for version 3.5 --- resources/i18n/pl_PL/cura.po | 256 ++++++++++++++++++----------------- 1 file changed, 130 insertions(+), 126 deletions(-) diff --git a/resources/i18n/pl_PL/cura.po b/resources/i18n/pl_PL/cura.po index bab972db8c..5003eee692 100644 --- a/resources/i18n/pl_PL/cura.po +++ b/resources/i18n/pl_PL/cura.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-04-14 14:35+0200\n" -"Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" +"PO-Revision-Date: 2018-09-21 20:52+0200\n" +"Last-Translator: 'Jaguś' Paweł Jagusiak, Andrzej 'anraf1001' Rafalski and Jakub 'drzejkopf' Świeciński\n" "Language-Team: reprapy.pl\n" "Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 2.1.1\n" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22 msgctxt "@action" @@ -43,18 +43,18 @@ msgstr "Pliki G-code" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "Zapisywacz G-code nie obsługuje trybu nietekstowego." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "Wygeneruj G-code przed zapisem." #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" msgid "3D Model Assistant" -msgstr "" +msgstr "Asystent Modelu 3D" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:80 #, python-brace-format @@ -65,6 +65,10 @@ msgid "" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" msgstr "" +"

Jeden lub więcej modeli 3D może nie zostać wydrukowanych optymalnie ze względu na wymiary modelu oraz konfigurację materiału:

\n" +"

{model_names}

\n" +"

Dowiedz się, jak zapewnić najlepszą możliwą jakość oraz niezawodnośc wydruku.

\n" +"

Zobacz przewodnik po jakości wydruku (strona w języku angielskim)

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -104,7 +108,7 @@ msgstr "Połączono przez USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "Trwa drukowanie przez USB, zamknięcie Cura spowoduje jego zatrzymanie. Jesteś pewien?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -115,12 +119,12 @@ msgstr "Plik X3G" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16 msgctxt "X3g Writer Plugin Description" msgid "Writes X3g to files" -msgstr "" +msgstr "Zapisuje do plików X3g" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:21 msgctxt "X3g Writer File Description" msgid "X3g File" -msgstr "" +msgstr "Plik X3g" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/__init__.py:17 #: /home/ruben/Projects/Cura/plugins/GCodeGzReader/__init__.py:17 @@ -131,7 +135,7 @@ msgstr "Skompresowany Plik G-code" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "Zapisywacz skompresowanego G-code nie obsługuje trybu tekstowego." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -501,7 +505,7 @@ msgstr "Jak zaktualizować" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:91 msgctxt "@info" msgid "Could not access update information." -msgstr "Nie można uzyskać dostępu do informacji o aktualizacji" +msgstr "Nie można uzyskać dostępu do informacji o aktualizacji." #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" @@ -545,12 +549,12 @@ msgstr "Zbieranie Danych" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "More info" -msgstr "" +msgstr "Więcej informacji" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "See more information on what data Cura sends." -msgstr "" +msgstr "Zobacz więcej informacji o tym, jakie dane przesyła Cura." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:button" @@ -565,7 +569,7 @@ msgstr "Zezwól Cura na wysyłanie anonimowych danych statystycznych, aby pomóc #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" -msgstr "Profile Cura 15.04 " +msgstr "Profile Cura 15.04" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -628,7 +632,7 @@ msgstr "Nie można pociąć, ponieważ wieża czyszcząca lub jej pozycja(e) są #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "Nie można pociąć, ponieważ obecne są obiekty powiązane z wyłączonym ekstruderem %s." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -684,12 +688,12 @@ msgstr "Dysza" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "Plik projektu {0} zawiera nieznany typ maszyny {1}. Nie można zaimportować maszyny. Zostaną zaimportowane modele." #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "Otwórz Plik Projektu" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -746,7 +750,7 @@ msgstr "Plik Cura Project 3MF" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "Błąd zapisu pliku 3mf." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -802,7 +806,7 @@ msgstr "Łączenie podpory" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" -msgstr "Podpory " +msgstr "Podpory" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" @@ -1008,22 +1012,22 @@ msgstr "Obszar Roboczy" #: /home/ruben/Projects/Cura/cura/Backups/Backup.py:97 msgctxt "@info:backup_failed" msgid "Could not create archive from user data directory: {}" -msgstr "" +msgstr "Nie można utworzyć archiwum z folderu danych użytkownika: {}" #: /home/ruben/Projects/Cura/cura/Backups/Backup.py:102 msgctxt "@info:title" msgid "Backup" -msgstr "" +msgstr "Kopia zapasowa" #: /home/ruben/Projects/Cura/cura/Backups/Backup.py:112 msgctxt "@info:backup_failed" msgid "Tried to restore a Cura backup without having proper data or meta data." -msgstr "" +msgstr "Podjęto próbę przywrócenia kopii zapasowej Cura na podstawie niepoprawnych danych lub metadanych." #: /home/ruben/Projects/Cura/cura/Backups/Backup.py:122 msgctxt "@info:backup_failed" msgid "Tried to restore a Cura backup that does not match your current version." -msgstr "" +msgstr "Podjęto próbę przywrócenia kopii zapasowej Cura, która nie odpowiada obecnej wersji programu." #: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27 msgctxt "@info:status" @@ -1429,7 +1433,7 @@ msgstr "Zainstalowane" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxErrorPage.qml:16 msgctxt "@info" msgid "Could not connect to the Cura Package database. Please check your connection." -msgstr "" +msgstr "Nie można połączyć się z bazą danych pakietów Cura. Sprawdź swoje połączenie z internetem." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:26 @@ -1447,22 +1451,22 @@ msgstr "Materiał" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:80 msgctxt "@label" msgid "Version" -msgstr "" +msgstr "Wersja" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:86 msgctxt "@label" msgid "Last updated" -msgstr "" +msgstr "Ostatnia aktualizacja" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:92 msgctxt "@label" msgid "Author" -msgstr "" +msgstr "Autor" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "Pobrań" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1481,93 +1485,93 @@ msgstr "Aktualizuj" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:31 msgctxt "@action:button" msgid "Updating" -msgstr "" +msgstr "Aktualizowanie" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:46 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:32 msgctxt "@action:button" msgid "Updated" -msgstr "" +msgstr "Zaktualizowano" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13 msgctxt "@title" msgid "Toolbox" -msgstr "" +msgstr "Narzędzia" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25 msgctxt "@action:button" msgid "Back" -msgstr "" +msgstr "Powrót" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "Potwierdź odinstalowanie " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "Odinstalowujesz materiały i/lub profile, które są aktualnie używane. Zatwierdzenie spowoduje przywrócenie bieżących ustawień materiału/profilu do ustawień domyślnych." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "Materiały" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "Profile" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "Potwierdź" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" msgid "You will need to restart Cura before changes in packages have effect." -msgstr "" +msgstr "Należy uruchomić ponownie Cura, aby zmiany w pakietach przyniosły efekt." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:34 msgctxt "@info:button" msgid "Quit Cura" -msgstr "" +msgstr "Zakończ Cura" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "Udział Społeczności" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "Wtyczki Społeczności" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "Materiały Podstawowe" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" msgid "Installed" -msgstr "" +msgstr "Zainstalowano" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:19 msgctxt "@label" msgid "Will install upon restarting" -msgstr "" +msgstr "Zostanie zainstalowane po ponownym uruchomieniu" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:51 msgctxt "@action:button" msgid "Downgrade" -msgstr "" +msgstr "Zainstaluj poprzednią wersję" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:51 msgctxt "@action:button" msgid "Uninstall" -msgstr "" +msgstr "Odinstaluj" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:16 msgctxt "@title:window" @@ -1598,27 +1602,27 @@ msgstr "Odrzuć" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcase.qml:23 msgctxt "@label" msgid "Featured" -msgstr "" +msgstr "Polecane" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:31 msgctxt "@label" msgid "Compatibility" -msgstr "" +msgstr "Zgodność" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16 msgctxt "@info" msgid "Fetching packages..." -msgstr "" +msgstr "Uzyskiwanie pakietów..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "Strona internetowa" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "E-mail" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1755,12 +1759,12 @@ msgstr "Adres" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "Ta drukarka nie jest skonfigurowana jako host dla grupy drukarek." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "Ta drukarka jest hostem grupy %1 drukarek." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1808,52 +1812,52 @@ msgstr "Drukuj" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "Oczekiwanie na: Niedostępną drukarkę" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "Oczekiwanie na: Pierwszą dostępną" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "Oczekiwanie na: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "Przesuń na początek" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "Przesuń zadanie drukowania na początek" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "Czy jesteś pewien, że chcesz przesunąć %1 na początek kolejki?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "Usuń" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "Usuń zadanie drukowania" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "Czy jesteś pewien, że chcesz usunąć %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "Zarządzaj kolejką" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1868,57 +1872,57 @@ msgstr "Drukowanie" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "Zarządzaj drukarkami" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "Niedostępny" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "Nieosiągalny" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "Dostępny" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "Ponów" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "Wstrzymaj" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "Anuluj" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 msgctxt "@window:title" msgid "Abort print" -msgstr "Przerwij wydruk" +msgstr "Anuluj wydruk" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "Czy jesteś pewien, że chcesz anulować %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "Anulowano" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1933,7 +1937,7 @@ msgstr "Przygotowywanie" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "Wstrzymywanie" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2073,22 +2077,22 @@ msgstr "Zmień aktywne skrypty post-processingu" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:16 msgctxt "@title:window" msgid "More information on anonymous data collection" -msgstr "" +msgstr "Wiećej informacji o zbieraniu anonimowych danych" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:66 msgctxt "@text:window" msgid "Cura sends anonymous data to Ultimaker in order to improve the print quality and user experience. Below is an example of all the data that is sent." -msgstr "" +msgstr "Cura wysyła anonimowe dane do Ultimaker w celu polepszenia jakości wydruków oraz interakcji z użytkownikiem. Poniżej podano przykład wszystkich danych, jakie mogą być przesyłane." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101 msgctxt "@text:window" msgid "I don't want to send these data" -msgstr "" +msgstr "Nie chcę przesyłać tych danych" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111 msgctxt "@text:window" msgid "Allow sending these data to Ultimaker and help us improve Cura" -msgstr "" +msgstr "Zezwól na przesyłanie tych danych do Ultimaker i pomóż nam ulepszać Cura" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" @@ -2351,7 +2355,7 @@ msgstr "Otwórz" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "Poprzedni" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2363,12 +2367,12 @@ msgstr "Eksportuj" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "Następny" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "Końcówka" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2417,12 +2421,12 @@ msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "Próbny wydruk" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "Lista kontrolna" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2645,7 +2649,7 @@ msgstr "Usuń wydruk" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "Anuluj Wydruk" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -2725,7 +2729,7 @@ msgstr "Potwierdź Zmianę Średnicy" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:101 msgctxt "@label (%1 is a number)" msgid "The new filament diameter is set to %1 mm, which is not compatible with the current extruder. Do you wish to continue?" -msgstr "" +msgstr "Średnica nowego filamentu została ustawiona na %1mm, i nie jest kompatybilna z bieżącym ekstruderem. Czy chcesz kontynuować?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:133 msgctxt "@label" @@ -3068,12 +3072,12 @@ msgstr "Skaluj bardzo małe modele" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:507 msgctxt "@info:tooltip" msgid "Should models be selected after they are loaded?" -msgstr "" +msgstr "Czy modele powinny zostać zaznaczone po załadowaniu?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 msgctxt "@option:check" msgid "Select models when loaded" -msgstr "" +msgstr "Zaznaczaj modele po załadowaniu" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@info:tooltip" @@ -3108,7 +3112,7 @@ msgstr "Domyślne zachowanie podczas otwierania pliku projektu: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "Zawsze pytaj" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3128,22 +3132,22 @@ msgstr "Kiedy dokonasz zmian w profilu i przełączysz się na inny, zostanie wy #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "Profile" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "Domyślne zachowanie dla zmienionych ustawień podczas zmiany profilu na inny: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "Zawsze odrzucaj wprowadzone zmiany" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "Zawsze przenoś wprowadzone zmiany do nowego profilu" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3173,7 +3177,7 @@ msgstr "Wyślij (anonimowe) informacje o drukowaniu" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:713 msgctxt "@action:button" msgid "More information" -msgstr "" +msgstr "Więcej informacji" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:731 msgctxt "@label" @@ -3338,7 +3342,7 @@ msgstr "Dodaj drukarkę" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "Bez tytułu" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3519,12 +3523,12 @@ msgstr "Skonfiguruj widoczność ustawień ..." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:643 msgctxt "@action:inmenu" msgid "Collapse All" -msgstr "" +msgstr "Schowaj wszystkie" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:648 msgctxt "@action:inmenu" msgid "Expand All" -msgstr "" +msgstr "Rozwiń wszystkie" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:249 msgctxt "@label" @@ -3696,17 +3700,17 @@ msgstr "Przed drukowaniem podgrzej stół. W dalszym ciągu można dostosowywać #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "Materiał" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "Ulubione" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "Podstawowe" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3780,12 +3784,12 @@ msgstr "Ekstruder" #: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/SyncButton.qml:16 msgctxt "@label:extruder label" msgid "Yes" -msgstr "" +msgstr "Tak" #: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/SyncButton.qml:16 msgctxt "@label:extruder label" msgid "No" -msgstr "" +msgstr "Nie" #: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 msgctxt "@title:menu menubar:file" @@ -3980,7 +3984,7 @@ msgstr "&Grupuj modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" -msgstr "Rozgrupuj modele " +msgstr "Rozgrupuj modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:304 msgctxt "@action:inmenu menubar:edit" @@ -4010,7 +4014,7 @@ msgstr "Przeładuj wszystkie modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "Rozłóż Wszystkie Modele na Wszystkie Platformy Robocze." +msgstr "Rozłóż Wszystkie Modele na Wszystkie Platformy Robocze" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:357 msgctxt "@action:inmenu menubar:edit" @@ -4055,7 +4059,7 @@ msgstr "Pokaż folder konfiguracji" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:423 msgctxt "@action:menu" msgid "Browse packages..." -msgstr "" +msgstr "Przeglądaj pakiety..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:430 msgctxt "@action:inmenu menubar:view" @@ -4146,17 +4150,17 @@ msgstr "&Plik" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "&Zapisz..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "&Eksportuj..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "Eksportuj Zaznaczenie..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4218,7 +4222,7 @@ msgstr "&Rozszerzenia" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:280 msgctxt "@title:menu menubar:toplevel" msgid "&Toolbox" -msgstr "" +msgstr "&Narzędzia" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:287 msgctxt "@title:menu menubar:toplevel" @@ -4233,7 +4237,7 @@ msgstr "P&omoc" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:341 msgctxt "@label" msgid "This package will be installed after restarting." -msgstr "" +msgstr "Ten pakiet zostanie zainstalowany po ponownym uruchomieniu." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:370 msgctxt "@action:button" @@ -4258,18 +4262,18 @@ msgstr "Czy na pewno chcesz rozpocząć nowy projekt? Spowoduje to wyczyszczenie #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Zamykanie Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "Czy jesteś pewien, że chcesz zakończyć Cura?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" msgid "Install Package" -msgstr "" +msgstr "Instaluj pakiety" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:868 msgctxt "@title:window" @@ -4446,7 +4450,7 @@ msgstr "Materiał" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "Użyj kleju z tą kombinacją materiałów" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4476,7 +4480,7 @@ msgstr "Rozłóż na obecnej platformie roboczej" #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)." -msgstr "" +msgstr "Zapewnia możliwość zmiany ustawień maszyny (takich jak objętość robocza, rozmiar dyszy itp.)." #: MachineSettingsAction/plugin.json msgctxt "name" @@ -4486,12 +4490,12 @@ msgstr "Ustawienia Maszyny" #: Toolbox/plugin.json msgctxt "description" msgid "Find, manage and install new Cura packages." -msgstr "" +msgstr "Znajdź, zarządzaj i instaluj nowe pakiety Cura." #: Toolbox/plugin.json msgctxt "name" msgid "Toolbox" -msgstr "" +msgstr "Narzędzia" #: XRayView/plugin.json msgctxt "description" @@ -4521,7 +4525,7 @@ msgstr "Zapisuje g-code do pliku." #: GCodeWriter/plugin.json msgctxt "name" msgid "G-code Writer" -msgstr "Pisarz G-code" +msgstr "Zapisywacz G-code" #: ModelChecker/plugin.json msgctxt "description" @@ -4576,7 +4580,7 @@ msgstr "Drukowanie USB" #: UserAgreement/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license." -msgstr "" +msgstr "Zapytaj użytkownika jednokrotnie, czy zgadza się z warunkami naszej licencji." #: UserAgreement/plugin.json msgctxt "name" @@ -4586,12 +4590,12 @@ msgstr "ZgodaUżytkownika" #: X3GWriter/plugin.json msgctxt "description" msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)." -msgstr "" +msgstr "Umożliwia zapisanie wyników cięcia jako plik X3G, aby wspierać drukarki obsługujące ten format (Malyan, Makerbot oraz inne oparte o oprogramowanie Sailfish)." #: X3GWriter/plugin.json msgctxt "name" msgid "X3GWriter" -msgstr "" +msgstr "Zapisywacz X3G" #: GCodeGzWriter/plugin.json msgctxt "description" @@ -4636,7 +4640,7 @@ msgstr "Wtyczka Urządzenia Wyjścia Dysku Zewn." #: UM3NetworkPrinting/plugin.json msgctxt "description" msgid "Manages network connections to Ultimaker 3 printers." -msgstr "" +msgstr "Zarządza ustawieniami połączenia sieciowego z drukarkami Ultimaker 3." #: UM3NetworkPrinting/plugin.json msgctxt "name" @@ -4756,12 +4760,12 @@ msgstr "Ulepszenie Wersji z 3.2 do 3.3" #: VersionUpgrade/VersionUpgrade33to34/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.3 to Cura 3.4." -msgstr "" +msgstr "Ulepsza konfigurację z Cura 3.3 do Cura 3.4." #: VersionUpgrade/VersionUpgrade33to34/plugin.json msgctxt "name" msgid "Version Upgrade 3.3 to 3.4" -msgstr "" +msgstr "Ulepszenie Wersji z 3.3 do 3.4" #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" @@ -4786,12 +4790,12 @@ msgstr "Ulepszenie Wersji 2.7 do 3.0" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Ulepsza konfigurację z Cura 3.4 do Cura 3.5." #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "Ulepszenie Wersji z 3.4 do 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" @@ -4926,7 +4930,7 @@ msgstr "3MF Writer" #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)." -msgstr "" +msgstr "Zapewnia czynności maszyny dla urządzeń Ultimaker (na przykład kreator poziomowania stołu, wybór ulepszeń itp.)." #: UltimakerMachineActions/plugin.json msgctxt "name" From 79cd9f332d0b4ae2b6c5931bc60dd3b4de1722ea Mon Sep 17 00:00:00 2001 From: drzejkopf <41212609+drzejkopf@users.noreply.github.com> Date: Sun, 23 Sep 2018 15:28:14 +0200 Subject: [PATCH 055/212] Update fdmprinter.def.json.po --- resources/i18n/pl_PL/fdmprinter.def.json.po | 127 ++++++++++---------- 1 file changed, 66 insertions(+), 61 deletions(-) diff --git a/resources/i18n/pl_PL/fdmprinter.def.json.po b/resources/i18n/pl_PL/fdmprinter.def.json.po index caff3d9438..53aa32009e 100644 --- a/resources/i18n/pl_PL/fdmprinter.def.json.po +++ b/resources/i18n/pl_PL/fdmprinter.def.json.po @@ -6,16 +6,17 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.5\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-17 16:45+0200\n" -"Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" +"PO-Revision-Date: 2018-09-21 21:52+0200\n" +"Last-Translator: 'Jaguś' Paweł Jagusiak, Andrzej 'anraf1001' Rafalski and Jakub 'drzejkopf' Świeciński\n" "Language-Team: reprapy.pl\n" "Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 2.1.1\n" +"POT-Creation-Date: \n" #: fdmprinter.def.json msgctxt "machine_settings label" @@ -1073,12 +1074,12 @@ msgstr "Zygzak" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "Połącz Górne/Dolne Wieloboki" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "Łączy górne/dolne ścieżki powłoki, gdy są one prowadzone obok siebie. Przy wzorze koncentrycznym, załączenie tego ustawienia znacznie zredukuje czas ruchów jałowych, ale ze względu na to, że połączenie może nastąpić w połowie drogi ponad wypełnieniem, ta fukncja może pogorszyć jakość górnej powierzchni." #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1108,7 +1109,7 @@ msgstr "Optymalizuj Kolejność Drukowania Ścian" #: fdmprinter.def.json msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization. First layer is not optimized when choosing brim as build plate adhesion type." -msgstr "" +msgstr "Optymalizuje kolejność, w jakiej będą drukowane ścianki w celu zredukowania ilości retrakcji oraz dystansu ruchów jałowych. Większość części skorzysta na załączeniu tej funkcji, jednak w niektórych przypadkach czas druku może się wydłużyć, proszę więc o porównanie oszacowanego czasu z funkcją załączoną oraz wyłączoną. Pierwsza warstwa nie zostanie zoptymalizowana, jeżeli jako poprawa przyczepności stołu zostanie wybrany obrys." #: fdmprinter.def.json msgctxt "outer_inset_first label" @@ -1163,22 +1164,22 @@ msgstr "Kompensuje przepływ dla części, których wewnętrzna ściana jest dru #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "Minimalny Przepływ Dla Ścianek" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "Minimalny dopuszczalny przepływ procentowy dla linii ścianki. Kompensacja nakładania się ścianek redukuje przepływ, gdy dana ścianka znajduje się blisko wydrukowanej już ścianki. Ścianki, których przepływ powinien być mniejszy, niż ta wartość, będą zastąpione ruchami jałowymi. Aby używać tego ustawienia należy załączyć kompensację nakładających się ścianek oraz drukowanie ścianek zewnętrznych przed wewnętrznymi." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "Preferuj Retrakcję" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "Gdy załączone, retrakcja jest używana zamiast kombinowanego ruchu jałowego, który zastępuje ściankę, której przepływ jest mniejszy od minimalnego." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1478,7 +1479,7 @@ msgstr "Gęstość Wypełn." #: fdmprinter.def.json msgctxt "infill_sparse_density description" msgid "Adjusts the density of infill of the print." -msgstr "Dostosowuje gęstość wypełnienia wydruku" +msgstr "Dostosowuje gęstość wypełnienia wydruku." #: fdmprinter.def.json msgctxt "infill_line_distance label" @@ -1573,12 +1574,12 @@ msgstr "Łączy końce gdzie wzór wypełnienia spotyka się z wewn. ścianą u #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "Połącz Wieloboki Wypełnienia" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "Łączy ścieżki wypełnienia, gdy są one prowadzone obok siebie. Dla wzorów wypełnienia zawierających kilka zamkniętych wieloboków, załączenie tego ustawienia znacznie skróci czas ruchów jałowych." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1613,17 +1614,17 @@ msgstr "Wzór wypełnienia jest przesunięty o tę odległość wzdłuż osi Y." #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "Mnożnik Linii Wypełnienia" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "Zmienia pojedynczą linię wypełnienia na zadaną ilość linii. Dodatkowe linie wypełnienia nie będą nad sobą przechodzić, ale będą się unikać. Sprawi to, że wypełnienie będzie sztywniejsze, ale czas druku oraz zużycie materiału zwiększą się." #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "Ilość Dodatkowych Ścianek Wypełnienia" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" @@ -1631,6 +1632,8 @@ msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." msgstr "" +"Dodaje ścianki naokoło wypełnienia. Takie ścianki mogą spowodować, że linie górnej/dolnej powłoki będą zwisać mniej, co pozwoli na zastosowanie mniejszej ilości górnych/dolnych warstw przy zachowaniu takiej samej jakości kosztem dodatkowego materiału.\n" +"Ta funkcja może być używana razem z funkcją \"Połącz Wieloboki Wypełnienia\", aby połączyć całe wypełnienie w pojedynczą ścieżkę, co przy poprawnej konfiguracji wyelinimuje potrzebę wykonywania ruchów jałowych lub retrakcji." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1745,22 +1748,22 @@ msgstr "Nie generuj obszarów wypełnienia mniejszych niż to (zamiast tego uży #: fdmprinter.def.json msgctxt "infill_support_enabled label" msgid "Infill Support" -msgstr "" +msgstr "Wypełnienie Podporowe" #: fdmprinter.def.json msgctxt "infill_support_enabled description" msgid "Print infill structures only where tops of the model should be supported. Enabling this reduces print time and material usage, but leads to ununiform object strength." -msgstr "" +msgstr "Drukuj wypełnienie tylko w miejscach, w których górna część modelu powinna być podparta strukturą wewnętrzną. Załączenie tej funkcji skutkuje redukcją czasu druku, ale prowadzi do niejednolitej wytrzymałości obiektu." #: fdmprinter.def.json msgctxt "infill_support_angle label" msgid "Infill Overhang Angle" -msgstr "" +msgstr "Kąt Zwisu dla Wypełnienia" #: fdmprinter.def.json msgctxt "infill_support_angle description" msgid "The minimum angle of internal overhangs for which infill is added. At a value of 0° objects are totally filled with infill, 90° will not provide any infill." -msgstr "" +msgstr "Minimalny kąt zwisu wewnętrznego, dla którego zostanie dodane wypełnienie. Przy wartości 0° obiekty zostaną wypełnione całkowicie, natomiast przy 90° wypełnienie nie zostanie wygenerowane." #: fdmprinter.def.json msgctxt "skin_preshrink label" @@ -2095,12 +2098,12 @@ msgstr "Okno, w którym wymuszona jest maksymalna liczba retrakcji. Wartość ta #: fdmprinter.def.json msgctxt "limit_support_retractions label" msgid "Limit Support Retractions" -msgstr "" +msgstr "Ogranicz Retrakcje Pomiędzy Podporami" #: fdmprinter.def.json msgctxt "limit_support_retractions description" msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure." -msgstr "" +msgstr "Unikaj retrakcji podczas poruszania się od podpory do podpory w linii prostej. Załączenie tej funkcji spowoduje skrócenie czasu druku, lecz może prowadzić do nadmiernego nitkowania wewnątrz struktur podporowych." #: fdmprinter.def.json msgctxt "material_standby_temperature label" @@ -2210,7 +2213,7 @@ msgstr "Prędkość Wewn. Ściany" #: fdmprinter.def.json msgctxt "speed_wall_x description" msgid "The speed at which all inner walls are printed. Printing the inner wall faster than the outer wall will reduce printing time. It works well to set this in between the outer wall speed and the infill speed." -msgstr "Szybkość, z jaką drukowane są ściany wewnętrzne. Drukowanie wewnętrznej ściany szybciej niż zewn. pozwoli skrócić czas druku. Zaleca się, aby ustawić to pomiędzy prędkością zewn. ściany, a prędkością wypełnienia" +msgstr "Szybkość, z jaką drukowane są ściany wewnętrzne. Drukowanie wewnętrznej ściany szybciej niż zewn. pozwoli skrócić czas druku. Zaleca się, aby ustawić to pomiędzy prędkością zewn. ściany, a prędkością wypełnienia." #: fdmprinter.def.json msgctxt "speed_roofing label" @@ -2781,6 +2784,8 @@ msgstr "Tryb Kombinowania" msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." msgstr "" +"Kombinowanie utrzymuje dyszę w już zadrukowanych obszarach podczas ruchu jałowego. Powoduje to nieco dłuższe ruchy jałowe, ale zmniejsza potrzebę retrakcji. Jeśli kombinowanie jest wyłączone, materiał się cofa, a dysza przemieszcza się w linii prostej do następnego punktu. Można też unikać kombinowania na górnych/dolnych obszarach powłoki, a także kombinować tylko wewnątrz wypełnienia. Opcja \"Wewnątrz Wypełnienia\" wymusza takie samo zachowanie, jak opcja \"Nie w Powłoce\" we wcześniejszych " +"wydaniach Cura." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2795,22 +2800,22 @@ msgstr "Wszędzie" #: fdmprinter.def.json msgctxt "retraction_combing option noskin" msgid "Not in Skin" -msgstr "" +msgstr "Nie w Powłoce" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "Wewnątrz Wypełnienia" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" msgid "Max Comb Distance With No Retract" -msgstr "" +msgstr "Max. Dystans Kombinowania Bez Retrakcji" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance description" msgid "When non-zero, combing travel moves that are longer than this distance will use retraction." -msgstr "" +msgstr "Przy wartości niezerowej, kombinowane ruchy jałowe o dystansie większym niż zadany bedą używały retrakcji." #: fdmprinter.def.json msgctxt "travel_retract_before_outer_wall label" @@ -2835,12 +2840,12 @@ msgstr "Dysza unika już wydrukowanych części podczas ruchu jałowego. Ta opcj #: fdmprinter.def.json msgctxt "travel_avoid_supports label" msgid "Avoid Supports When Traveling" -msgstr "" +msgstr "Unikaj Podpór Podczas Ruchu Jałowego" #: fdmprinter.def.json msgctxt "travel_avoid_supports description" msgid "The nozzle avoids already printed supports when traveling. This option is only available when combing is enabled." -msgstr "" +msgstr "Dysza będzie omijała już wydrukowane podpory podczas ruchu jałowego. Ta opcja jest dostępna jedynie, gdy kombinowanie jest włączone." #: fdmprinter.def.json msgctxt "travel_avoid_distance label" @@ -3195,12 +3200,12 @@ msgstr "Krzyż" #: fdmprinter.def.json msgctxt "support_wall_count label" msgid "Support Wall Line Count" -msgstr "" +msgstr "Ilość Ścianek Podpory" #: fdmprinter.def.json msgctxt "support_wall_count description" msgid "The number of walls with which to surround support infill. Adding a wall can make support print more reliably and can support overhangs better, but increases print time and material used." -msgstr "" +msgstr "Liczba ścianek otaczających wypełnienie podpory. Dodanie ścianki może sprawić, że podpory będą drukowane solidniej i będą mogły lepiej podpierać nawisy, ale wydłuży to czas druku i zwiększy ilość użytego materiału." #: fdmprinter.def.json msgctxt "zig_zaggify_support label" @@ -3245,22 +3250,22 @@ msgstr "Odległość między drukowanymi liniami struktury podpory. To ustawieni #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "Odstęp Między Liniami Podpory w Pocz. Warstwie" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "Odległość między drukowanymi liniami struktury podpory w początkowej warstwie. To ustawienie jest obliczane na podstawie gęstości podpory." #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "Kierunek Linii Wypełnienia Podpory" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "Orientacja wzoru wypełnienia dla podpór. Wzór podpory jest obracany w płaszczyźnie poziomej." #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3630,22 +3635,22 @@ msgstr "Zygzak" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "Nadpisanie Prędkości Wentylatora" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "Gdy załączone, prędkość wentylatora chłodzącego wydruk jest zmieniana dla obszarów leżących bezpośrednio ponad podporami," #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "Prędkość Wentylatora Podpartej Powłoki" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "Procentowa prędkść wentylatora, która zostanie użyta podczas drukowania obszarów powłoki leżących bezpośrednio nad podstawami. Użycie wysokiej prędkości może ułatwić usuwanie podpór." #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3974,7 +3979,7 @@ msgstr "Szerokość linii na podstawowej warstwie tratwy. Powinny być to grube #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "Rozstaw Linii Podstawy Tratwy" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4069,7 +4074,7 @@ msgstr "Zryw Tratwy" #: fdmprinter.def.json msgctxt "raft_jerk description" msgid "The jerk with which the raft is printed." -msgstr "Zryw, z jakim drukowana jest tratwa" +msgstr "Zryw, z jakim drukowana jest tratwa." #: fdmprinter.def.json msgctxt "raft_surface_jerk label" @@ -4719,12 +4724,12 @@ msgstr "Dane łączące przepływ materiału (w mm3 na sekundę) z temperaturą #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "Minimalny Obwód Wieloboku" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "Wieloboki w pociętych warstwach mające obwód mniejszy, niż podany, będą odfiltrowane. Mniejsze wartości dają wyższą rozdzielczość siatki kosztem czasu cięcia. Funkcja ta jest przeznaczona głównie dla drukarek wysokiej rozdzielczości SLA oraz bardzo małych modeli z dużą ilością detali." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -4739,12 +4744,12 @@ msgstr "Minimalny rozmiar linii segmentu po pocięciu. Jeżeli to zwiększysz, s #: fdmprinter.def.json msgctxt "meshfix_maximum_travel_resolution label" msgid "Maximum Travel Resolution" -msgstr "" +msgstr "Maksymalna Rozdzielczość Ruchów Jałowych" #: fdmprinter.def.json msgctxt "meshfix_maximum_travel_resolution description" msgid "The minimum size of a travel line segment after slicing. If you increase this, the travel moves will have less smooth corners. This may allow the printer to keep up with the speed it has to process g-code, but it may cause model avoidance to become less accurate." -msgstr "" +msgstr "Minimalny rozmiar segmentu linii ruchu jałowego po pocięciu. Jeżeli ta wartość zostanie zwiększona, ruch jałowy będzie miał mniej gładkie zakręty. Może to spowodować przyspieszenie prędkości przetwarzania g-code, ale unikanie modelu może być mniej dokładne." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4909,22 +4914,22 @@ msgstr "Rozmiar kieszeni na czterostronnych skrzyżowaniach we wzorze krzyż 3D #: fdmprinter.def.json msgctxt "cross_infill_density_image label" msgid "Cross Infill Density Image" -msgstr "" +msgstr "Gęstośc Wypełnienia Krzyżowego Według Obrazu" #: fdmprinter.def.json msgctxt "cross_infill_density_image description" msgid "The file location of an image of which the brightness values determine the minimal density at the corresponding location in the infill of the print." -msgstr "" +msgstr "Lokalizacja pliku obrazu, którego jasność będzie determinowała minimalną gęstość wypełnienia wydruku w danym punkcie." #: fdmprinter.def.json msgctxt "cross_support_density_image label" msgid "Cross Fill Density Image for Support" -msgstr "" +msgstr "Gęstości Wypełnienia Krzyżowego Podstaw Według Obrazu" #: fdmprinter.def.json msgctxt "cross_support_density_image description" msgid "The file location of an image of which the brightness values determine the minimal density at the corresponding location in the support." -msgstr "" +msgstr "Lokalizacja pliku obrazu, którego jasność będzie determinowała minimalną gęstość wypełnienia podstawy w danym punkcie." #: fdmprinter.def.json msgctxt "spaghetti_infill_enabled label" @@ -5174,7 +5179,7 @@ msgstr "DD Przepływ" #: fdmprinter.def.json msgctxt "wireframe_flow description" msgid "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing." -msgstr "Kompensacja przepływu: ilość wytłaczanego materiału jest mnożona przez tę wartość. Odnosi się tylko do Drukowania Drutu. " +msgstr "Kompensacja przepływu: ilość wytłaczanego materiału jest mnożona przez tę wartość. Odnosi się tylko do Drukowania Drutu." #: fdmprinter.def.json msgctxt "wireframe_flow_connection label" @@ -5258,7 +5263,7 @@ msgstr "DD Spadek" #: fdmprinter.def.json msgctxt "wireframe_fall_down description" msgid "Distance with which the material falls down after an upward extrusion. This distance is compensated for. Only applies to Wire Printing." -msgstr "Odległość o jaką spada materiału przez wytłaczanie w górę. Długość ta jest kompensowana. Odnosi się tylko do Drukowania Drutu" +msgstr "Odległość o jaką spada materiału przez wytłaczanie w górę. Długość ta jest kompensowana. Odnosi się tylko do Drukowania Drutu." #: fdmprinter.def.json msgctxt "wireframe_drag_along label" @@ -5363,7 +5368,7 @@ msgstr "Maks. zmiana zmiennych warstw" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height." -msgstr "" +msgstr "Maksymalna dozwolona różnica wysokości względem bazowej wysokości warstwy." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" @@ -5388,22 +5393,22 @@ msgstr "Opóźnienie w wyborze, czy użyć mniejszej warstwy, czy nie. Ta liczba #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "Kąt Nawisającej Ścianki" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "Ścianka o większym kącie nawisu niż podany będzie drukowana z użyciem ustawień nawisającej ścianki. Przy wartości 90°, żadna ścianka nie będzie traktowana jako ścianka nawisająca." #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "Prędkość Ścianki Nawisającej" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "Nawisające ścianki będą drukowane z taką procentową wartością względem normalnej prędkości druku." #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" @@ -5608,7 +5613,7 @@ msgstr "Ustawienia, które są używane tylko wtedy, gdy CuraEngine nie jest wyw #: fdmprinter.def.json msgctxt "center_object label" msgid "Center Object" -msgstr "" +msgstr "Wyśrodkuj obiekt" #: fdmprinter.def.json msgctxt "center_object description" @@ -5618,7 +5623,7 @@ msgstr "Czy wyśrodkować obiekt na środku stołu (0,0), zamiast używać ukła #: fdmprinter.def.json msgctxt "mesh_position_x label" msgid "Mesh Position X" -msgstr "" +msgstr "Pozycja Siatki w X" #: fdmprinter.def.json msgctxt "mesh_position_x description" @@ -5628,7 +5633,7 @@ msgstr "Przesunięcie zastosowane dla obiektu w kierunku X." #: fdmprinter.def.json msgctxt "mesh_position_y label" msgid "Mesh Position Y" -msgstr "" +msgstr "Pozycja Siatki w Y" #: fdmprinter.def.json msgctxt "mesh_position_y description" @@ -5638,7 +5643,7 @@ msgstr "Przesunięcie zastosowane dla obiektu w kierunku Y." #: fdmprinter.def.json msgctxt "mesh_position_z label" msgid "Mesh Position Z" -msgstr "" +msgstr "Pozycja Siatki w Z" #: fdmprinter.def.json msgctxt "mesh_position_z description" From 1e5177a44f1258d45c4ed188b9114e7c2bdf5e92 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Sep 2018 17:04:20 +0200 Subject: [PATCH 056/212] Added unit tests for authorization service CURA-5744 --- cura/OAuth2/AuthorizationService.py | 6 +- tests/TestOAuth2.py | 90 +++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 tests/TestOAuth2.py diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 868dbe8034..0f57621a47 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -93,7 +93,7 @@ class AuthorizationService: Refresh the access token when it expired. """ if self._auth_data is None or self._auth_data.refresh_token is None: - Logger.log("w", "Unable to refresh acces token, since there is no refresh token.") + Logger.log("w", "Unable to refresh access token, since there is no refresh token.") return self._storeAuthData(self._auth_helpers.getAccessTokenUsingRefreshToken(self._auth_data.refresh_token)) self.onAuthStateChanged.emit(logged_in=True) @@ -148,8 +148,8 @@ class AuthorizationService: if preferences_data: self._auth_data = AuthenticationResponse(**preferences_data) self.onAuthStateChanged.emit(logged_in=True) - except ValueError as err: - Logger.log("w", "Could not load auth data from preferences: %s", err) + except ValueError: + Logger.logException("w", "Could not load auth data from preferences") def _storeAuthData(self, auth_data: Optional[AuthenticationResponse] = None) -> None: """Store authentication data in preferences and locally.""" diff --git a/tests/TestOAuth2.py b/tests/TestOAuth2.py new file mode 100644 index 0000000000..10578eaeb0 --- /dev/null +++ b/tests/TestOAuth2.py @@ -0,0 +1,90 @@ +from unittest.mock import MagicMock, patch + +from UM.Preferences import Preferences +from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers +from cura.OAuth2.AuthorizationService import AuthorizationService +from cura.OAuth2.Models import OAuth2Settings, AuthenticationResponse, UserProfile + +CALLBACK_PORT = 32118 +OAUTH_ROOT = "https://account.ultimaker.com" +CLOUD_API_ROOT = "https://api.ultimaker.com" + +OAUTH_SETTINGS = OAuth2Settings( + OAUTH_SERVER_URL= OAUTH_ROOT, + CALLBACK_PORT=CALLBACK_PORT, + CALLBACK_URL="http://localhost:{}/callback".format(CALLBACK_PORT), + CLIENT_ID="", + CLIENT_SCOPES="", + AUTH_DATA_PREFERENCE_KEY="test/auth_data", + AUTH_SUCCESS_REDIRECT="{}/auth-success".format(CLOUD_API_ROOT), + AUTH_FAILED_REDIRECT="{}/auth-error".format(CLOUD_API_ROOT) + ) + +FAILED_AUTH_RESPONSE = AuthenticationResponse(success = False, err_message = "FAILURE!") + +SUCCESFULL_AUTH_RESPONSE = AuthenticationResponse(access_token = "beep", refresh_token = "beep?") + +MALFORMED_AUTH_RESPONSE = AuthenticationResponse() + + +def test_cleanAuthService(): + # Ensure that when setting up an AuthorizationService, no data is set. + authorization_service = AuthorizationService(Preferences(), OAUTH_SETTINGS) + assert authorization_service.getUserProfile() is None + assert authorization_service.getAccessToken() is None + + +def test_failedLogin(): + authorization_service = AuthorizationService(Preferences(), OAUTH_SETTINGS) + authorization_service.onAuthenticationError.emit = MagicMock() + authorization_service.onAuthStateChanged.emit = MagicMock() + + # Let the service think there was a failed response + authorization_service._onAuthStateChanged(FAILED_AUTH_RESPONSE) + + # Check that the error signal was triggered + assert authorization_service.onAuthenticationError.emit.call_count == 1 + + # Since nothing changed, this should still be 0. + assert authorization_service.onAuthStateChanged.emit.call_count == 0 + + # Validate that there is no user profile or token + assert authorization_service.getUserProfile() is None + assert authorization_service.getAccessToken() is None + + +def test_loginAndLogout(): + preferences = Preferences() + authorization_service = AuthorizationService(preferences, OAUTH_SETTINGS) + authorization_service.onAuthenticationError.emit = MagicMock() + authorization_service.onAuthStateChanged.emit = MagicMock() + + # Let the service think there was a succesfull response + with patch.object(AuthorizationHelpers, "parseJWT", return_value=UserProfile()): + authorization_service._onAuthStateChanged(SUCCESFULL_AUTH_RESPONSE) + + # Ensure that the error signal was not triggered + assert authorization_service.onAuthenticationError.emit.call_count == 0 + + # Since we said that it went right this time, validate that we got a signal. + assert authorization_service.onAuthStateChanged.emit.call_count == 1 + assert authorization_service.getUserProfile() is not None + assert authorization_service.getAccessToken() == "beep" + + # Check that we stored the authentication data, so next time the user won't have to log in again. + assert preferences.getValue("test/auth_data") is not None + + # We're logged in now, also check if logging out works + authorization_service.deleteAuthData() + assert authorization_service.onAuthStateChanged.emit.call_count == 2 + assert authorization_service.getUserProfile() is None + + # Ensure the data is gone after we logged out. + assert preferences.getValue("test/auth_data") == "{}" + + +def test_wrongServerResponses(): + authorization_service = AuthorizationService(Preferences(), OAUTH_SETTINGS) + with patch.object(AuthorizationHelpers, "parseJWT", return_value=UserProfile()): + authorization_service._onAuthStateChanged(MALFORMED_AUTH_RESPONSE) + assert authorization_service.getUserProfile() is None \ No newline at end of file From fe85c020b1bed640277df95160d3e77ef2a0e614 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Sep 2018 17:12:45 +0200 Subject: [PATCH 057/212] Fixed incorrect OAuth2 settings CURA-5744 --- cura/API/Account.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index 7ccd995be3..19ee0123d7 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -36,11 +36,11 @@ class Account(QObject): OAUTH_SERVER_URL= self._oauth_root, CALLBACK_PORT=self._callback_port, CALLBACK_URL="http://localhost:{}/callback".format(self._callback_port), - CLIENT_ID="um---------------ultimaker_cura_drive_plugin", - CLIENT_SCOPES="user.read drive.backups.read drive.backups.write", - AUTH_DATA_PREFERENCE_KEY="cura_drive/auth_data", - AUTH_SUCCESS_REDIRECT="{}/cura-drive/v1/auth-success".format(self._cloud_api_root), - AUTH_FAILED_REDIRECT="{}/cura-drive/v1/auth-error".format(self._cloud_api_root) + CLIENT_ID="um---------------ultimaker_cura", + CLIENT_SCOPES="user.read drive.backups.read drive.backups.write.client.package.download", + AUTH_DATA_PREFERENCE_KEY="general/ultimaker_auth_data", + AUTH_SUCCESS_REDIRECT="{}/auth-success".format(self._cloud_api_root), + AUTH_FAILED_REDIRECT="{}//auth-error".format(self._cloud_api_root) ) self._authorization_service = AuthorizationService(Application.getInstance().getPreferences(), self._oauth_settings) From 7360313ff7555253fdf01390d582574ed745bffd Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Sep 2018 17:26:08 +0200 Subject: [PATCH 058/212] Add LocalAuthServer test This is to ensure that once we try to login, it actually attempts to start the local server CURA-5744 --- tests/TestOAuth2.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/TestOAuth2.py b/tests/TestOAuth2.py index 10578eaeb0..708dd2d41b 100644 --- a/tests/TestOAuth2.py +++ b/tests/TestOAuth2.py @@ -1,8 +1,10 @@ +import webbrowser from unittest.mock import MagicMock, patch from UM.Preferences import Preferences from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers from cura.OAuth2.AuthorizationService import AuthorizationService +from cura.OAuth2.LocalAuthorizationServer import LocalAuthorizationServer from cura.OAuth2.Models import OAuth2Settings, AuthenticationResponse, UserProfile CALLBACK_PORT = 32118 @@ -53,6 +55,24 @@ def test_failedLogin(): assert authorization_service.getAccessToken() is None +def test_localAuthServer(): + preferences = Preferences() + authorization_service = AuthorizationService(preferences, OAUTH_SETTINGS) + with patch.object(webbrowser, "open_new") as webrowser_open: + with patch.object(LocalAuthorizationServer, "start") as start_auth_server: + with patch.object(LocalAuthorizationServer, "stop") as stop_auth_server: + authorization_service.startAuthorizationFlow() + assert webrowser_open.call_count == 1 + + # Ensure that the Authorization service tried to start the server. + assert start_auth_server.call_count == 1 + assert stop_auth_server.call_count == 0 + authorization_service._onAuthStateChanged(FAILED_AUTH_RESPONSE) + + # Ensure that it stopped the server. + assert stop_auth_server.call_count == 1 + + def test_loginAndLogout(): preferences = Preferences() authorization_service = AuthorizationService(preferences, OAUTH_SETTINGS) From f16a9c62b52723c4974d6d333f3c293aebd9ce78 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Sep 2018 17:28:19 +0200 Subject: [PATCH 059/212] Fix typo CL-5744 --- cura/API/Account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index 19ee0123d7..cb80131425 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -37,7 +37,7 @@ class Account(QObject): CALLBACK_PORT=self._callback_port, CALLBACK_URL="http://localhost:{}/callback".format(self._callback_port), CLIENT_ID="um---------------ultimaker_cura", - CLIENT_SCOPES="user.read drive.backups.read drive.backups.write.client.package.download", + CLIENT_SCOPES="user.read drive.backups.read drive.backups.write client.package.download", AUTH_DATA_PREFERENCE_KEY="general/ultimaker_auth_data", AUTH_SUCCESS_REDIRECT="{}/auth-success".format(self._cloud_api_root), AUTH_FAILED_REDIRECT="{}//auth-error".format(self._cloud_api_root) From b48adf5b3e4fd68f3329105d17a668021738df9f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Sep 2018 17:37:06 +0200 Subject: [PATCH 060/212] Typing fixes CURA-5744 --- cura/API/Account.py | 4 ++-- cura/OAuth2/AuthorizationRequestHandler.py | 6 +++--- cura/OAuth2/LocalAuthorizationServer.py | 3 +-- tests/TestOAuth2.py | 10 +++++----- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index cb80131425..6bb5b4e50d 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -1,6 +1,6 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Tuple, Optional, Dict +from typing import Optional, Dict from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty @@ -48,7 +48,7 @@ class Account(QObject): self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged) self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged) - self._error_message = None + self._error_message = None # type: Optional[Message] self._logged_in = False @pyqtProperty(bool, notify=loginStateChanged) diff --git a/cura/OAuth2/AuthorizationRequestHandler.py b/cura/OAuth2/AuthorizationRequestHandler.py index 0558db784f..3b5b0c34d8 100644 --- a/cura/OAuth2/AuthorizationRequestHandler.py +++ b/cura/OAuth2/AuthorizationRequestHandler.py @@ -5,11 +5,11 @@ from typing import Optional, Callable, Tuple, Dict, Any, List, TYPE_CHECKING from http.server import BaseHTTPRequestHandler from urllib.parse import parse_qs, urlparse -from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers from cura.OAuth2.Models import AuthenticationResponse, ResponseData, HTTP_STATUS if TYPE_CHECKING: from cura.OAuth2.Models import ResponseStatus + from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers class AuthorizationRequestHandler(BaseHTTPRequestHandler): @@ -22,7 +22,7 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): super().__init__(request, client_address, server) # These values will be injected by the HTTPServer that this handler belongs to. - self.authorization_helpers = None # type: Optional[AuthorizationHelpers] + self.authorization_helpers = None # type: Optional["AuthorizationHelpers"] self.authorization_callback = None # type: Optional[Callable[[AuthenticationResponse], None]] self.verification_code = None # type: Optional[str] @@ -52,7 +52,7 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): # This will cause the server to shut down, so we do it at the very end of the request handling. self.authorization_callback(token_response) - def _handleCallback(self, query: Dict[Any, List]) -> Tuple["ResponseData", Optional["AuthenticationResponse"]]: + def _handleCallback(self, query: Dict[Any, List]) -> Tuple[ResponseData, Optional[AuthenticationResponse]]: """ Handler for the callback URL redirect. :param query: Dict containing the HTTP query parameters. diff --git a/cura/OAuth2/LocalAuthorizationServer.py b/cura/OAuth2/LocalAuthorizationServer.py index d1d07b5c91..488a33941d 100644 --- a/cura/OAuth2/LocalAuthorizationServer.py +++ b/cura/OAuth2/LocalAuthorizationServer.py @@ -5,13 +5,12 @@ from typing import Optional, Callable, Any, TYPE_CHECKING from UM.Logger import Logger -from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers from cura.OAuth2.AuthorizationRequestServer import AuthorizationRequestServer from cura.OAuth2.AuthorizationRequestHandler import AuthorizationRequestHandler if TYPE_CHECKING: from cura.OAuth2.Models import AuthenticationResponse - + from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers class LocalAuthorizationServer: def __init__(self, auth_helpers: "AuthorizationHelpers", diff --git a/tests/TestOAuth2.py b/tests/TestOAuth2.py index 708dd2d41b..7deb712aea 100644 --- a/tests/TestOAuth2.py +++ b/tests/TestOAuth2.py @@ -29,14 +29,14 @@ SUCCESFULL_AUTH_RESPONSE = AuthenticationResponse(access_token = "beep", refresh MALFORMED_AUTH_RESPONSE = AuthenticationResponse() -def test_cleanAuthService(): +def test_cleanAuthService() -> None: # Ensure that when setting up an AuthorizationService, no data is set. authorization_service = AuthorizationService(Preferences(), OAUTH_SETTINGS) assert authorization_service.getUserProfile() is None assert authorization_service.getAccessToken() is None -def test_failedLogin(): +def test_failedLogin() -> None: authorization_service = AuthorizationService(Preferences(), OAUTH_SETTINGS) authorization_service.onAuthenticationError.emit = MagicMock() authorization_service.onAuthStateChanged.emit = MagicMock() @@ -55,7 +55,7 @@ def test_failedLogin(): assert authorization_service.getAccessToken() is None -def test_localAuthServer(): +def test_localAuthServer() -> None: preferences = Preferences() authorization_service = AuthorizationService(preferences, OAUTH_SETTINGS) with patch.object(webbrowser, "open_new") as webrowser_open: @@ -73,7 +73,7 @@ def test_localAuthServer(): assert stop_auth_server.call_count == 1 -def test_loginAndLogout(): +def test_loginAndLogout() -> None: preferences = Preferences() authorization_service = AuthorizationService(preferences, OAUTH_SETTINGS) authorization_service.onAuthenticationError.emit = MagicMock() @@ -103,7 +103,7 @@ def test_loginAndLogout(): assert preferences.getValue("test/auth_data") == "{}" -def test_wrongServerResponses(): +def test_wrongServerResponses() -> None: authorization_service = AuthorizationService(Preferences(), OAUTH_SETTINGS) with patch.object(AuthorizationHelpers, "parseJWT", return_value=UserProfile()): authorization_service._onAuthStateChanged(MALFORMED_AUTH_RESPONSE) From 91bcfb9445ad937a84c25e078a15b3f9346b02bd Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 25 Sep 2018 15:29:29 +0200 Subject: [PATCH 061/212] Take in account extruders that haven't been loaded yet CURA-5751 --- cura/Settings/ExtruderManager.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 18744cd13f..8221203b78 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -357,8 +357,19 @@ class ExtruderManager(QObject): # After 3.4, all single-extrusion machines have their own extruder definition files instead of reusing # "fdmextruder". We need to check a machine here so its extruder definition is correct according to this. def _fixSingleExtrusionMachineExtruderDefinition(self, global_stack: "GlobalStack") -> None: + container_registry = ContainerRegistry.getInstance() expected_extruder_definition_0_id = global_stack.getMetaDataEntry("machine_extruder_trains")["0"] extruder_stack_0 = global_stack.extruders.get("0") + # At this point, extruder stacks for this machine may not have been loaded yet. In this case, need to look in + # the container registry as well. + if not global_stack.extruders: + extruder_trains = container_registry.findContainerStacks(type = "extruder_train", + machine = global_stack.getId()) + if extruder_trains: + for extruder in extruder_trains: + if extruder.getMetaDataEntry("position") == "0": + extruder_stack_0 = extruder + break if extruder_stack_0 is None: Logger.log("i", "No extruder stack for global stack [%s], create one", global_stack.getId()) @@ -369,7 +380,6 @@ class ExtruderManager(QObject): elif extruder_stack_0.definition.getId() != expected_extruder_definition_0_id: Logger.log("e", "Single extruder printer [{printer}] expected extruder [{expected}], but got [{got}]. I'm making it [{expected}].".format( printer = global_stack.getId(), expected = expected_extruder_definition_0_id, got = extruder_stack_0.definition.getId())) - container_registry = ContainerRegistry.getInstance() extruder_definition = container_registry.findDefinitionContainers(id = expected_extruder_definition_0_id)[0] extruder_stack_0.definition = extruder_definition From d5c86365f86a7eee90539a25ebc8613cb9b5dc8f Mon Sep 17 00:00:00 2001 From: THeijmans Date: Wed, 26 Sep 2018 15:02:25 +0200 Subject: [PATCH 062/212] S5 profile optimizations Removing the prime blob, equalizing flows and avoiding supports. --- resources/definitions/ultimaker_s5.def.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index 115c84c0db..2024acdf73 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -63,7 +63,7 @@ "machine_end_gcode": { "default_value": "" }, "prime_tower_position_x": { "default_value": 345 }, "prime_tower_position_y": { "default_value": 222.5 }, - "prime_blob_enable": { "enabled": true }, + "prime_blob_enable": { "enabled": false }, "speed_travel": { @@ -127,6 +127,7 @@ "retraction_min_travel": { "value": "5" }, "retraction_prime_speed": { "value": "15" }, "skin_overlap": { "value": "10" }, + "speed_equalize_flow_enabled": { "value": "True" }, "speed_layer_0": { "value": "20" }, "speed_prime_tower": { "value": "speed_topbottom" }, "speed_print": { "value": "35" }, @@ -145,6 +146,7 @@ "switch_extruder_prime_speed": { "value": "15" }, "switch_extruder_retraction_amount": { "value": "8" }, "top_bottom_thickness": { "value": "1" }, + "travel_avoid_supports": { "value": "True" }, "travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" }, "wall_0_inset": { "value": "0" }, "wall_line_width_x": { "value": "round(line_width * 0.3 / 0.35, 2)" }, From 7a681a2ae4260b0777072564e78a499ab0257eca Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 26 Sep 2018 16:54:00 +0200 Subject: [PATCH 063/212] Move Cura custom setting functions to a separate file --- cura/CuraApplication.py | 16 ++- cura/Settings/CustomSettingFunctions.py | 134 ++++++++++++++++++++ cura/Settings/ExtruderManager.py | 162 +----------------------- cura/Settings/UserChangesModel.py | 26 ++-- 4 files changed, 161 insertions(+), 177 deletions(-) create mode 100644 cura/Settings/CustomSettingFunctions.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index dbaef4df34..857aafb567 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -107,6 +107,7 @@ from cura.Settings.MaterialSettingsVisibilityHandler import MaterialSettingsVisi from cura.Settings.ContainerManager import ContainerManager from cura.Settings.SidebarCustomMenuItemsModel import SidebarCustomMenuItemsModel import cura.Settings.cura_empty_instance_containers +from cura.Settings.CustomSettingFunctions import CustomSettingFunctions from cura.ObjectsModel import ObjectsModel @@ -174,6 +175,8 @@ class CuraApplication(QtApplication): self._single_instance = None + self._custom_setting_functions = None + self._cura_package_manager = None self._machine_action_manager = None @@ -317,6 +320,8 @@ class CuraApplication(QtApplication): # Adds custom property types, settings types, and extra operators (functions) that need to be registered in # SettingDefinition and SettingFunction. def __initializeSettingDefinitionsAndFunctions(self): + self._custom_setting_functions = CustomSettingFunctions(self) + # Need to do this before ContainerRegistry tries to load the machines SettingDefinition.addSupportedProperty("settable_per_mesh", DefinitionPropertyType.Any, default = True, read_only = True) SettingDefinition.addSupportedProperty("settable_per_extruder", DefinitionPropertyType.Any, default = True, read_only = True) @@ -337,10 +342,10 @@ class CuraApplication(QtApplication): SettingDefinition.addSettingType("optional_extruder", None, str, None) SettingDefinition.addSettingType("[int]", None, str, None) - SettingFunction.registerOperator("extruderValues", ExtruderManager.getExtruderValues) - SettingFunction.registerOperator("extruderValue", ExtruderManager.getExtruderValue) - SettingFunction.registerOperator("resolveOrValue", ExtruderManager.getResolveOrValue) - SettingFunction.registerOperator("defaultExtruderPosition", ExtruderManager.getDefaultExtruderPosition) + SettingFunction.registerOperator("extruderValue", self._custom_setting_functions.getValueInExtruder) + SettingFunction.registerOperator("extruderValues", self._custom_setting_functions.getValuesInAllExtruders) + SettingFunction.registerOperator("resolveOrValue", self._custom_setting_functions.getResolveOrValue) + SettingFunction.registerOperator("defaultExtruderPosition", self._custom_setting_functions.getDefaultExtruderPosition) # Adds all resources and container related resources. def __addAllResourcesAndContainerResources(self) -> None: @@ -804,6 +809,9 @@ class CuraApplication(QtApplication): def getSettingVisibilityPresetsModel(self, *args) -> SettingVisibilityPresetsModel: return self._setting_visibility_presets_model + def getCustomSettingFunctions(self, *args) -> CustomSettingFunctions: + return self._custom_setting_functions + def getMachineErrorChecker(self, *args) -> MachineErrorChecker: return self._machine_error_checker diff --git a/cura/Settings/CustomSettingFunctions.py b/cura/Settings/CustomSettingFunctions.py new file mode 100644 index 0000000000..fe3ea1a935 --- /dev/null +++ b/cura/Settings/CustomSettingFunctions.py @@ -0,0 +1,134 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from typing import Any, List, Optional, TYPE_CHECKING + +from UM.Settings.PropertyEvaluationContext import PropertyEvaluationContext +from UM.Settings.SettingFunction import SettingFunction + +if TYPE_CHECKING: + from cura.CuraApplication import CuraApplication + from cura.Settings.CuraContainerStack import CuraContainerStack + + +# +# This class contains all Cura-related custom setting functions. Some functions requires information such as the +# currently active machine, so this is made into a class instead of standalone functions. +# +class CustomSettingFunctions: + + def __init__(self, application: "CuraApplication") -> None: + self._application = application + + # ================ + # Custom Functions + # ================ + + # Gets the default extruder position of the currently active machine. + def getDefaultExtruderPosition(self) -> str: + machine_manager = self._application.getMachineManager() + return machine_manager.defaultExtruderPosition + + # Gets the given setting key from the given extruder position. + def getValueInExtruder(self, extruder_position: int, property_key: str, + context: Optional["PropertyEvaluationContext"] = None) -> Any: + machine_manager = self._application.getMachineManager() + + if extruder_position == -1: + extruder_position = int(machine_manager.defaultExtruderPosition) + + global_stack = machine_manager.activeMachine + extruder_stack = global_stack.extruders[str(extruder_position)] + + if extruder_stack: + value = extruder_stack.getRawProperty(property_key, "value", context = context) + if isinstance(value, SettingFunction): + value = value(extruder_stack, context = context) + else: + # Just a value from global. + value = global_stack.getProperty(property_key, "value", context = context) + + return value + + # Gets all extruder values as a list for the given property. + def getValuesInAllExtruders(self, property_key: str, + context: Optional["PropertyEvaluationContext"] = None) -> List[Any]: + machine_manager = self._application.getMachineManager() + extruder_manager = self._application.getExtruderManager() + + global_stack = machine_manager.activeMachine + + result = [] + for extruder in extruder_manager.getActiveExtruderStacks(): + if not extruder.isEnabled: + continue + # only include values from extruders that are "active" for the current machine instance + if int(extruder.getMetaDataEntry("position")) >= global_stack.getProperty("machine_extruder_count", "value", context = context): + continue + + value = extruder.getRawProperty(property_key, "value", context = context) + + if value is None: + continue + + if isinstance(value, SettingFunction): + value = value(extruder, context= context) + + result.append(value) + + if not result: + result.append(global_stack.getProperty(property_key, "value", context = context)) + + return result + + # Get the resolve value or value for a given key. + def getResolveOrValue(self, property_key: str, context: Optional["PropertyEvaluationContext"] = None) -> Any: + machine_manager = self._application.getMachineManager() + + global_stack = machine_manager.activeMachine + resolved_value = global_stack.getProperty(property_key, "value", context = context) + + return resolved_value + + # Gets the default setting value from given extruder position. The default value is what excludes the values in + # the user_changes container. + def getDefaultValueInExtruder(self, extruder_position: int, property_key: str) -> Any: + machine_manager = self._application.getMachineManager() + + global_stack = machine_manager.activeMachine + extruder_stack = global_stack.extruders[str(extruder_position)] + + context = self.createContextForDefaultValueEvaluation(extruder_stack) + + return self.getValueInExtruder(extruder_position, property_key, context = context) + + # Gets all default setting values as a list from all extruders of the currently active machine. + # The default values are those excluding the values in the user_changes container. + def getDefaultValuesInAllExtruders(self, property_key: str) -> List[Any]: + machine_manager = self._application.getMachineManager() + + global_stack = machine_manager.activeMachine + + context = self.createContextForDefaultValueEvaluation(global_stack) + + return self.getValuesInAllExtruders(property_key, context = context) + + # Gets the resolve value or value for a given key without looking the first container (user container). + def getDefaultResolveOrValue(self, property_key: str) -> Any: + machine_manager = self._application.getMachineManager() + + global_stack = machine_manager.activeMachine + + context = self.createContextForDefaultValueEvaluation(global_stack) + return self.getResolveOrValue(property_key, context = context) + + # Creates a context for evaluating default values (skip the user_changes container). + def createContextForDefaultValueEvaluation(self, source_stack: "CuraContainerStack") -> "PropertyEvaluationContext": + context = PropertyEvaluationContext(source_stack) + context.context["evaluate_from_container_index"] = 1 # skip the user settings container + context.context["override_operators"] = { + "extruderValue": self.getDefaultValueInExtruder, + "extruderValues": self.getDefaultValuesInAllExtruders, + "resolveOrValue": self.getDefaultResolveOrValue, + } + return context diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 803491d1b3..99bd7e9b56 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -12,9 +12,7 @@ from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.Settings.ContainerRegistry import ContainerRegistry # Finding containers by ID. -from UM.Settings.SettingFunction import SettingFunction from UM.Settings.ContainerStack import ContainerStack -from UM.Settings.PropertyEvaluationContext import PropertyEvaluationContext from typing import Any, cast, Dict, List, Optional, TYPE_CHECKING, Union @@ -376,86 +374,6 @@ class ExtruderManager(QObject): extruder_definition = container_registry.findDefinitionContainers(id = expected_extruder_definition_0_id)[0] extruder_stack_0.definition = extruder_definition - ## Get all extruder values for a certain setting. - # - # This is exposed to SettingFunction so it can be used in value functions. - # - # \param key The key of the setting to retrieve values for. - # - # \return A list of values for all extruders. If an extruder does not have a value, it will not be in the list. - # If no extruder has the value, the list will contain the global value. - @staticmethod - def getExtruderValues(key: str) -> List[Any]: - global_stack = cast(GlobalStack, cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()) #We know that there must be a global stack by the time you're requesting setting values. - - result = [] - for extruder in ExtruderManager.getInstance().getActiveExtruderStacks(): - if not extruder.isEnabled: - continue - # only include values from extruders that are "active" for the current machine instance - if int(extruder.getMetaDataEntry("position")) >= global_stack.getProperty("machine_extruder_count", "value"): - continue - - value = extruder.getRawProperty(key, "value") - - if value is None: - continue - - if isinstance(value, SettingFunction): - value = value(extruder) - - result.append(value) - - if not result: - result.append(global_stack.getProperty(key, "value")) - - return result - - ## Get all extruder values for a certain setting. This function will skip the user settings container. - # - # This is exposed to SettingFunction so it can be used in value functions. - # - # \param key The key of the setting to retrieve values for. - # - # \return A list of values for all extruders. If an extruder does not have a value, it will not be in the list. - # If no extruder has the value, the list will contain the global value. - @staticmethod - def getDefaultExtruderValues(key: str) -> List[Any]: - global_stack = cast(GlobalStack, cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()) #We know that there must be a global stack by the time you're requesting setting values. - context = PropertyEvaluationContext(global_stack) - context.context["evaluate_from_container_index"] = 1 # skip the user settings container - context.context["override_operators"] = { - "extruderValue": ExtruderManager.getDefaultExtruderValue, - "extruderValues": ExtruderManager.getDefaultExtruderValues, - "resolveOrValue": ExtruderManager.getDefaultResolveOrValue - } - - result = [] - for extruder in ExtruderManager.getInstance().getActiveExtruderStacks(): - # only include values from extruders that are "active" for the current machine instance - if int(extruder.getMetaDataEntry("position")) >= global_stack.getProperty("machine_extruder_count", "value", context = context): - continue - - value = extruder.getRawProperty(key, "value", context = context) - - if value is None: - continue - - if isinstance(value, SettingFunction): - value = value(extruder, context = context) - - result.append(value) - - if not result: - result.append(global_stack.getProperty(key, "value", context = context)) - - return result - - ## Return the default extruder position from the machine manager - @staticmethod - def getDefaultExtruderPosition() -> str: - return cura.CuraApplication.CuraApplication.getInstance().getMachineManager().defaultExtruderPosition - ## Get all extruder values for a certain setting. # # This is exposed to qml for display purposes @@ -464,62 +382,8 @@ class ExtruderManager(QObject): # # \return String representing the extruder values @pyqtSlot(str, result="QVariant") - def getInstanceExtruderValues(self, key) -> List: - return ExtruderManager.getExtruderValues(key) - - ## Get the value for a setting from a specific extruder. - # - # This is exposed to SettingFunction to use in value functions. - # - # \param extruder_index The index of the extruder to get the value from. - # \param key The key of the setting to get the value of. - # - # \return The value of the setting for the specified extruder or for the - # global stack if not found. - @staticmethod - def getExtruderValue(extruder_index: int, key: str) -> Any: - if extruder_index == -1: - extruder_index = int(cura.CuraApplication.CuraApplication.getInstance().getMachineManager().defaultExtruderPosition) - extruder = ExtruderManager.getInstance().getExtruderStack(extruder_index) - - if extruder: - value = extruder.getRawProperty(key, "value") - if isinstance(value, SettingFunction): - value = value(extruder) - else: - # Just a value from global. - value = cast(GlobalStack, cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()).getProperty(key, "value") - - return value - - ## Get the default value from the given extruder. This function will skip the user settings container. - # - # This is exposed to SettingFunction to use in value functions. - # - # \param extruder_index The index of the extruder to get the value from. - # \param key The key of the setting to get the value of. - # - # \return The value of the setting for the specified extruder or for the - # global stack if not found. - @staticmethod - def getDefaultExtruderValue(extruder_index: int, key: str) -> Any: - extruder = ExtruderManager.getInstance().getExtruderStack(extruder_index) - context = PropertyEvaluationContext(extruder) - context.context["evaluate_from_container_index"] = 1 # skip the user settings container - context.context["override_operators"] = { - "extruderValue": ExtruderManager.getDefaultExtruderValue, - "extruderValues": ExtruderManager.getDefaultExtruderValues, - "resolveOrValue": ExtruderManager.getDefaultResolveOrValue - } - - if extruder: - value = extruder.getRawProperty(key, "value", context = context) - if isinstance(value, SettingFunction): - value = value(extruder, context = context) - else: # Just a value from global. - value = cast(GlobalStack, cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()).getProperty(key, "value", context = context) - - return value + def getInstanceExtruderValues(self, key: str) -> List: + return self._application.getCustomSettingFunctions().getValuesInAllExtruders(key) ## Get the resolve value or value for a given key # @@ -535,28 +399,6 @@ class ExtruderManager(QObject): return resolved_value - ## Get the resolve value or value for a given key without looking the first container (user container) - # - # This is the effective value for a given key, it is used for values in the global stack. - # This is exposed to SettingFunction to use in value functions. - # \param key The key of the setting to get the value of. - # - # \return The effective value - @staticmethod - def getDefaultResolveOrValue(key: str) -> Any: - global_stack = cast(GlobalStack, cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()) - context = PropertyEvaluationContext(global_stack) - context.context["evaluate_from_container_index"] = 1 # skip the user settings container - context.context["override_operators"] = { - "extruderValue": ExtruderManager.getDefaultExtruderValue, - "extruderValues": ExtruderManager.getDefaultExtruderValues, - "resolveOrValue": ExtruderManager.getDefaultResolveOrValue - } - - resolved_value = global_stack.getProperty(key, "value", context = context) - - return resolved_value - __instance = None # type: ExtruderManager @classmethod diff --git a/cura/Settings/UserChangesModel.py b/cura/Settings/UserChangesModel.py index 95674e5ecd..d2ea84f79d 100644 --- a/cura/Settings/UserChangesModel.py +++ b/cura/Settings/UserChangesModel.py @@ -1,15 +1,17 @@ -from UM.Qt.ListModel import ListModel +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +import os +from collections import OrderedDict from PyQt5.QtCore import pyqtSlot, Qt + from UM.Application import Application -from cura.Settings.ExtruderManager import ExtruderManager from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog from UM.Settings.SettingFunction import SettingFunction -from UM.Settings.PropertyEvaluationContext import PropertyEvaluationContext -from collections import OrderedDict -import os +from UM.Qt.ListModel import ListModel class UserChangesModel(ListModel): @@ -38,9 +40,13 @@ class UserChangesModel(ListModel): self._update() def _update(self): + application = Application.getInstance() + machine_manager = application.getMachineManager() + custom_setting_functions = application.getCustomSettingFunctions() + item_dict = OrderedDict() item_list = [] - global_stack = Application.getInstance().getGlobalContainerStack() + global_stack = machine_manager.activeMachine if not global_stack: return @@ -71,13 +77,7 @@ class UserChangesModel(ListModel): # Override "getExtruderValue" with "getDefaultExtruderValue" so we can get the default values user_changes = containers.pop(0) - default_value_resolve_context = PropertyEvaluationContext(stack) - default_value_resolve_context.context["evaluate_from_container_index"] = 1 # skip the user settings container - default_value_resolve_context.context["override_operators"] = { - "extruderValue": ExtruderManager.getDefaultExtruderValue, - "extruderValues": ExtruderManager.getDefaultExtruderValues, - "resolveOrValue": ExtruderManager.getDefaultResolveOrValue - } + default_value_resolve_context = custom_setting_functions.createContextForDefaultValueEvaluation(stack) for setting_key in user_changes.getAllKeys(): original_value = None From 3c8368827bb9f86fce870d9767a04cba8eaa2a09 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 26 Sep 2018 17:04:15 +0200 Subject: [PATCH 064/212] Remove unused functions in ExtruderManager --- cura/Settings/ExtruderManager.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 99bd7e9b56..86ee546240 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -67,16 +67,6 @@ class ExtruderManager(QObject): except KeyError: # Extruder index could be -1 if the global tab is selected, or the entry doesn't exist if the machine definition is wrong. return None - ## Return extruder count according to extruder trains. - @pyqtProperty(int, notify = extrudersChanged) - def extruderCount(self) -> int: - if not self._application.getGlobalContainerStack(): - return 0 # No active machine, so no extruders. - try: - return len(self._extruder_trains[self._application.getGlobalContainerStack().getId()]) - except KeyError: - return 0 - ## Gets a dict with the extruder stack ids with the extruder number as the key. @pyqtProperty("QVariantMap", notify = extrudersChanged) def extruderIds(self) -> Dict[str, str]: From 067e59a254a66a4939cc0ecf20454a841c5257d0 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 26 Sep 2018 17:06:09 +0200 Subject: [PATCH 065/212] Add logged_in as argument to loginStateChanged callback CURA-5744 --- cura/API/Account.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index 6bb5b4e50d..c4499fb750 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -24,7 +24,7 @@ i18n_catalog = i18nCatalog("cura") # class Account(QObject): # Signal emitted when user logged in or out. - loginStateChanged = pyqtSignal() + loginStateChanged = pyqtSignal(bool) def __init__(self, parent = None) -> None: super().__init__(parent) @@ -64,7 +64,7 @@ class Account(QObject): if self._logged_in != logged_in: self._logged_in = logged_in - self.loginStateChanged.emit() + self.loginStateChanged.emit(logged_in) @pyqtSlot() def login(self) -> None: From 2a201cef23b8e2620cecf70f84b42568702bee91 Mon Sep 17 00:00:00 2001 From: alekseisasin Date: Wed, 26 Sep 2018 17:06:24 +0200 Subject: [PATCH 066/212] Prevent cura crash after setting Print as Support in per object setting menu CURA-5766 --- plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 596fbd2e99..4c9ba2169c 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -185,6 +185,12 @@ Item { { selectedObjectId: UM.ActiveTool.properties.getValue("SelectedObjectId") } + + // For some reason the model object is updated after removing him from the memory and + // it happens only on Windows. For this reason, set the destroyed value manually. + Component.onDestruction: { + setDestroyed(true); + } } delegate: Row From 16ff1c371236d8dc01daee4694858b51ee5250e7 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 26 Sep 2018 17:12:00 +0200 Subject: [PATCH 067/212] Add property for the accessToken CURA-5744 --- cura/API/Account.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/API/Account.py b/cura/API/Account.py index c4499fb750..c30b8d4586 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -87,6 +87,10 @@ class Account(QObject): return None return user_profile.profile_image_url + @pyqtProperty(str, notify=loginStateChanged) + def accessToken(self) -> Optional[str]: + return self._authorization_service.getAccessToken() + # Get the profile of the logged in user # @returns None if no user is logged in, a dict containing user_id, username and profile_image_url @pyqtProperty("QVariantMap", notify = loginStateChanged) From d5dbf91a4f90892aa81871386589f2d3f35008d4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 26 Sep 2018 17:23:36 +0200 Subject: [PATCH 068/212] Switch unit test to use decoratior instead of with waterfall CURA-5744 --- tests/TestOAuth2.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/TestOAuth2.py b/tests/TestOAuth2.py index 7deb712aea..312d71fd5f 100644 --- a/tests/TestOAuth2.py +++ b/tests/TestOAuth2.py @@ -55,22 +55,22 @@ def test_failedLogin() -> None: assert authorization_service.getAccessToken() is None -def test_localAuthServer() -> None: +@patch.object(LocalAuthorizationServer, "stop") +@patch.object(LocalAuthorizationServer, "start") +@patch.object(webbrowser, "open_new") +def test_localAuthServer(webbrowser_open, start_auth_server, stop_auth_server) -> None: preferences = Preferences() authorization_service = AuthorizationService(preferences, OAUTH_SETTINGS) - with patch.object(webbrowser, "open_new") as webrowser_open: - with patch.object(LocalAuthorizationServer, "start") as start_auth_server: - with patch.object(LocalAuthorizationServer, "stop") as stop_auth_server: - authorization_service.startAuthorizationFlow() - assert webrowser_open.call_count == 1 + authorization_service.startAuthorizationFlow() + assert webbrowser_open.call_count == 1 - # Ensure that the Authorization service tried to start the server. - assert start_auth_server.call_count == 1 - assert stop_auth_server.call_count == 0 - authorization_service._onAuthStateChanged(FAILED_AUTH_RESPONSE) + # Ensure that the Authorization service tried to start the server. + assert start_auth_server.call_count == 1 + assert stop_auth_server.call_count == 0 + authorization_service._onAuthStateChanged(FAILED_AUTH_RESPONSE) - # Ensure that it stopped the server. - assert stop_auth_server.call_count == 1 + # Ensure that it stopped the server. + assert stop_auth_server.call_count == 1 def test_loginAndLogout() -> None: From 52ffe39c07cf040e5e44c503807a4075ef4b3fee Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 27 Sep 2018 10:33:50 +0200 Subject: [PATCH 069/212] Small fixes in settings --- cura/API/Account.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index c30b8d4586..7944290f6e 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -36,11 +36,11 @@ class Account(QObject): OAUTH_SERVER_URL= self._oauth_root, CALLBACK_PORT=self._callback_port, CALLBACK_URL="http://localhost:{}/callback".format(self._callback_port), - CLIENT_ID="um---------------ultimaker_cura", + CLIENT_ID="um---------------ultimaker_cura_drive_plugin", CLIENT_SCOPES="user.read drive.backups.read drive.backups.write client.package.download", AUTH_DATA_PREFERENCE_KEY="general/ultimaker_auth_data", AUTH_SUCCESS_REDIRECT="{}/auth-success".format(self._cloud_api_root), - AUTH_FAILED_REDIRECT="{}//auth-error".format(self._cloud_api_root) + AUTH_FAILED_REDIRECT="{}/auth-error".format(self._cloud_api_root) ) self._authorization_service = AuthorizationService(Application.getInstance().getPreferences(), self._oauth_settings) From 246d12a596c8122516d15d82742ecc3dca369aad Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 27 Sep 2018 10:48:22 +0200 Subject: [PATCH 070/212] Remove client.package.download scope until that is deployed on production --- cura/API/Account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index 7944290f6e..e28f943009 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -37,7 +37,7 @@ class Account(QObject): CALLBACK_PORT=self._callback_port, CALLBACK_URL="http://localhost:{}/callback".format(self._callback_port), CLIENT_ID="um---------------ultimaker_cura_drive_plugin", - CLIENT_SCOPES="user.read drive.backups.read drive.backups.write client.package.download", + CLIENT_SCOPES="user.read drive.backups.read drive.backups.write", AUTH_DATA_PREFERENCE_KEY="general/ultimaker_auth_data", AUTH_SUCCESS_REDIRECT="{}/auth-success".format(self._cloud_api_root), AUTH_FAILED_REDIRECT="{}/auth-error".format(self._cloud_api_root) From 1c8804ff2c637425d4b80b5472787e8b1e8d1e3c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 27 Sep 2018 11:03:17 +0200 Subject: [PATCH 071/212] Changed documentation style to doxygen CURA-5744 --- cura/OAuth2/AuthorizationHelpers.py | 54 ++++++++-------------- cura/OAuth2/AuthorizationRequestHandler.py | 23 +++------ cura/OAuth2/AuthorizationRequestServer.py | 16 +++---- cura/OAuth2/AuthorizationService.py | 38 +++++++-------- cura/OAuth2/LocalAuthorizationServer.py | 28 +++++------ 5 files changed, 62 insertions(+), 97 deletions(-) diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py index 06cc0a6061..7141b83279 100644 --- a/cura/OAuth2/AuthorizationHelpers.py +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -13,25 +13,22 @@ from UM.Logger import Logger from cura.OAuth2.Models import AuthenticationResponse, UserProfile, OAuth2Settings +# Class containing several helpers to deal with the authorization flow. class AuthorizationHelpers: - """Class containing several helpers to deal with the authorization flow.""" - def __init__(self, settings: "OAuth2Settings") -> None: self._settings = settings self._token_url = "{}/token".format(self._settings.OAUTH_SERVER_URL) @property + # The OAuth2 settings object. def settings(self) -> "OAuth2Settings": - """Get the OAuth2 settings object.""" return self._settings + # Request the access token from the authorization server. + # \param authorization_code: The authorization code from the 1st step. + # \param verification_code: The verification code needed for the PKCE extension. + # \return: An AuthenticationResponse object. def getAccessTokenUsingAuthorizationCode(self, authorization_code: str, verification_code: str)-> "AuthenticationResponse": - """ - Request the access token from the authorization server. - :param authorization_code: The authorization code from the 1st step. - :param verification_code: The verification code needed for the PKCE extension. - :return: An AuthenticationResponse object. - """ return self.parseTokenResponse(requests.post(self._token_url, data={ "client_id": self._settings.CLIENT_ID, "redirect_uri": self._settings.CALLBACK_URL, @@ -41,12 +38,10 @@ class AuthorizationHelpers: "scope": self._settings.CLIENT_SCOPES })) + # Request the access token from the authorization server using a refresh token. + # \param refresh_token: + # \return: An AuthenticationResponse object. def getAccessTokenUsingRefreshToken(self, refresh_token: str) -> AuthenticationResponse: - """ - Request the access token from the authorization server using a refresh token. - :param refresh_token: - :return: An AuthenticationResponse object. - """ return self.parseTokenResponse(requests.post(self._token_url, data={ "client_id": self._settings.CLIENT_ID, "redirect_uri": self._settings.CALLBACK_URL, @@ -56,12 +51,10 @@ class AuthorizationHelpers: })) @staticmethod + # Parse the token response from the authorization server into an AuthenticationResponse object. + # \param token_response: The JSON string data response from the authorization server. + # \return: An AuthenticationResponse object. def parseTokenResponse(token_response: requests.models.Response) -> AuthenticationResponse: - """ - Parse the token response from the authorization server into an AuthenticationResponse object. - :param token_response: The JSON string data response from the authorization server. - :return: An AuthenticationResponse object. - """ token_data = None try: @@ -82,12 +75,10 @@ class AuthorizationHelpers: expires_in=token_data["expires_in"], scope=token_data["scope"]) + # Calls the authentication API endpoint to get the token data. + # \param access_token: The encoded JWT token. + # \return: Dict containing some profile data. def parseJWT(self, access_token: str) -> Optional["UserProfile"]: - """ - Calls the authentication API endpoint to get the token data. - :param access_token: The encoded JWT token. - :return: Dict containing some profile data. - """ token_request = requests.get("{}/check-token".format(self._settings.OAUTH_SERVER_URL), headers = { "Authorization": "Bearer {}".format(access_token) }) @@ -105,20 +96,15 @@ class AuthorizationHelpers: ) @staticmethod + # Generate a 16-character verification code. + # \param code_length: How long should the code be? def generateVerificationCode(code_length: int = 16) -> str: - """ - Generate a 16-character verification code. - :param code_length: - :return: - """ return "".join(random.choice("0123456789ABCDEF") for i in range(code_length)) @staticmethod + # Generates a base64 encoded sha512 encrypted version of a given string. + # \param verification_code: + # \return: The encrypted code in base64 format. def generateVerificationCodeChallenge(verification_code: str) -> str: - """ - Generates a base64 encoded sha512 encrypted version of a given string. - :param verification_code: - :return: The encrypted code in base64 format. - """ encoded = sha512(verification_code.encode()).digest() return b64encode(encoded, altchars = b"_-").decode() diff --git a/cura/OAuth2/AuthorizationRequestHandler.py b/cura/OAuth2/AuthorizationRequestHandler.py index 3b5b0c34d8..7e0a659a56 100644 --- a/cura/OAuth2/AuthorizationRequestHandler.py +++ b/cura/OAuth2/AuthorizationRequestHandler.py @@ -12,12 +12,9 @@ if TYPE_CHECKING: from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers +# This handler handles all HTTP requests on the local web server. +# It also requests the access token for the 2nd stage of the OAuth flow. class AuthorizationRequestHandler(BaseHTTPRequestHandler): - """ - This handler handles all HTTP requests on the local web server. - It also requests the access token for the 2nd stage of the OAuth flow. - """ - def __init__(self, request, client_address, server) -> None: super().__init__(request, client_address, server) @@ -27,8 +24,6 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): self.verification_code = None # type: Optional[str] def do_GET(self) -> None: - """Entry point for GET requests""" - # Extract values from the query string. parsed_url = urlparse(self.path) query = parse_qs(parsed_url.query) @@ -52,12 +47,10 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): # This will cause the server to shut down, so we do it at the very end of the request handling. self.authorization_callback(token_response) + # Handler for the callback URL redirect. + # \param query: Dict containing the HTTP query parameters. + # \return: HTTP ResponseData containing a success page to show to the user. def _handleCallback(self, query: Dict[Any, List]) -> Tuple[ResponseData, Optional[AuthenticationResponse]]: - """ - Handler for the callback URL redirect. - :param query: Dict containing the HTTP query parameters. - :return: HTTP ResponseData containing a success page to show to the user. - """ code = self._queryGet(query, "code") if code and self.authorization_helpers is not None and self.verification_code is not None: # If the code was returned we get the access token. @@ -88,12 +81,11 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): ), token_response @staticmethod + # Handle all other non-existing server calls. def _handleNotFound() -> ResponseData: - """Handle all other non-existing server calls.""" return ResponseData(status=HTTP_STATUS["NOT_FOUND"], content_type="text/html", data_stream=b"Not found.") def _sendHeaders(self, status: "ResponseStatus", content_type: str, redirect_uri: str = None) -> None: - """Send out the headers""" self.send_response(status.code, status.message) self.send_header("Content-type", content_type) if redirect_uri: @@ -101,10 +93,9 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler): self.end_headers() def _sendData(self, data: bytes) -> None: - """Send out the data""" self.wfile.write(data) @staticmethod + # Convenience Helper for getting values from a pre-parsed query string def _queryGet(query_data: Dict[Any, List], key: str, default: Optional[str]=None) -> Optional[str]: - """Helper for getting values from a pre-parsed query string""" return query_data.get(key, [default])[0] diff --git a/cura/OAuth2/AuthorizationRequestServer.py b/cura/OAuth2/AuthorizationRequestServer.py index 514a4ab5de..288e348ea9 100644 --- a/cura/OAuth2/AuthorizationRequestServer.py +++ b/cura/OAuth2/AuthorizationRequestServer.py @@ -8,21 +8,19 @@ if TYPE_CHECKING: from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers +# The authorization request callback handler server. +# This subclass is needed to be able to pass some data to the request handler. +# This cannot be done on the request handler directly as the HTTPServer creates an instance of the handler after +# init. class AuthorizationRequestServer(HTTPServer): - """ - The authorization request callback handler server. - This subclass is needed to be able to pass some data to the request handler. - This cannot be done on the request handler directly as the HTTPServer creates an instance of the handler after init. - """ - + # Set the authorization helpers instance on the request handler. def setAuthorizationHelpers(self, authorization_helpers: "AuthorizationHelpers") -> None: - """Set the authorization helpers instance on the request handler.""" self.RequestHandlerClass.authorization_helpers = authorization_helpers # type: ignore + # Set the authorization callback on the request handler. def setAuthorizationCallback(self, authorization_callback: Callable[["AuthenticationResponse"], Any]) -> None: - """Set the authorization callback on the request handler.""" self.RequestHandlerClass.authorization_callback = authorization_callback # type: ignore + # Set the verification code on the request handler. def setVerificationCode(self, verification_code: str) -> None: - """Set the verification code on the request handler.""" self.RequestHandlerClass.verification_code = verification_code # type: ignore diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 0f57621a47..04891b8d76 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -38,11 +38,11 @@ class AuthorizationService: self._server = LocalAuthorizationServer(self._auth_helpers, self._onAuthStateChanged, daemon=True) self._loadAuthData() + # Get the user profile as obtained from the JWT (JSON Web Token). + # If the JWT is not yet parsed, calling this will take care of that. + # \return UserProfile if a user is logged in, None otherwise. + # \sa _parseJWT def getUserProfile(self) -> Optional["UserProfile"]: - """ - Get the user data that is stored in the JWT token. - :return: Dict containing some user data. - """ if not self._user_profile: # If no user profile was stored locally, we try to get it from JWT. self._user_profile = self._parseJWT() @@ -52,11 +52,9 @@ class AuthorizationService: return self._user_profile + # Tries to parse the JWT (JSON Web Token) data, which it does if all the needed data is there. + # \return UserProfile if it was able to parse, None otherwise. def _parseJWT(self) -> Optional["UserProfile"]: - """ - Tries to parse the JWT if all the needed data exists. - :return: UserProfile if found, otherwise None. - """ if not self._auth_data or self._auth_data.access_token is None: # If no auth data exists, we should always log in again. return None @@ -74,10 +72,8 @@ class AuthorizationService: return self._auth_helpers.parseJWT(self._auth_data.access_token) + # Get the access token as provided by the repsonse data. def getAccessToken(self) -> Optional[str]: - """ - Get the access token response data. - """ if not self.getUserProfile(): # We check if we can get the user profile. # If we can't get it, that means the access token (JWT) was invalid or expired. @@ -88,24 +84,22 @@ class AuthorizationService: return self._auth_data.access_token + # Try to refresh the access token. This should be used when it has expired. def refreshAccessToken(self) -> None: - """ - Refresh the access token when it expired. - """ if self._auth_data is None or self._auth_data.refresh_token is None: Logger.log("w", "Unable to refresh access token, since there is no refresh token.") return self._storeAuthData(self._auth_helpers.getAccessTokenUsingRefreshToken(self._auth_data.refresh_token)) self.onAuthStateChanged.emit(logged_in=True) + # Delete the authentication data that we have stored locally (eg; logout) def deleteAuthData(self) -> None: - """Delete authentication data from preferences and locally.""" - self._storeAuthData() - self.onAuthStateChanged.emit(logged_in=False) + if self._auth_data is not None: + self._storeAuthData() + self.onAuthStateChanged.emit(logged_in=False) + # Start the flow to become authenticated. This will start a new webbrowser tap, prompting the user to login. def startAuthorizationFlow(self) -> None: - """Start a new OAuth2 authorization flow.""" - Logger.log("d", "Starting new OAuth2 flow...") # Create the tokens needed for the code challenge (PKCE) extension for OAuth2. @@ -131,8 +125,8 @@ class AuthorizationService: # Start a local web server to receive the callback URL on. self._server.start(verification_code) + # Callback method for the authentication flow. def _onAuthStateChanged(self, auth_response: AuthenticationResponse) -> None: - """Callback method for an authentication flow.""" if auth_response.success: self._storeAuthData(auth_response) self.onAuthStateChanged.emit(logged_in=True) @@ -140,8 +134,8 @@ class AuthorizationService: self.onAuthenticationError.emit(logged_in=False, error_message=auth_response.err_message) self._server.stop() # Stop the web server at all times. + # Load authentication data from preferences. def _loadAuthData(self) -> None: - """Load authentication data from preferences if available.""" self._cura_preferences.addPreference(self._settings.AUTH_DATA_PREFERENCE_KEY, "{}") try: preferences_data = json.loads(self._cura_preferences.getValue(self._settings.AUTH_DATA_PREFERENCE_KEY)) @@ -151,8 +145,8 @@ class AuthorizationService: except ValueError: Logger.logException("w", "Could not load auth data from preferences") + # Store authentication data in preferences. def _storeAuthData(self, auth_data: Optional[AuthenticationResponse] = None) -> None: - """Store authentication data in preferences and locally.""" self._auth_data = auth_data if auth_data: self._user_profile = self.getUserProfile() diff --git a/cura/OAuth2/LocalAuthorizationServer.py b/cura/OAuth2/LocalAuthorizationServer.py index 488a33941d..5a282d8135 100644 --- a/cura/OAuth2/LocalAuthorizationServer.py +++ b/cura/OAuth2/LocalAuthorizationServer.py @@ -12,16 +12,17 @@ if TYPE_CHECKING: from cura.OAuth2.Models import AuthenticationResponse from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers + class LocalAuthorizationServer: + # The local LocalAuthorizationServer takes care of the oauth2 callbacks. + # Once the flow is completed, this server should be closed down again by calling stop() + # \param auth_helpers: An instance of the authorization helpers class. + # \param auth_state_changed_callback: A callback function to be called when the authorization state changes. + # \param daemon: Whether the server thread should be run in daemon mode. Note: Daemon threads are abruptly stopped + # at shutdown. Their resources (e.g. open files) may never be released. def __init__(self, auth_helpers: "AuthorizationHelpers", auth_state_changed_callback: Callable[["AuthenticationResponse"], Any], daemon: bool) -> None: - """ - :param auth_helpers: An instance of the authorization helpers class. - :param auth_state_changed_callback: A callback function to be called when the authorization state changes. - :param daemon: Whether the server thread should be run in daemon mode. Note: Daemon threads are abruptly stopped - at shutdown. Their resources (e.g. open files) may never be released. - """ self._web_server = None # type: Optional[AuthorizationRequestServer] self._web_server_thread = None # type: Optional[threading.Thread] self._web_server_port = auth_helpers.settings.CALLBACK_PORT @@ -29,11 +30,9 @@ class LocalAuthorizationServer: self._auth_state_changed_callback = auth_state_changed_callback self._daemon = daemon + # Starts the local web server to handle the authorization callback. + # \param verification_code: The verification code part of the OAuth2 client identification. def start(self, verification_code: str) -> None: - """ - Starts the local web server to handle the authorization callback. - :param verification_code: The verification code part of the OAuth2 client identification. - """ if self._web_server: # If the server is already running (because of a previously aborted auth flow), we don't have to start it. # We still inject the new verification code though. @@ -43,12 +42,10 @@ class LocalAuthorizationServer: if self._web_server_port is None: raise Exception("Unable to start server without specifying the port.") - Logger.log("d", "Starting local web server to handle authorization callback on port %s", - self._web_server_port) + Logger.log("d", "Starting local web server to handle authorization callback on port %s", self._web_server_port) # Create the server and inject the callback and code. - self._web_server = AuthorizationRequestServer(("0.0.0.0", self._web_server_port), - AuthorizationRequestHandler) + self._web_server = AuthorizationRequestServer(("0.0.0.0", self._web_server_port), AuthorizationRequestHandler) self._web_server.setAuthorizationHelpers(self._auth_helpers) self._web_server.setAuthorizationCallback(self._auth_state_changed_callback) self._web_server.setVerificationCode(verification_code) @@ -57,9 +54,8 @@ class LocalAuthorizationServer: self._web_server_thread = threading.Thread(None, self._web_server.serve_forever, daemon = self._daemon) self._web_server_thread.start() + # Stops the web server if it was running. It also does some cleanup. def stop(self) -> None: - """ Stops the web server if it was running. Also deletes the objects. """ - Logger.log("d", "Stopping local oauth2 web server...") if self._web_server: From 506ec5109d51a2627ec76a3906554c99e3e18970 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 27 Sep 2018 11:37:22 +0200 Subject: [PATCH 072/212] Moved loading of the authentication to the account CURA-5744 --- cura/API/Account.py | 2 +- cura/OAuth2/AuthorizationService.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index e28f943009..e0cc4013ac 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -44,7 +44,7 @@ class Account(QObject): ) self._authorization_service = AuthorizationService(Application.getInstance().getPreferences(), self._oauth_settings) - + self._authorization_service.loadAuthDataFromPreferences() self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged) self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged) diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 04891b8d76..a118235499 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -36,7 +36,6 @@ class AuthorizationService: self._user_profile = None # type: Optional["UserProfile"] self._cura_preferences = preferences self._server = LocalAuthorizationServer(self._auth_helpers, self._onAuthStateChanged, daemon=True) - self._loadAuthData() # Get the user profile as obtained from the JWT (JSON Web Token). # If the JWT is not yet parsed, calling this will take care of that. @@ -135,7 +134,7 @@ class AuthorizationService: self._server.stop() # Stop the web server at all times. # Load authentication data from preferences. - def _loadAuthData(self) -> None: + def loadAuthDataFromPreferences(self) -> None: self._cura_preferences.addPreference(self._settings.AUTH_DATA_PREFERENCE_KEY, "{}") try: preferences_data = json.loads(self._cura_preferences.getValue(self._settings.AUTH_DATA_PREFERENCE_KEY)) From 0ccbabd857c7ba651a22044ede777b4c3a230e59 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 27 Sep 2018 11:37:44 +0200 Subject: [PATCH 073/212] Switch SHA512 implementation to use the one from hashlib CURA-5744 --- cura/OAuth2/AuthorizationHelpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py index 7141b83279..4d485b3bda 100644 --- a/cura/OAuth2/AuthorizationHelpers.py +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -2,7 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. import json import random -from _sha512 import sha512 +from hashlib import sha512 from base64 import b64encode from typing import Optional From 649f1c8961151d0b2fed756793a97a49578a0282 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 27 Sep 2018 11:42:12 +0200 Subject: [PATCH 074/212] Make it optional for the AuthService to have a preference object This should make it easier if we ever want to re-use the authService, since it no longer has a hard link with the Preferences CURA-5744 --- cura/OAuth2/AuthorizationService.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index a118235499..e9e3a7e65b 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -14,6 +14,7 @@ from cura.OAuth2.Models import AuthenticationResponse if TYPE_CHECKING: from cura.OAuth2.Models import UserProfile, OAuth2Settings + from UM.Preferences import Preferences class AuthorizationService: @@ -28,15 +29,18 @@ class AuthorizationService: # Emit signal when authentication failed. onAuthenticationError = Signal() - def __init__(self, preferences, settings: "OAuth2Settings") -> None: + def __init__(self, preferences: Optional["Preferences"], settings: "OAuth2Settings") -> None: self._settings = settings self._auth_helpers = AuthorizationHelpers(settings) self._auth_url = "{}/authorize".format(self._settings.OAUTH_SERVER_URL) self._auth_data = None # type: Optional[AuthenticationResponse] self._user_profile = None # type: Optional["UserProfile"] - self._cura_preferences = preferences + self._preferences = preferences self._server = LocalAuthorizationServer(self._auth_helpers, self._onAuthStateChanged, daemon=True) + if self._preferences: + self._preferences.addPreference(self._settings.AUTH_DATA_PREFERENCE_KEY, "{}") + # Get the user profile as obtained from the JWT (JSON Web Token). # If the JWT is not yet parsed, calling this will take care of that. # \return UserProfile if a user is logged in, None otherwise. @@ -135,9 +139,11 @@ class AuthorizationService: # Load authentication data from preferences. def loadAuthDataFromPreferences(self) -> None: - self._cura_preferences.addPreference(self._settings.AUTH_DATA_PREFERENCE_KEY, "{}") + if self._preferences is None: + Logger.logException("e", "Unable to load authentication data, since no preference has been set!") + return try: - preferences_data = json.loads(self._cura_preferences.getValue(self._settings.AUTH_DATA_PREFERENCE_KEY)) + preferences_data = json.loads(self._preferences.getValue(self._settings.AUTH_DATA_PREFERENCE_KEY)) if preferences_data: self._auth_data = AuthenticationResponse(**preferences_data) self.onAuthStateChanged.emit(logged_in=True) @@ -149,7 +155,7 @@ class AuthorizationService: self._auth_data = auth_data if auth_data: self._user_profile = self.getUserProfile() - self._cura_preferences.setValue(self._settings.AUTH_DATA_PREFERENCE_KEY, json.dumps(vars(auth_data))) + self._preferences.setValue(self._settings.AUTH_DATA_PREFERENCE_KEY, json.dumps(vars(auth_data))) else: self._user_profile = None - self._cura_preferences.resetPreference(self._settings.AUTH_DATA_PREFERENCE_KEY) + self._preferences.resetPreference(self._settings.AUTH_DATA_PREFERENCE_KEY) From b1198ee1b8e8c24db4986599324c2acbbceb9850 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 27 Sep 2018 11:43:18 +0200 Subject: [PATCH 075/212] Remove an if-else block that assumes no ExtruderStack There is always an ExtruderStack, so the else-block will never be executed. --- cura/Settings/CustomSettingFunctions.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/cura/Settings/CustomSettingFunctions.py b/cura/Settings/CustomSettingFunctions.py index fe3ea1a935..03cff6b069 100644 --- a/cura/Settings/CustomSettingFunctions.py +++ b/cura/Settings/CustomSettingFunctions.py @@ -40,13 +40,9 @@ class CustomSettingFunctions: global_stack = machine_manager.activeMachine extruder_stack = global_stack.extruders[str(extruder_position)] - if extruder_stack: - value = extruder_stack.getRawProperty(property_key, "value", context = context) - if isinstance(value, SettingFunction): - value = value(extruder_stack, context = context) - else: - # Just a value from global. - value = global_stack.getProperty(property_key, "value", context = context) + value = extruder_stack.getRawProperty(property_key, "value", context = context) + if isinstance(value, SettingFunction): + value = value(extruder_stack, context = context) return value From 329b38663eaa0786997aeff092b825e3f5e65176 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 27 Sep 2018 11:43:51 +0200 Subject: [PATCH 076/212] Fix code style --- cura/Settings/CustomSettingFunctions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/CustomSettingFunctions.py b/cura/Settings/CustomSettingFunctions.py index 03cff6b069..5951ac1e73 100644 --- a/cura/Settings/CustomSettingFunctions.py +++ b/cura/Settings/CustomSettingFunctions.py @@ -68,7 +68,7 @@ class CustomSettingFunctions: continue if isinstance(value, SettingFunction): - value = value(extruder, context= context) + value = value(extruder, context = context) result.append(value) From 202cf698c3061f1dee712b69a18ee8ae256f8310 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 27 Sep 2018 11:56:19 +0200 Subject: [PATCH 077/212] Change callback for succes / failure to the new location CURA-5744 --- cura/API/Account.py | 4 ++-- tests/TestOAuth2.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index e0cc4013ac..18d9d5df03 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -39,8 +39,8 @@ class Account(QObject): CLIENT_ID="um---------------ultimaker_cura_drive_plugin", CLIENT_SCOPES="user.read drive.backups.read drive.backups.write", AUTH_DATA_PREFERENCE_KEY="general/ultimaker_auth_data", - AUTH_SUCCESS_REDIRECT="{}/auth-success".format(self._cloud_api_root), - AUTH_FAILED_REDIRECT="{}/auth-error".format(self._cloud_api_root) + AUTH_SUCCESS_REDIRECT="{}/app/auth-success".format(self._oauth_root), + AUTH_FAILED_REDIRECT="{}/app/auth-error".format(self._oauth_root) ) self._authorization_service = AuthorizationService(Application.getInstance().getPreferences(), self._oauth_settings) diff --git a/tests/TestOAuth2.py b/tests/TestOAuth2.py index 312d71fd5f..22bf0656ef 100644 --- a/tests/TestOAuth2.py +++ b/tests/TestOAuth2.py @@ -18,8 +18,8 @@ OAUTH_SETTINGS = OAuth2Settings( CLIENT_ID="", CLIENT_SCOPES="", AUTH_DATA_PREFERENCE_KEY="test/auth_data", - AUTH_SUCCESS_REDIRECT="{}/auth-success".format(CLOUD_API_ROOT), - AUTH_FAILED_REDIRECT="{}/auth-error".format(CLOUD_API_ROOT) + AUTH_SUCCESS_REDIRECT="{}/app/auth-success".format(OAUTH_ROOT), + AUTH_FAILED_REDIRECT="{}/app/auth-error".format(OAUTH_ROOT) ) FAILED_AUTH_RESPONSE = AuthenticationResponse(success = False, err_message = "FAILURE!") From 47c5dbaf840cf2f4eca3575b46ea200d3229689e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 27 Sep 2018 13:07:37 +0200 Subject: [PATCH 078/212] Add extra unit test that tests the storing and loading of data to the preferences --- tests/TestOAuth2.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/TestOAuth2.py b/tests/TestOAuth2.py index 22bf0656ef..78585804f5 100644 --- a/tests/TestOAuth2.py +++ b/tests/TestOAuth2.py @@ -55,6 +55,23 @@ def test_failedLogin() -> None: assert authorization_service.getAccessToken() is None +@patch.object(AuthorizationService, "getUserProfile", return_value=UserProfile()) +def test_storeAuthData(get_user_profile) -> None: + preferences = Preferences() + authorization_service = AuthorizationService(preferences, OAUTH_SETTINGS) + + # Write stuff to the preferences. + authorization_service._storeAuthData(SUCCESFULL_AUTH_RESPONSE) + preference_value = preferences.getValue(OAUTH_SETTINGS.AUTH_DATA_PREFERENCE_KEY) + # Check that something was actually put in the preferences + assert preference_value is not None and preference_value != {} + + # Create a second auth service, so we can load the data. + second_auth_service = AuthorizationService(preferences, OAUTH_SETTINGS) + second_auth_service.loadAuthDataFromPreferences() + assert second_auth_service.getAccessToken() == SUCCESFULL_AUTH_RESPONSE.access_token + + @patch.object(LocalAuthorizationServer, "stop") @patch.object(LocalAuthorizationServer, "start") @patch.object(webbrowser, "open_new") From 6d402806ac2cbc914d701b58b50ac6a796c40a39 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 27 Sep 2018 13:35:18 +0200 Subject: [PATCH 079/212] Ensure logged in state is not always set to False after loading from preferences --- cura/API/Account.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index 18d9d5df03..d91276fb56 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -28,6 +28,10 @@ class Account(QObject): def __init__(self, parent = None) -> None: super().__init__(parent) + + self._error_message = None # type: Optional[Message] + self._logged_in = False + self._callback_port = 32118 self._oauth_root = "https://account.ultimaker.com" self._cloud_api_root = "https://api.ultimaker.com" @@ -48,9 +52,6 @@ class Account(QObject): self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged) self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged) - self._error_message = None # type: Optional[Message] - self._logged_in = False - @pyqtProperty(bool, notify=loginStateChanged) def isLoggedIn(self) -> bool: return self._logged_in From f8369703ed4775c6e9ae2f5da3c32451f3c8b4a9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 27 Sep 2018 13:45:46 +0200 Subject: [PATCH 080/212] Connect signals before loading auth data CURA-5744 --- cura/API/Account.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index 18d9d5df03..3f328d71ef 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -42,15 +42,14 @@ class Account(QObject): AUTH_SUCCESS_REDIRECT="{}/app/auth-success".format(self._oauth_root), AUTH_FAILED_REDIRECT="{}/app/auth-error".format(self._oauth_root) ) - - self._authorization_service = AuthorizationService(Application.getInstance().getPreferences(), self._oauth_settings) - self._authorization_service.loadAuthDataFromPreferences() - self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged) - self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged) - self._error_message = None # type: Optional[Message] self._logged_in = False + self._authorization_service = AuthorizationService(Application.getInstance().getPreferences(), self._oauth_settings) + self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged) + self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged) + self._authorization_service.loadAuthDataFromPreferences() + @pyqtProperty(bool, notify=loginStateChanged) def isLoggedIn(self) -> bool: return self._logged_in From 853ccbdb71df307d4de6a47981235b5531af3f55 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 27 Sep 2018 14:00:28 +0200 Subject: [PATCH 081/212] Fix mypy typing issue --- cura/OAuth2/AuthorizationService.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index e9e3a7e65b..16f525625e 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -140,7 +140,7 @@ class AuthorizationService: # Load authentication data from preferences. def loadAuthDataFromPreferences(self) -> None: if self._preferences is None: - Logger.logException("e", "Unable to load authentication data, since no preference has been set!") + Logger.log("e", "Unable to load authentication data, since no preference has been set!") return try: preferences_data = json.loads(self._preferences.getValue(self._settings.AUTH_DATA_PREFERENCE_KEY)) @@ -152,6 +152,10 @@ class AuthorizationService: # Store authentication data in preferences. def _storeAuthData(self, auth_data: Optional[AuthenticationResponse] = None) -> None: + if self._preferences is None: + Logger.log("e", "Unable to save authentication data, since no preference has been set!") + return + self._auth_data = auth_data if auth_data: self._user_profile = self.getUserProfile() From 3b70e5eb6bcbab6da11f6864b85a6a23ae0ccc30 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 27 Sep 2018 20:01:55 +0200 Subject: [PATCH 082/212] Fix typing For some reason, my MyPy started acting up once I started using the PythonPath while calling it. --- cura/CuraApplication.py | 6 + .../Models/SettingVisibilityPresetsModel.py | 8 +- cura/Machines/QualityManager.py | 6 +- cura/OAuth2/AuthorizationHelpers.py | 4 +- cura/OAuth2/Models.py | 2 +- cura/Scene/ConvexHullDecorator.py | 135 ++++++++++-------- cura/Settings/ContainerManager.py | 7 +- cura/Settings/MachineManager.py | 2 +- plugins/SimulationView/SimulationView.py | 41 +++--- 9 files changed, 120 insertions(+), 91 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 5ff4161fea..04c9ea88db 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -61,6 +61,7 @@ from cura.Scene.CuraSceneController import CuraSceneController from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.SettingFunction import SettingFunction +from cura.Settings.CuraContainerRegistry import CuraContainerRegistry from cura.Settings.MachineNameValidator import MachineNameValidator from cura.Machines.Models.BuildPlateModel import BuildPlateModel @@ -242,6 +243,8 @@ class CuraApplication(QtApplication): from cura.Settings.CuraContainerRegistry import CuraContainerRegistry self._container_registry_class = CuraContainerRegistry + # Redefined here in order to please the typing. + self._container_registry = None # type: CuraContainerRegistry from cura.CuraPackageManager import CuraPackageManager self._package_manager_class = CuraPackageManager @@ -266,6 +269,9 @@ class CuraApplication(QtApplication): help = "FOR TESTING ONLY. Trigger an early crash to show the crash dialog.") self._cli_parser.add_argument("file", nargs = "*", help = "Files to load after starting the application.") + def getContainerRegistry(self) -> "CuraContainerRegistry": + return self._container_registry + def parseCliOptions(self): super().parseCliOptions() diff --git a/cura/Machines/Models/SettingVisibilityPresetsModel.py b/cura/Machines/Models/SettingVisibilityPresetsModel.py index d5fa51d20a..7e098197a9 100644 --- a/cura/Machines/Models/SettingVisibilityPresetsModel.py +++ b/cura/Machines/Models/SettingVisibilityPresetsModel.py @@ -1,7 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Optional +from typing import Optional, List, Dict, Union import os import urllib.parse from configparser import ConfigParser @@ -60,7 +60,7 @@ class SettingVisibilityPresetsModel(ListModel): def _populate(self) -> None: from cura.CuraApplication import CuraApplication - items = [] + items = [] # type: List[Dict[str, Union[str, int, List[str]]]] for file_path in Resources.getAllResourcesOfType(CuraApplication.ResourceTypes.SettingVisibilityPreset): try: mime_type = MimeTypeDatabase.getMimeTypeForFile(file_path) @@ -79,7 +79,7 @@ class SettingVisibilityPresetsModel(ListModel): if not parser.has_option("general", "name") or not parser.has_option("general", "weight"): continue - settings = [] + settings = [] # type: List[str] for section in parser.sections(): if section == 'general': continue @@ -98,7 +98,7 @@ class SettingVisibilityPresetsModel(ListModel): except Exception: Logger.logException("e", "Failed to load setting preset %s", file_path) - items.sort(key = lambda k: (int(k["weight"]), k["id"])) + items.sort(key = lambda k: (int(k["weight"]), k["id"])) # type: ignore # Put "custom" at the top items.insert(0, {"id": "custom", "name": "Custom selection", diff --git a/cura/Machines/QualityManager.py b/cura/Machines/QualityManager.py index 21abb5a9cc..d924f4c83e 100644 --- a/cura/Machines/QualityManager.py +++ b/cura/Machines/QualityManager.py @@ -6,6 +6,7 @@ from typing import TYPE_CHECKING, Optional, cast, Dict, List from PyQt5.QtCore import QObject, QTimer, pyqtSignal, pyqtSlot from UM.Application import Application + from UM.ConfigurationErrorMessage import ConfigurationErrorMessage from UM.Logger import Logger from UM.Util import parseBool @@ -40,7 +41,8 @@ class QualityManager(QObject): def __init__(self, container_registry: "ContainerRegistry", parent = None) -> None: super().__init__(parent) - self._application = Application.getInstance() # type: CuraApplication + from cura.CuraApplication import CuraApplication + self._application = CuraApplication.getInstance() # type: CuraApplication self._material_manager = self._application.getMaterialManager() self._container_registry = container_registry @@ -458,7 +460,7 @@ class QualityManager(QObject): # stack and clear the user settings. @pyqtSlot(str) def createQualityChanges(self, base_name: str) -> None: - machine_manager = Application.getInstance().getMachineManager() + machine_manager = CuraApplication.getInstance().getMachineManager() global_stack = machine_manager.activeMachine if not global_stack: diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py index 4d485b3bda..6cb53d2252 100644 --- a/cura/OAuth2/AuthorizationHelpers.py +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -36,7 +36,7 @@ class AuthorizationHelpers: "code": authorization_code, "code_verifier": verification_code, "scope": self._settings.CLIENT_SCOPES - })) + })) # type: ignore # Request the access token from the authorization server using a refresh token. # \param refresh_token: @@ -48,7 +48,7 @@ class AuthorizationHelpers: "grant_type": "refresh_token", "refresh_token": refresh_token, "scope": self._settings.CLIENT_SCOPES - })) + })) # type: ignore @staticmethod # Parse the token response from the authorization server into an AuthenticationResponse object. diff --git a/cura/OAuth2/Models.py b/cura/OAuth2/Models.py index 796fdf8746..83fc22554f 100644 --- a/cura/OAuth2/Models.py +++ b/cura/OAuth2/Models.py @@ -14,7 +14,7 @@ class OAuth2Settings(BaseModel): CLIENT_ID = None # type: Optional[str] CLIENT_SCOPES = None # type: Optional[str] CALLBACK_URL = None # type: Optional[str] - AUTH_DATA_PREFERENCE_KEY = None # type: Optional[str] + AUTH_DATA_PREFERENCE_KEY = "" # type: str AUTH_SUCCESS_REDIRECT = "https://ultimaker.com" # type: str AUTH_FAILED_REDIRECT = "https://ultimaker.com" # type: str diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index 31e21df6bf..8532f40890 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -5,9 +5,11 @@ from PyQt5.QtCore import QTimer from UM.Application import Application from UM.Math.Polygon import Polygon + from UM.Scene.SceneNodeDecorator import SceneNodeDecorator from UM.Settings.ContainerRegistry import ContainerRegistry + from cura.Settings.ExtruderManager import ExtruderManager from cura.Scene import ConvexHullNode @@ -18,6 +20,8 @@ from typing import TYPE_CHECKING, Any, Optional if TYPE_CHECKING: from UM.Scene.SceneNode import SceneNode from cura.Settings.GlobalStack import GlobalStack + from UM.Mesh.MeshData import MeshData + from UM.Math.Matrix import Matrix ## The convex hull decorator is a scene node decorator that adds the convex hull functionality to a scene node. @@ -33,17 +37,17 @@ class ConvexHullDecorator(SceneNodeDecorator): # Make sure the timer is created on the main thread self._recompute_convex_hull_timer = None # type: Optional[QTimer] - - if Application.getInstance() is not None: - Application.getInstance().callLater(self.createRecomputeConvexHullTimer) + from cura.CuraApplication import CuraApplication + if CuraApplication.getInstance() is not None: + CuraApplication.getInstance().callLater(self.createRecomputeConvexHullTimer) self._raft_thickness = 0.0 - self._build_volume = Application.getInstance().getBuildVolume() + self._build_volume = CuraApplication.getInstance().getBuildVolume() self._build_volume.raftThicknessChanged.connect(self._onChanged) - Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) - Application.getInstance().getController().toolOperationStarted.connect(self._onChanged) - Application.getInstance().getController().toolOperationStopped.connect(self._onChanged) + CuraApplication.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) + CuraApplication.getInstance().getController().toolOperationStarted.connect(self._onChanged) + CuraApplication.getInstance().getController().toolOperationStopped.connect(self._onChanged) self._onGlobalStackChanged() @@ -61,9 +65,9 @@ class ConvexHullDecorator(SceneNodeDecorator): previous_node.parentChanged.disconnect(self._onChanged) super().setNode(node) - - self._node.transformationChanged.connect(self._onChanged) - self._node.parentChanged.connect(self._onChanged) + # Mypy doesn't understand that self._node is no longer optional, so just use the node. + node.transformationChanged.connect(self._onChanged) + node.parentChanged.connect(self._onChanged) self._onChanged() @@ -78,9 +82,9 @@ class ConvexHullDecorator(SceneNodeDecorator): hull = self._compute2DConvexHull() - if self._global_stack and self._node and hull is not None: + if self._global_stack and self._node is not None and hull is not None: # Parent can be None if node is just loaded. - if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and (self._node.getParent() is None or not self._node.getParent().callDecoration("isGroup")): + if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and not self.hasGroupAsParent(self._node): hull = hull.getMinkowskiHull(Polygon(numpy.array(self._global_stack.getProperty("machine_head_polygon", "value"), numpy.float32))) hull = self._add2DAdhesionMargin(hull) return hull @@ -92,6 +96,13 @@ class ConvexHullDecorator(SceneNodeDecorator): return self._compute2DConvexHeadFull() + @staticmethod + def hasGroupAsParent(node: "SceneNode") -> bool: + parent = node.getParent() + if parent is None: + return False + return bool(parent.callDecoration("isGroup")) + ## Get convex hull of the object + head size # In case of printing all at once this is the same as the convex hull. # For one at the time this is area with intersection of mirrored head @@ -100,8 +111,10 @@ class ConvexHullDecorator(SceneNodeDecorator): return None if self._global_stack: - if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and (self._node.getParent() is None or not self._node.getParent().callDecoration("isGroup")): + if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and not self.hasGroupAsParent(self._node): head_with_fans = self._compute2DConvexHeadMin() + if head_with_fans is None: + return None head_with_fans_with_adhesion_margin = self._add2DAdhesionMargin(head_with_fans) return head_with_fans_with_adhesion_margin return None @@ -114,7 +127,7 @@ class ConvexHullDecorator(SceneNodeDecorator): return None if self._global_stack: - if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and (self._node.getParent() is None or not self._node.getParent().callDecoration("isGroup")): + if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and not self.hasGroupAsParent(self._node): # Printing one at a time and it's not an object in a group return self._compute2DConvexHull() return None @@ -153,15 +166,17 @@ class ConvexHullDecorator(SceneNodeDecorator): def _init2DConvexHullCache(self) -> None: # Cache for the group code path in _compute2DConvexHull() - self._2d_convex_hull_group_child_polygon = None - self._2d_convex_hull_group_result = None + self._2d_convex_hull_group_child_polygon = None # type: Optional[Polygon] + self._2d_convex_hull_group_result = None # type: Optional[Polygon] # Cache for the mesh code path in _compute2DConvexHull() - self._2d_convex_hull_mesh = None - self._2d_convex_hull_mesh_world_transform = None - self._2d_convex_hull_mesh_result = None + self._2d_convex_hull_mesh = None # type: Optional[MeshData] + self._2d_convex_hull_mesh_world_transform = None # type: Optional[Matrix] + self._2d_convex_hull_mesh_result = None # type: Optional[Polygon] def _compute2DConvexHull(self) -> Optional[Polygon]: + if self._node is None: + return None if self._node.callDecoration("isGroup"): points = numpy.zeros((0, 2), dtype=numpy.int32) for child in self._node.getChildren(): @@ -187,47 +202,47 @@ class ConvexHullDecorator(SceneNodeDecorator): return offset_hull else: - offset_hull = None - if self._node.getMeshData(): - mesh = self._node.getMeshData() - world_transform = self._node.getWorldTransformation() - - # Check the cache - if mesh is self._2d_convex_hull_mesh and world_transform == self._2d_convex_hull_mesh_world_transform: - return self._2d_convex_hull_mesh_result - - vertex_data = mesh.getConvexHullTransformedVertices(world_transform) - # Don't use data below 0. - # TODO; We need a better check for this as this gives poor results for meshes with long edges. - # Do not throw away vertices: the convex hull may be too small and objects can collide. - # vertex_data = vertex_data[vertex_data[:,1] >= -0.01] - - if len(vertex_data) >= 4: - # Round the vertex data to 1/10th of a mm, then remove all duplicate vertices - # This is done to greatly speed up further convex hull calculations as the convex hull - # becomes much less complex when dealing with highly detailed models. - vertex_data = numpy.round(vertex_data, 1) - - vertex_data = vertex_data[:, [0, 2]] # Drop the Y components to project to 2D. - - # Grab the set of unique points. - # - # This basically finds the unique rows in the array by treating them as opaque groups of bytes - # which are as long as the 2 float64s in each row, and giving this view to numpy.unique() to munch. - # See http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array - vertex_byte_view = numpy.ascontiguousarray(vertex_data).view( - numpy.dtype((numpy.void, vertex_data.dtype.itemsize * vertex_data.shape[1]))) - _, idx = numpy.unique(vertex_byte_view, return_index=True) - vertex_data = vertex_data[idx] # Select the unique rows by index. - - hull = Polygon(vertex_data) - - if len(vertex_data) >= 3: - convex_hull = hull.getConvexHull() - offset_hull = self._offsetHull(convex_hull) - else: + offset_hull = Polygon([]) + mesh = self._node.getMeshData() + if mesh is None: return Polygon([]) # Node has no mesh data, so just return an empty Polygon. + world_transform = self._node.getWorldTransformation() + + # Check the cache + if mesh is self._2d_convex_hull_mesh and world_transform == self._2d_convex_hull_mesh_world_transform: + return self._2d_convex_hull_mesh_result + + vertex_data = mesh.getConvexHullTransformedVertices(world_transform) + # Don't use data below 0. + # TODO; We need a better check for this as this gives poor results for meshes with long edges. + # Do not throw away vertices: the convex hull may be too small and objects can collide. + # vertex_data = vertex_data[vertex_data[:,1] >= -0.01] + + if len(vertex_data) >= 4: # type: ignore # mypy and numpy don't play along well just yet. + # Round the vertex data to 1/10th of a mm, then remove all duplicate vertices + # This is done to greatly speed up further convex hull calculations as the convex hull + # becomes much less complex when dealing with highly detailed models. + vertex_data = numpy.round(vertex_data, 1) + + vertex_data = vertex_data[:, [0, 2]] # Drop the Y components to project to 2D. + + # Grab the set of unique points. + # + # This basically finds the unique rows in the array by treating them as opaque groups of bytes + # which are as long as the 2 float64s in each row, and giving this view to numpy.unique() to munch. + # See http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array + vertex_byte_view = numpy.ascontiguousarray(vertex_data).view( + numpy.dtype((numpy.void, vertex_data.dtype.itemsize * vertex_data.shape[1]))) + _, idx = numpy.unique(vertex_byte_view, return_index=True) + vertex_data = vertex_data[idx] # Select the unique rows by index. + + hull = Polygon(vertex_data) + + if len(vertex_data) >= 3: + convex_hull = hull.getConvexHull() + offset_hull = self._offsetHull(convex_hull) + # Store the result in the cache self._2d_convex_hull_mesh = mesh self._2d_convex_hull_mesh_world_transform = world_transform @@ -338,7 +353,7 @@ class ConvexHullDecorator(SceneNodeDecorator): ## Private convenience function to get a setting from the correct extruder (as defined by limit_to_extruder property). def _getSettingProperty(self, setting_key: str, prop: str = "value") -> Any: - if not self._global_stack: + if self._global_stack is None or self._node is None: return None per_mesh_stack = self._node.callDecoration("getStack") if per_mesh_stack: @@ -358,7 +373,7 @@ class ConvexHullDecorator(SceneNodeDecorator): return self._global_stack.getProperty(setting_key, prop) ## Returns True if node is a descendant or the same as the root node. - def __isDescendant(self, root: "SceneNode", node: "SceneNode") -> bool: + def __isDescendant(self, root: "SceneNode", node: Optional["SceneNode"]) -> bool: if node is None: return False if root is node: diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index e1a1495dac..3cfca1a944 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -28,10 +28,10 @@ if TYPE_CHECKING: from cura.Machines.MaterialNode import MaterialNode from cura.Machines.QualityChangesGroup import QualityChangesGroup from UM.PluginRegistry import PluginRegistry - from UM.Settings.ContainerRegistry import ContainerRegistry from cura.Settings.MachineManager import MachineManager from cura.Machines.MaterialManager import MaterialManager from cura.Machines.QualityManager import QualityManager + from cura.Settings.CuraContainerRegistry import CuraContainerRegistry catalog = i18nCatalog("cura") @@ -52,7 +52,7 @@ class ContainerManager(QObject): self._application = application # type: CuraApplication self._plugin_registry = self._application.getPluginRegistry() # type: PluginRegistry - self._container_registry = self._application.getContainerRegistry() # type: ContainerRegistry + self._container_registry = self._application.getContainerRegistry() # type: CuraContainerRegistry self._machine_manager = self._application.getMachineManager() # type: MachineManager self._material_manager = self._application.getMaterialManager() # type: MaterialManager self._quality_manager = self._application.getQualityManager() # type: QualityManager @@ -391,7 +391,8 @@ class ContainerManager(QObject): continue mime_type = self._container_registry.getMimeTypeForContainer(container_type) - + if mime_type is None: + continue entry = { "type": serialize_type, "mime": mime_type, diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 0059b7aad2..063f894d23 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1148,7 +1148,7 @@ class MachineManager(QObject): self._fixQualityChangesGroupToNotSupported(quality_changes_group) quality_changes_container = self._empty_quality_changes_container - quality_container = self._empty_quality_container + quality_container = self._empty_quality_container # type: Optional[InstanceContainer] if quality_changes_group.node_for_global and quality_changes_group.node_for_global.getContainer(): quality_changes_container = cast(InstanceContainer, quality_changes_group.node_for_global.getContainer()) if quality_group is not None and quality_group.node_for_global and quality_group.node_for_global.getContainer(): diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 8d739654d4..edf950e55a 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -21,6 +21,7 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.Selection import Selection from UM.Signal import Signal +from UM.View.CompositePass import CompositePass from UM.View.GL.OpenGL import OpenGL from UM.View.GL.OpenGLContext import OpenGLContext @@ -36,7 +37,7 @@ from .SimulationViewProxy import SimulationViewProxy import numpy import os.path -from typing import Optional, TYPE_CHECKING, List +from typing import Optional, TYPE_CHECKING, List, cast if TYPE_CHECKING: from UM.Scene.SceneNode import SceneNode @@ -64,7 +65,7 @@ class SimulationView(View): self._minimum_layer_num = 0 self._current_layer_mesh = None self._current_layer_jumps = None - self._top_layers_job = None + self._top_layers_job = None # type: Optional["_CreateTopLayersJob"] self._activity = False self._old_max_layers = 0 @@ -78,10 +79,10 @@ class SimulationView(View): self._ghost_shader = None # type: Optional["ShaderProgram"] self._layer_pass = None # type: Optional[SimulationPass] - self._composite_pass = None # type: Optional[RenderPass] - self._old_layer_bindings = None + self._composite_pass = None # type: Optional[CompositePass] + self._old_layer_bindings = None # type: Optional[List[str]] self._simulationview_composite_shader = None # type: Optional["ShaderProgram"] - self._old_composite_shader = None + self._old_composite_shader = None # type: Optional["ShaderProgram"] self._global_container_stack = None # type: Optional[ContainerStack] self._proxy = SimulationViewProxy() @@ -204,9 +205,11 @@ class SimulationView(View): if not self._ghost_shader: self._ghost_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) - self._ghost_shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_ghost").getRgb())) + theme = CuraApplication.getInstance().getTheme() + if theme is not None: + self._ghost_shader.setUniformValue("u_color", Color(*theme.getColor("layerview_ghost").getRgb())) - for node in DepthFirstIterator(scene.getRoot()): + for node in DepthFirstIterator(scene.getRoot()): # type: ignore # We do not want to render ConvexHullNode as it conflicts with the bottom layers. # However, it is somewhat relevant when the node is selected, so do render it then. if type(node) is ConvexHullNode and not Selection.isSelected(node.getWatchedNode()): @@ -347,7 +350,7 @@ class SimulationView(View): self._old_max_layers = self._max_layers ## Recalculate num max layers new_max_layers = 0 - for node in DepthFirstIterator(scene.getRoot()): + for node in DepthFirstIterator(scene.getRoot()): # type: ignore layer_data = node.callDecoration("getLayerData") if not layer_data: continue @@ -398,7 +401,7 @@ class SimulationView(View): def calculateMaxPathsOnLayer(self, layer_num: int) -> None: # Update the currentPath scene = self.getController().getScene() - for node in DepthFirstIterator(scene.getRoot()): + for node in DepthFirstIterator(scene.getRoot()): # type: ignore layer_data = node.callDecoration("getLayerData") if not layer_data: continue @@ -474,15 +477,17 @@ class SimulationView(View): self._onGlobalStackChanged() if not self._simulationview_composite_shader: - self._simulationview_composite_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), "simulationview_composite.shader")) - theme = Application.getInstance().getTheme() - self._simulationview_composite_shader.setUniformValue("u_background_color", Color(*theme.getColor("viewport_background").getRgb())) - self._simulationview_composite_shader.setUniformValue("u_outline_color", Color(*theme.getColor("model_selection_outline").getRgb())) + plugin_path = cast(str, PluginRegistry.getInstance().getPluginPath("SimulationView")) + self._simulationview_composite_shader = OpenGL.getInstance().createShaderProgram(os.path.join(plugin_path, "simulationview_composite.shader")) + theme = CuraApplication.getInstance().getTheme() + if theme is not None: + self._simulationview_composite_shader.setUniformValue("u_background_color", Color(*theme.getColor("viewport_background").getRgb())) + self._simulationview_composite_shader.setUniformValue("u_outline_color", Color(*theme.getColor("model_selection_outline").getRgb())) if not self._composite_pass: - self._composite_pass = self.getRenderer().getRenderPass("composite") + self._composite_pass = cast(CompositePass, self.getRenderer().getRenderPass("composite")) - self._old_layer_bindings = self._composite_pass.getLayerBindings()[:] # make a copy so we can restore to it later + self._old_layer_bindings = self._composite_pass.getLayerBindings()[:] # make a copy so we can restore to it later self._composite_pass.getLayerBindings().append("simulationview") self._old_composite_shader = self._composite_pass.getCompositeShader() self._composite_pass.setCompositeShader(self._simulationview_composite_shader) @@ -496,8 +501,8 @@ class SimulationView(View): self._nozzle_node.setParent(None) self.getRenderer().removeRenderPass(self._layer_pass) if self._composite_pass: - self._composite_pass.setLayerBindings(self._old_layer_bindings) - self._composite_pass.setCompositeShader(self._old_composite_shader) + self._composite_pass.setLayerBindings(cast(List[str], self._old_layer_bindings)) + self._composite_pass.setCompositeShader(cast(ShaderProgram, self._old_composite_shader)) return False @@ -606,7 +611,7 @@ class _CreateTopLayersJob(Job): def run(self) -> None: layer_data = None - for node in DepthFirstIterator(self._scene.getRoot()): + for node in DepthFirstIterator(self._scene.getRoot()): # type: ignore layer_data = node.callDecoration("getLayerData") if layer_data: break From 9bd4ab2faa1065c91d87b33cf9cd90bc74301975 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 28 Sep 2018 10:46:14 +0200 Subject: [PATCH 083/212] Added unittest for PrintInformation class --- cura/PrintInformation.py | 12 ++-- tests/TestPrintInformation.py | 107 ++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 tests/TestPrintInformation.py diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 8527da1b8a..85cf6651fa 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -10,7 +10,6 @@ from typing import Dict from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty, pyqtSlot -from UM.i18n import i18nCatalog from UM.Logger import Logger from UM.Qt.Duration import Duration from UM.Scene.SceneNode import SceneNode @@ -52,6 +51,8 @@ class PrintInformation(QObject): super().__init__(parent) self._application = application + self.UNTITLED_JOB_NAME = "Untitled" + self.initializeCuraMessagePrintTimeProperties() self._material_lengths = {} # indexed by build plate number @@ -70,12 +71,13 @@ class PrintInformation(QObject): self._base_name = "" self._abbr_machine = "" self._job_name = "" - self._project_name = "" self._active_build_plate = 0 self._initVariablesWithBuildPlate(self._active_build_plate) self._multi_build_plate_model = self._application.getMultiBuildPlateModel() + ss = self._multi_build_plate_model.maxBuildPlate + self._application.globalContainerStackChanged.connect(self._updateJobName) self._application.globalContainerStackChanged.connect(self.setToZeroPrintInformation) self._application.fileLoaded.connect(self.setBaseName) @@ -300,13 +302,13 @@ class PrintInformation(QObject): def _updateJobName(self): if self._base_name == "": - self._job_name = "Untitled" + self._job_name = self.UNTITLED_JOB_NAME self._is_user_specified_job_name = False self.jobNameChanged.emit() return base_name = self._stripAccents(self._base_name) - self._setAbbreviatedMachineName() + self._defineAbbreviatedMachineName() # Only update the job name when it's not user-specified. if not self._is_user_specified_job_name: @@ -382,7 +384,7 @@ class PrintInformation(QObject): ## Created an acronym-like abbreviated machine name from the currently # active machine name. # Called each time the global stack is switched. - def _setAbbreviatedMachineName(self): + def _defineAbbreviatedMachineName(self): global_container_stack = self._application.getGlobalContainerStack() if not global_container_stack: self._abbr_machine = "" diff --git a/tests/TestPrintInformation.py b/tests/TestPrintInformation.py new file mode 100644 index 0000000000..a226a437c6 --- /dev/null +++ b/tests/TestPrintInformation.py @@ -0,0 +1,107 @@ + +from cura import PrintInformation + +from unittest.mock import MagicMock, patch +from UM.Application import Application +from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType + + +def getPrintInformation(printer_name) -> PrintInformation: + + mock_application = MagicMock() + + global_container_stack = MagicMock() + global_container_stack.definition.getName = MagicMock(return_value=printer_name) + mock_application.getGlobalContainerStack = MagicMock(return_value=global_container_stack) + + multiBuildPlateModel = MagicMock() + multiBuildPlateModel.maxBuildPlate = 0 + mock_application.getMultiBuildPlateModel = MagicMock(return_value=multiBuildPlateModel) + + Application.getInstance = MagicMock(return_type=mock_application) + + with patch("json.loads", lambda x: {}): + print_information = PrintInformation.PrintInformation(mock_application) + + return print_information + +def setup_module(): + MimeTypeDatabase.addMimeType( + MimeType( + name="application/vnd.ms-package.3dmanufacturing-3dmodel+xml", + comment="3MF", + suffixes=["3mf"] + ) + ) + + MimeTypeDatabase.addMimeType( + MimeType( + name="application/x-cura-gcode-file", + comment="Cura GCode File", + suffixes=["gcode"] + ) + ) + + + +def test_setProjectName(): + + print_information = getPrintInformation("ultimaker") + + # Test simple name + project_name = ["HelloWorld",".3mf"] + print_information.setProjectName(project_name[0] + project_name[1]) + assert "UM_" + project_name[0] == print_information._job_name + + # Test the name with one dot + project_name = ["Hello.World",".3mf"] + print_information.setProjectName(project_name[0] + project_name[1]) + assert "UM_" + project_name[0] == print_information._job_name + + # Test the name with two dot + project_name = ["Hello.World.World",".3mf"] + print_information.setProjectName(project_name[0] + project_name[1]) + assert "UM_" + project_name[0] == print_information._job_name + + # Test the name with dot at the beginning + project_name = [".Hello.World",".3mf"] + print_information.setProjectName(project_name[0] + project_name[1]) + assert "UM_" + project_name[0] == print_information._job_name + + # Test the name with underline + project_name = ["Hello_World",".3mf"] + print_information.setProjectName(project_name[0] + project_name[1]) + assert "UM_" + project_name[0] == print_information._job_name + + # Test gcode extension + project_name = ["Hello_World",".gcode"] + print_information.setProjectName(project_name[0] + project_name[1]) + assert "UM_" + project_name[0] == print_information._job_name + + # Test empty project name + project_name = ["",""] + print_information.setProjectName(project_name[0] + project_name[1]) + assert print_information.UNTITLED_JOB_NAME == print_information._job_name + + # Test wrong file extension + project_name = ["Hello_World",".test"] + print_information.setProjectName(project_name[0] + project_name[1]) + assert "UM_" + project_name[0] != print_information._job_name + +def test_setJobName(): + + print_information = getPrintInformation("ultimaker") + + print_information._abbr_machine = "UM" + print_information.setJobName("UM_HelloWorld", is_user_specified_job_name=False) + + +def test_defineAbbreviatedMachineName(): + printer_name = "Test" + + print_information = getPrintInformation(printer_name) + + # Test not ultimaker printer, name suffix should have first letter from the printer name + project_name = ["HelloWorld",".3mf"] + print_information.setProjectName(project_name[0] + project_name[1]) + assert printer_name[0] + "_" + project_name[0] == print_information._job_name \ No newline at end of file From 9a98341bda96681388aefe2d2728fd7f1328c4e5 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 28 Sep 2018 11:38:42 +0200 Subject: [PATCH 084/212] Fix code-style and typing --- cura/Settings/MachineManager.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 6fd945fc31..911022b6ac 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -4,13 +4,13 @@ import collections import time from typing import Any, Callable, List, Dict, TYPE_CHECKING, Optional, cast -import platform from UM.ConfigurationErrorMessage import ConfigurationErrorMessage from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.Interfaces import ContainerInterface from UM.Signal import Signal +from UM.Platform import Platform from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal, QTimer from UM.FlameProfiler import pyqtSlot @@ -1543,17 +1543,16 @@ class MachineManager(QObject): ## Get default firmware file name if one is specified in the firmware @pyqtSlot(result = str) - def getDefaultFirmwareName(self): + def getDefaultFirmwareName(self) -> str: # Check if there is a valid global container stack if not self._global_container_stack: return "" # The bottom of the containerstack is the machine definition - machine_id = self._global_container_stack.getBottom().id machine_has_heated_bed = self._global_container_stack.getProperty("machine_heated_bed", "value") baudrate = 250000 - if platform.system() == "Linux": + if Platform.isLinux(): # Linux prefers a baudrate of 115200 here because older versions of # pySerial did not support a baudrate of 250000 baudrate = 115200 @@ -1570,5 +1569,5 @@ class MachineManager(QObject): Logger.log("w", "Firmware file %s not found.", hex_file) return "" else: - Logger.log("w", "There is no firmware for machine %s.", machine_id) + Logger.log("w", "There is no firmware for machine %s.", self._global_container_stack.getBottom().id) return "" From bc52830c8902f14a53bd40fa009856e545876436 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 28 Sep 2018 11:49:00 +0200 Subject: [PATCH 085/212] Move getDefaultFirmwareName() into GlobalStack --- cura/Settings/GlobalStack.py | 29 ++++++++++++++++- cura/Settings/MachineManager.py | 32 ------------------- .../UpgradeFirmwareMachineAction.qml | 2 +- 3 files changed, 29 insertions(+), 34 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 517b45eb98..e3ae8c2deb 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -4,7 +4,7 @@ from collections import defaultdict import threading from typing import Any, Dict, Optional, Set, TYPE_CHECKING -from PyQt5.QtCore import pyqtProperty +from PyQt5.QtCore import pyqtProperty, pyqtSlot from UM.Decorators import override from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase @@ -13,6 +13,8 @@ from UM.Settings.SettingInstance import InstanceState from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.Interfaces import PropertyEvaluationContext from UM.Logger import Logger +from UM.Resources import Resources +from UM.Platform import Platform from UM.Util import parseBool import cura.CuraApplication @@ -200,6 +202,31 @@ class GlobalStack(CuraContainerStack): def getHasMachineQuality(self) -> bool: return parseBool(self.getMetaDataEntry("has_machine_quality", False)) + ## Get default firmware file name if one is specified in the firmware + @pyqtSlot(result = str) + def getDefaultFirmwareName(self) -> str: + machine_has_heated_bed = self.getProperty("machine_heated_bed", "value") + + baudrate = 250000 + if Platform.isLinux(): + # Linux prefers a baudrate of 115200 here because older versions of + # pySerial did not support a baudrate of 250000 + baudrate = 115200 + + # If a firmware file is available, it should be specified in the definition for the printer + hex_file = self.getMetaDataEntry("firmware_file", None) + if machine_has_heated_bed: + hex_file = self.getMetaDataEntry("firmware_hbk_file", hex_file) + + if hex_file: + try: + return Resources.getPath(cura.CuraApplication.CuraApplication.ResourceTypes.Firmware, hex_file.format(baudrate=baudrate)) + except FileNotFoundError: + Logger.log("w", "Firmware file %s not found.", hex_file) + return "" + else: + Logger.log("w", "There is no firmware for machine %s.", self.getBottom().id) + return "" ## private: global_stack_mime = MimeType( diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 911022b6ac..0abb1a5dc2 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -10,7 +10,6 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.Interfaces import ContainerInterface from UM.Signal import Signal -from UM.Platform import Platform from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal, QTimer from UM.FlameProfiler import pyqtSlot @@ -1540,34 +1539,3 @@ class MachineManager(QObject): with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): self.updateMaterialWithVariant(None) self._updateQualityWithMaterial() - - ## Get default firmware file name if one is specified in the firmware - @pyqtSlot(result = str) - def getDefaultFirmwareName(self) -> str: - # Check if there is a valid global container stack - if not self._global_container_stack: - return "" - - # The bottom of the containerstack is the machine definition - machine_has_heated_bed = self._global_container_stack.getProperty("machine_heated_bed", "value") - - baudrate = 250000 - if Platform.isLinux(): - # Linux prefers a baudrate of 115200 here because older versions of - # pySerial did not support a baudrate of 250000 - baudrate = 115200 - - # If a firmware file is available, it should be specified in the definition for the printer - hex_file = self._global_container_stack.getMetaDataEntry("firmware_file", None) - if machine_has_heated_bed: - hex_file = self._global_container_stack.getMetaDataEntry("firmware_hbk_file", hex_file) - - if hex_file: - try: - return Resources.getPath(cura.CuraApplication.CuraApplication.ResourceTypes.Firmware, hex_file.format(baudrate=baudrate)) - except FileNotFoundError: - Logger.log("w", "Firmware file %s not found.", hex_file) - return "" - else: - Logger.log("w", "There is no firmware for machine %s.", self._global_container_stack.getBottom().id) - return "" diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml index 0d12f72a0a..469ada7afb 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml @@ -51,7 +51,7 @@ Cura.MachineAction anchors.horizontalCenter: parent.horizontalCenter width: childrenRect.width spacing: UM.Theme.getSize("default_margin").width - property var firmwareName: Cura.MachineManager.getDefaultFirmwareName() + property var firmwareName: Cura.MachineManager.activeMachine.getDefaultFirmwareName() Button { id: autoUpgradeButton From a12c0e8d9eadb1bdf0d8609f1b1ffcfb09e706cc Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 28 Sep 2018 11:51:33 +0200 Subject: [PATCH 086/212] Remove superfluous import --- cura/Settings/MachineManager.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 0abb1a5dc2..0059b7aad2 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -16,7 +16,6 @@ from UM.FlameProfiler import pyqtSlot from UM import Util from UM.Logger import Logger from UM.Message import Message -from UM.Resources import Resources from UM.Settings.SettingFunction import SettingFunction from UM.Signal import postponeSignals, CompressTechnique From dd150bbab979521c621f37b69b30b367229bedca Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 28 Sep 2018 12:06:57 +0200 Subject: [PATCH 087/212] Resolve circular imports for CuraAPI --- cura/API/Account.py | 18 ++++++++++----- cura/API/Backups.py | 10 ++++++--- cura/API/Interface/Settings.py | 13 +++++++---- cura/API/Interface/__init__.py | 11 +++++++-- cura/API/__init__.py | 35 +++++++++++++++++++++++------ cura/Backups/BackupsManager.py | 10 +++++---- cura/CuraApplication.py | 11 ++++----- cura/OAuth2/AuthorizationService.py | 4 +++- 8 files changed, 81 insertions(+), 31 deletions(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index 93738a78e9..bc1ce8c2b9 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -1,15 +1,18 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Optional, Dict +from typing import Optional, Dict, TYPE_CHECKING from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty +from UM.i18n import i18nCatalog from UM.Message import Message + from cura.OAuth2.AuthorizationService import AuthorizationService from cura.OAuth2.Models import OAuth2Settings -from UM.Application import Application -from UM.i18n import i18nCatalog +if TYPE_CHECKING: + from cura.CuraApplication import CuraApplication + i18n_catalog = i18nCatalog("cura") @@ -26,8 +29,9 @@ class Account(QObject): # Signal emitted when user logged in or out. loginStateChanged = pyqtSignal(bool) - def __init__(self, parent = None) -> None: + def __init__(self, application: "CuraApplication", parent = None) -> None: super().__init__(parent) + self._application = application self._error_message = None # type: Optional[Message] self._logged_in = False @@ -47,7 +51,11 @@ class Account(QObject): AUTH_FAILED_REDIRECT="{}/app/auth-error".format(self._oauth_root) ) - self._authorization_service = AuthorizationService(Application.getInstance().getPreferences(), self._oauth_settings) + self._authorization_service = AuthorizationService(self._oauth_settings) + + def initialize(self) -> None: + self._authorization_service.initialize(self._application.getPreferences()) + self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged) self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged) self._authorization_service.loadAuthDataFromPreferences() diff --git a/cura/API/Backups.py b/cura/API/Backups.py index f31933c844..8e5cd7b83a 100644 --- a/cura/API/Backups.py +++ b/cura/API/Backups.py @@ -1,9 +1,12 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Tuple, Optional +from typing import Tuple, Optional, TYPE_CHECKING from cura.Backups.BackupsManager import BackupsManager +if TYPE_CHECKING: + from cura.CuraApplication import CuraApplication + ## The back-ups API provides a version-proof bridge between Cura's # BackupManager and plug-ins that hook into it. @@ -13,9 +16,10 @@ from cura.Backups.BackupsManager import BackupsManager # api = CuraAPI() # api.backups.createBackup() # api.backups.restoreBackup(my_zip_file, {"cura_release": "3.1"})`` - class Backups: - manager = BackupsManager() # Re-used instance of the backups manager. + + def __init__(self, application: "CuraApplication") -> None: + self.manager = BackupsManager(application) ## Create a new back-up using the BackupsManager. # \return Tuple containing a ZIP file with the back-up data and a dict diff --git a/cura/API/Interface/Settings.py b/cura/API/Interface/Settings.py index 2889db7022..371c40c14c 100644 --- a/cura/API/Interface/Settings.py +++ b/cura/API/Interface/Settings.py @@ -1,7 +1,11 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from cura.CuraApplication import CuraApplication +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from cura.CuraApplication import CuraApplication + ## The Interface.Settings API provides a version-proof bridge between Cura's # (currently) sidebar UI and plug-ins that hook into it. @@ -19,8 +23,9 @@ from cura.CuraApplication import CuraApplication # api.interface.settings.addContextMenuItem(data)`` class Settings: - # Re-used instance of Cura: - application = CuraApplication.getInstance() # type: CuraApplication + + def __init__(self, application: "CuraApplication") -> None: + self.application = application ## Add items to the sidebar context menu. # \param menu_item dict containing the menu item to add. @@ -30,4 +35,4 @@ class Settings: ## Get all custom items currently added to the sidebar context menu. # \return List containing all custom context menu items. def getContextMenuItems(self) -> list: - return self.application.getSidebarCustomMenuItems() \ No newline at end of file + return self.application.getSidebarCustomMenuItems() diff --git a/cura/API/Interface/__init__.py b/cura/API/Interface/__init__.py index b38118949b..742254a1a4 100644 --- a/cura/API/Interface/__init__.py +++ b/cura/API/Interface/__init__.py @@ -1,9 +1,15 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from typing import TYPE_CHECKING + from UM.PluginRegistry import PluginRegistry from cura.API.Interface.Settings import Settings +if TYPE_CHECKING: + from cura.CuraApplication import CuraApplication + + ## The Interface class serves as a common root for the specific API # methods for each interface element. # @@ -20,5 +26,6 @@ class Interface: # For now we use the same API version to be consistent. VERSION = PluginRegistry.APIVersion - # API methods specific to the settings portion of the UI - settings = Settings() + def __init__(self, application: "CuraApplication") -> None: + # API methods specific to the settings portion of the UI + self.settings = Settings(application) diff --git a/cura/API/__init__.py b/cura/API/__init__.py index 54f5c1f8b0..e9aba86a41 100644 --- a/cura/API/__init__.py +++ b/cura/API/__init__.py @@ -1,5 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from typing import Optional, TYPE_CHECKING + from PyQt5.QtCore import QObject, pyqtProperty from UM.PluginRegistry import PluginRegistry @@ -7,6 +9,9 @@ from cura.API.Backups import Backups from cura.API.Interface import Interface from cura.API.Account import Account +if TYPE_CHECKING: + from cura.CuraApplication import CuraApplication + ## The official Cura API that plug-ins can use to interact with Cura. # @@ -19,14 +24,30 @@ class CuraAPI(QObject): # For now we use the same API version to be consistent. VERSION = PluginRegistry.APIVersion - # Backups API - backups = Backups() + def __init__(self, application: "CuraApplication") -> None: + super().__init__(parent = application) + self._application = application - # Interface API - interface = Interface() + # Accounts API + self._account = Account(self._application) - _account = Account() + # Backups API + self._backups = Backups(self._application) + + # Interface API + self._interface = Interface(self._application) + + def initialize(self) -> None: + self._account.initialize() @pyqtProperty(QObject, constant = True) - def account(self) -> Account: - return CuraAPI._account + def account(self) -> "Account": + return self._account + + @property + def backups(self) -> "Backups": + return self._backups + + @property + def interface(self) -> "Interface": + return self._interface \ No newline at end of file diff --git a/cura/Backups/BackupsManager.py b/cura/Backups/BackupsManager.py index 67e2a222f1..a4d8528960 100644 --- a/cura/Backups/BackupsManager.py +++ b/cura/Backups/BackupsManager.py @@ -1,11 +1,13 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Dict, Optional, Tuple +from typing import Dict, Optional, Tuple, TYPE_CHECKING from UM.Logger import Logger from cura.Backups.Backup import Backup -from cura.CuraApplication import CuraApplication + +if TYPE_CHECKING: + from cura.CuraApplication import CuraApplication ## The BackupsManager is responsible for managing the creating and restoring of @@ -13,8 +15,8 @@ from cura.CuraApplication import CuraApplication # # Back-ups themselves are represented in a different class. class BackupsManager: - def __init__(self): - self._application = CuraApplication.getInstance() + def __init__(self, application: "CuraApplication") -> None: + self._application = application ## Get a back-up of the current configuration. # \return A tuple containing a ZipFile (the actual back-up) and a dict diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 04c9ea88db..9d6a2361a1 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -44,6 +44,7 @@ from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation +from cura.API import CuraAPI from cura.Arranging.Arrange import Arrange from cura.Arranging.ArrangeObjectsJob import ArrangeObjectsJob from cura.Arranging.ArrangeObjectsAllBuildPlatesJob import ArrangeObjectsAllBuildPlatesJob @@ -204,7 +205,7 @@ class CuraApplication(QtApplication): self._quality_profile_drop_down_menu_model = None self._custom_quality_profile_drop_down_menu_model = None - self._cura_API = None + self._cura_API = CuraAPI(self) self._physics = None self._volume = None @@ -713,6 +714,9 @@ class CuraApplication(QtApplication): default_visibility_profile = self._setting_visibility_presets_model.getItem(0) self.getPreferences().setDefault("general/visible_settings", ";".join(default_visibility_profile["settings"])) + # Initialize Cura API + self._cura_API.initialize() + # Detect in which mode to run and execute that mode if self._is_headless: self.runWithoutGUI() @@ -900,10 +904,7 @@ class CuraApplication(QtApplication): self._custom_quality_profile_drop_down_menu_model = CustomQualityProfilesDropDownMenuModel(self) return self._custom_quality_profile_drop_down_menu_model - def getCuraAPI(self, *args, **kwargs): - if self._cura_API is None: - from cura.API import CuraAPI - self._cura_API = CuraAPI() + def getCuraAPI(self, *args, **kwargs) -> "CuraAPI": return self._cura_API ## Registers objects for the QML engine to use. diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 16f525625e..df068cc43e 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -29,7 +29,7 @@ class AuthorizationService: # Emit signal when authentication failed. onAuthenticationError = Signal() - def __init__(self, preferences: Optional["Preferences"], settings: "OAuth2Settings") -> None: + def __init__(self, settings: "OAuth2Settings", preferences: Optional["Preferences"] = None) -> None: self._settings = settings self._auth_helpers = AuthorizationHelpers(settings) self._auth_url = "{}/authorize".format(self._settings.OAUTH_SERVER_URL) @@ -38,6 +38,8 @@ class AuthorizationService: self._preferences = preferences self._server = LocalAuthorizationServer(self._auth_helpers, self._onAuthStateChanged, daemon=True) + def initialize(self, preferences: Optional["Preferences"] = None) -> None: + self._preferences = preferences if self._preferences: self._preferences.addPreference(self._settings.AUTH_DATA_PREFERENCE_KEY, "{}") From 6e467721700ce3aa79f55cf4bcf364d40aba5da6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 28 Sep 2018 12:25:03 +0200 Subject: [PATCH 088/212] Fix imports in Backup --- cura/Backups/Backup.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/cura/Backups/Backup.py b/cura/Backups/Backup.py index cc47df770e..b9045a59b1 100644 --- a/cura/Backups/Backup.py +++ b/cura/Backups/Backup.py @@ -4,18 +4,18 @@ import io import os import re - import shutil - -from typing import Dict, Optional from zipfile import ZipFile, ZIP_DEFLATED, BadZipfile +from typing import Dict, Optional, TYPE_CHECKING from UM import i18nCatalog from UM.Logger import Logger from UM.Message import Message from UM.Platform import Platform from UM.Resources import Resources -from cura.CuraApplication import CuraApplication + +if TYPE_CHECKING: + from cura.CuraApplication import CuraApplication ## The back-up class holds all data about a back-up. @@ -29,7 +29,8 @@ class Backup: # Re-use translation catalog. catalog = i18nCatalog("cura") - def __init__(self, zip_file: bytes = None, meta_data: Dict[str, str] = None) -> None: + def __init__(self, application: "CuraApplication", zip_file: bytes = None, meta_data: Dict[str, str] = None) -> None: + self.application = application self.zip_file = zip_file # type: Optional[bytes] self.meta_data = meta_data # type: Optional[Dict[str, str]] @@ -41,12 +42,12 @@ class Backup: Logger.log("d", "Creating backup for Cura %s, using folder %s", cura_release, version_data_dir) # Ensure all current settings are saved. - CuraApplication.getInstance().saveSettings() + self.application.saveSettings() # We copy the preferences file to the user data directory in Linux as it's in a different location there. # When restoring a backup on Linux, we move it back. if Platform.isLinux(): - preferences_file_name = CuraApplication.getInstance().getApplicationName() + preferences_file_name = self.application.getApplicationName() preferences_file = Resources.getPath(Resources.Preferences, "{}.cfg".format(preferences_file_name)) backup_preferences_file = os.path.join(version_data_dir, "{}.cfg".format(preferences_file_name)) Logger.log("d", "Copying preferences file from %s to %s", preferences_file, backup_preferences_file) @@ -112,7 +113,7 @@ class Backup: "Tried to restore a Cura backup without having proper data or meta data.")) return False - current_version = CuraApplication.getInstance().getVersion() + current_version = self.application.getVersion() version_to_restore = self.meta_data.get("cura_release", "master") if current_version != version_to_restore: # Cannot restore version older or newer than current because settings might have changed. @@ -128,7 +129,7 @@ class Backup: # Under Linux, preferences are stored elsewhere, so we copy the file to there. if Platform.isLinux(): - preferences_file_name = CuraApplication.getInstance().getApplicationName() + preferences_file_name = self.application.getApplicationName() preferences_file = Resources.getPath(Resources.Preferences, "{}.cfg".format(preferences_file_name)) backup_preferences_file = os.path.join(version_data_dir, "{}.cfg".format(preferences_file_name)) Logger.log("d", "Moving preferences file from %s to %s", backup_preferences_file, preferences_file) From 3a01b63343668781cfcbb2bec84e8ec8d68d19b9 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 28 Sep 2018 12:33:16 +0200 Subject: [PATCH 089/212] Fix refactor and tests --- cura/Backups/BackupsManager.py | 2 +- cura/OAuth2/AuthorizationService.py | 3 ++- tests/TestOAuth2.py | 22 ++++++++++++++-------- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/cura/Backups/BackupsManager.py b/cura/Backups/BackupsManager.py index a4d8528960..6dfb4ae8bd 100644 --- a/cura/Backups/BackupsManager.py +++ b/cura/Backups/BackupsManager.py @@ -23,7 +23,7 @@ class BackupsManager: # containing some metadata (like version). def createBackup(self) -> Tuple[Optional[bytes], Optional[Dict[str, str]]]: self._disableAutoSave() - backup = Backup() + backup = Backup(self._application) backup.makeFromCurrent() self._enableAutoSave() # We don't return a Backup here because we want plugins only to interact with our API and not full objects. diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index df068cc43e..65b31f1ed7 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -39,7 +39,8 @@ class AuthorizationService: self._server = LocalAuthorizationServer(self._auth_helpers, self._onAuthStateChanged, daemon=True) def initialize(self, preferences: Optional["Preferences"] = None) -> None: - self._preferences = preferences + if preferences is not None: + self._preferences = preferences if self._preferences: self._preferences.addPreference(self._settings.AUTH_DATA_PREFERENCE_KEY, "{}") diff --git a/tests/TestOAuth2.py b/tests/TestOAuth2.py index 78585804f5..608d529e9f 100644 --- a/tests/TestOAuth2.py +++ b/tests/TestOAuth2.py @@ -31,15 +31,17 @@ MALFORMED_AUTH_RESPONSE = AuthenticationResponse() def test_cleanAuthService() -> None: # Ensure that when setting up an AuthorizationService, no data is set. - authorization_service = AuthorizationService(Preferences(), OAUTH_SETTINGS) + authorization_service = AuthorizationService(OAUTH_SETTINGS, Preferences()) + authorization_service.initialize() assert authorization_service.getUserProfile() is None assert authorization_service.getAccessToken() is None def test_failedLogin() -> None: - authorization_service = AuthorizationService(Preferences(), OAUTH_SETTINGS) + authorization_service = AuthorizationService(OAUTH_SETTINGS, Preferences()) authorization_service.onAuthenticationError.emit = MagicMock() authorization_service.onAuthStateChanged.emit = MagicMock() + authorization_service.initialize() # Let the service think there was a failed response authorization_service._onAuthStateChanged(FAILED_AUTH_RESPONSE) @@ -58,7 +60,8 @@ def test_failedLogin() -> None: @patch.object(AuthorizationService, "getUserProfile", return_value=UserProfile()) def test_storeAuthData(get_user_profile) -> None: preferences = Preferences() - authorization_service = AuthorizationService(preferences, OAUTH_SETTINGS) + authorization_service = AuthorizationService(OAUTH_SETTINGS, preferences) + authorization_service.initialize() # Write stuff to the preferences. authorization_service._storeAuthData(SUCCESFULL_AUTH_RESPONSE) @@ -67,7 +70,8 @@ def test_storeAuthData(get_user_profile) -> None: assert preference_value is not None and preference_value != {} # Create a second auth service, so we can load the data. - second_auth_service = AuthorizationService(preferences, OAUTH_SETTINGS) + second_auth_service = AuthorizationService(OAUTH_SETTINGS, preferences) + second_auth_service.initialize() second_auth_service.loadAuthDataFromPreferences() assert second_auth_service.getAccessToken() == SUCCESFULL_AUTH_RESPONSE.access_token @@ -77,7 +81,7 @@ def test_storeAuthData(get_user_profile) -> None: @patch.object(webbrowser, "open_new") def test_localAuthServer(webbrowser_open, start_auth_server, stop_auth_server) -> None: preferences = Preferences() - authorization_service = AuthorizationService(preferences, OAUTH_SETTINGS) + authorization_service = AuthorizationService(OAUTH_SETTINGS, preferences) authorization_service.startAuthorizationFlow() assert webbrowser_open.call_count == 1 @@ -92,9 +96,10 @@ def test_localAuthServer(webbrowser_open, start_auth_server, stop_auth_server) - def test_loginAndLogout() -> None: preferences = Preferences() - authorization_service = AuthorizationService(preferences, OAUTH_SETTINGS) + authorization_service = AuthorizationService(OAUTH_SETTINGS, preferences) authorization_service.onAuthenticationError.emit = MagicMock() authorization_service.onAuthStateChanged.emit = MagicMock() + authorization_service.initialize() # Let the service think there was a succesfull response with patch.object(AuthorizationHelpers, "parseJWT", return_value=UserProfile()): @@ -121,7 +126,8 @@ def test_loginAndLogout() -> None: def test_wrongServerResponses() -> None: - authorization_service = AuthorizationService(Preferences(), OAUTH_SETTINGS) + authorization_service = AuthorizationService(OAUTH_SETTINGS, Preferences()) + authorization_service.initialize() with patch.object(AuthorizationHelpers, "parseJWT", return_value=UserProfile()): authorization_service._onAuthStateChanged(MALFORMED_AUTH_RESPONSE) - assert authorization_service.getUserProfile() is None \ No newline at end of file + assert authorization_service.getUserProfile() is None From 6e2f7e72b699183bab9890bc6802f1fa95a71408 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 28 Sep 2018 12:34:00 +0200 Subject: [PATCH 090/212] Fix missing argument --- cura/Backups/BackupsManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Backups/BackupsManager.py b/cura/Backups/BackupsManager.py index 6dfb4ae8bd..a0d3881209 100644 --- a/cura/Backups/BackupsManager.py +++ b/cura/Backups/BackupsManager.py @@ -41,7 +41,7 @@ class BackupsManager: self._disableAutoSave() - backup = Backup(zip_file = zip_file, meta_data = meta_data) + backup = Backup(self._application, zip_file = zip_file, meta_data = meta_data) restored = backup.restore() if restored: # At this point, Cura will need to restart for the changes to take effect. From a573a598b01445d0f785e4b9256d6c66e96012ab Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 28 Sep 2018 12:40:44 +0200 Subject: [PATCH 091/212] Add typing and appease MYPY --- cura/PrinterOutput/FirmwareUpdater.py | 23 +++-- cura/PrinterOutput/PrintJobOutputModel.py | 2 +- cura/PrinterOutput/PrinterOutputController.py | 31 +++--- cura/PrinterOutput/PrinterOutputModel.py | 97 ++++++++++--------- plugins/USBPrinting/AvrFirmwareUpdater.py | 2 +- plugins/USBPrinting/USBPrinterOutputDevice.py | 4 +- 6 files changed, 83 insertions(+), 76 deletions(-) diff --git a/cura/PrinterOutput/FirmwareUpdater.py b/cura/PrinterOutput/FirmwareUpdater.py index e7ffc2a2b5..06e019c593 100644 --- a/cura/PrinterOutput/FirmwareUpdater.py +++ b/cura/PrinterOutput/FirmwareUpdater.py @@ -5,9 +5,11 @@ from PyQt5.QtCore import QObject, QUrl, pyqtSignal, pyqtProperty from UM.Resources import Resources from cura.PrinterOutputDevice import PrinterOutputDevice +from cura.CuraApplication import CuraApplication from enum import IntEnum from threading import Thread +from typing import Any class FirmwareUpdater(QObject): firmwareProgressChanged = pyqtSignal() @@ -19,11 +21,11 @@ class FirmwareUpdater(QObject): self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) self._firmware_view = None - self._firmware_location = None + self._firmware_location = "" self._firmware_progress = 0 self._firmware_update_state = FirmwareUpdateState.idle - def updateFirmware(self, file): + def updateFirmware(self, file: Any[str, QUrl]) -> None: # the file path could be url-encoded. if file.startswith("file://"): self._firmware_location = QUrl(file).toLocalFile() @@ -33,10 +35,10 @@ class FirmwareUpdater(QObject): self.setFirmwareUpdateState(FirmwareUpdateState.updating) self._update_firmware_thread.start() - def _updateFirmware(self): + def _updateFirmware(self) -> None: raise NotImplementedError("_updateFirmware needs to be implemented") - def cleanupAfterUpdate(self): + def cleanupAfterUpdate(self) -> None: # Clean up for next attempt. self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) self._firmware_location = "" @@ -45,28 +47,29 @@ class FirmwareUpdater(QObject): ## Show firmware interface. # This will create the view if its not already created. - def showFirmwareInterface(self): + def showFirmwareInterface(self) -> None: if self._firmware_view is None: path = Resources.getPath(self.ResourceTypes.QmlFiles, "FirmwareUpdateWindow.qml") self._firmware_view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) - self._firmware_view.show() + if self._firmware_view: + self._firmware_view.show() @pyqtProperty(float, notify = firmwareProgressChanged) - def firmwareProgress(self): + def firmwareProgress(self) -> float: return self._firmware_progress @pyqtProperty(int, notify=firmwareUpdateStateChanged) - def firmwareUpdateState(self): + def firmwareUpdateState(self) -> FirmwareUpdateState: return self._firmware_update_state - def setFirmwareUpdateState(self, state): + def setFirmwareUpdateState(self, state) -> None: if self._firmware_update_state != state: self._firmware_update_state = state self.firmwareUpdateStateChanged.emit() # Callback function for firmware update progress. - def _onFirmwareProgress(self, progress, max_progress = 100): + def _onFirmwareProgress(self, progress, max_progress = 100) -> None: self._firmware_progress = (progress / max_progress) * 100 # Convert to scale of 0-100 self.firmwareProgressChanged.emit() diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 7366b95f86..5b8cc39ad8 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -91,7 +91,7 @@ class PrintJobOutputModel(QObject): def assignedPrinter(self): return self._assigned_printer - def updateAssignedPrinter(self, assigned_printer: "PrinterOutputModel"): + def updateAssignedPrinter(self, assigned_printer: Optional[PrinterOutputModel]): if self._assigned_printer != assigned_printer: old_printer = self._assigned_printer self._assigned_printer = assigned_printer diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index dd2276d771..9a29233f95 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -4,15 +4,18 @@ from UM.Logger import Logger from UM.Signal import Signal +from typing import Any + MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice class PrinterOutputController: - def __init__(self, output_device): + def __init__(self, output_device: PrinterOutputDevice) -> None: self.can_pause = True self.can_abort = True self.can_pre_heat_bed = True @@ -22,44 +25,44 @@ class PrinterOutputController: self.can_update_firmware = False self._output_device = output_device - def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOutputModel", temperature: int): + def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOutputModel", temperature: Any[int, float]) -> None: Logger.log("w", "Set target hotend temperature not implemented in controller") - def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int): + def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int) -> None: Logger.log("w", "Set target bed temperature not implemented in controller") - def setJobState(self, job: "PrintJobOutputModel", state: str): + def setJobState(self, job: "PrintJobOutputModel", state: str) -> None: Logger.log("w", "Set job state not implemented in controller") - def cancelPreheatBed(self, printer: "PrinterOutputModel"): + def cancelPreheatBed(self, printer: "PrinterOutputModel") -> None: Logger.log("w", "Cancel preheat bed not implemented in controller") - def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): + def preheatBed(self, printer: "PrinterOutputModel", temperature, duration) -> None: Logger.log("w", "Preheat bed not implemented in controller") - def cancelPreheatHotend(self, extruder: "ExtruderOutputModel"): + def cancelPreheatHotend(self, extruder: "ExtruderOutputModel") -> None: Logger.log("w", "Cancel preheat hotend not implemented in controller") - def preheatHotend(self, extruder: "ExtruderOutputModel", temperature, duration): + def preheatHotend(self, extruder: "ExtruderOutputModel", temperature, duration) -> None: Logger.log("w", "Preheat hotend not implemented in controller") - def setHeadPosition(self, printer: "PrinterOutputModel", x, y, z, speed): + def setHeadPosition(self, printer: "PrinterOutputModel", x, y, z, speed) -> None: Logger.log("w", "Set head position not implemented in controller") - def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): + def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed) -> None: Logger.log("w", "Move head not implemented in controller") - def homeBed(self, printer: "PrinterOutputModel"): + def homeBed(self, printer: "PrinterOutputModel") -> None: Logger.log("w", "Home bed not implemented in controller") - def homeHead(self, printer: "PrinterOutputModel"): + def homeHead(self, printer: "PrinterOutputModel") -> None: Logger.log("w", "Home head not implemented in controller") - def sendRawCommand(self, printer: "PrinterOutputModel", command: str): + def sendRawCommand(self, printer: "PrinterOutputModel", command: str) -> None: Logger.log("w", "Custom command not implemented in controller") canUpdateFirmwareChanged = Signal() - def setCanUpdateFirmware(self, can_update_firmware: bool): + def setCanUpdateFirmware(self, can_update_firmware: bool) -> None: if can_update_firmware != self.can_update_firmware: self.can_update_firmware = can_update_firmware self.canUpdateFirmwareChanged.emit() \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 859165aef3..96feef1b55 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -2,7 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot -from typing import Optional +from typing import List, Dict, Optional from UM.Math.Vector import Vector from cura.PrinterOutput.ConfigurationModel import ConfigurationModel from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel @@ -11,6 +11,7 @@ MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.PrinterOutputController import PrinterOutputController + from cura.PrinterOutput.NetworkCamera import NetworkCamera class PrinterOutputModel(QObject): @@ -44,7 +45,7 @@ class PrinterOutputModel(QObject): self._printer_state = "unknown" self._is_preheating = False self._printer_type = "" - self._buildplate_name = None + self._buildplate_name = "" self._printer_configuration.extruderConfigurations = [extruder.extruderConfiguration for extruder in self._extruders] @@ -52,32 +53,32 @@ class PrinterOutputModel(QObject): self._camera = None @pyqtProperty(str, constant = True) - def firmwareVersion(self): + def firmwareVersion(self) -> str: return self._firmware_version - def setCamera(self, camera): + def setCamera(self, camera: Optional["NetworkCamera"]) -> None: if self._camera is not camera: self._camera = camera self.cameraChanged.emit() - def updateIsPreheating(self, pre_heating): + def updateIsPreheating(self, pre_heating: bool) -> None: if self._is_preheating != pre_heating: self._is_preheating = pre_heating self.isPreheatingChanged.emit() @pyqtProperty(bool, notify=isPreheatingChanged) - def isPreheating(self): + def isPreheating(self) -> bool: return self._is_preheating @pyqtProperty(QObject, notify=cameraChanged) - def camera(self): + def camera(self) -> Optional["NetworkCamera"]: return self._camera @pyqtProperty(str, notify = printerTypeChanged) - def type(self): + def type(self) -> str: return self._printer_type - def updateType(self, printer_type): + def updateType(self, printer_type: str) -> None: if self._printer_type != printer_type: self._printer_type = printer_type self._printer_configuration.printerType = self._printer_type @@ -85,10 +86,10 @@ class PrinterOutputModel(QObject): self.configurationChanged.emit() @pyqtProperty(str, notify = buildplateChanged) - def buildplate(self): + def buildplate(self) -> str: return self._buildplate_name - def updateBuildplateName(self, buildplate_name): + def updateBuildplateName(self, buildplate_name: str) -> None: if self._buildplate_name != buildplate_name: self._buildplate_name = buildplate_name self._printer_configuration.buildplateConfiguration = self._buildplate_name @@ -96,66 +97,66 @@ class PrinterOutputModel(QObject): self.configurationChanged.emit() @pyqtProperty(str, notify=keyChanged) - def key(self): + def key(self) -> str: return self._key - def updateKey(self, key: str): + def updateKey(self, key: str) -> None: if self._key != key: self._key = key self.keyChanged.emit() @pyqtSlot() - def homeHead(self): + def homeHead(self) -> None: self._controller.homeHead(self) @pyqtSlot() - def homeBed(self): + def homeBed(self) -> None: self._controller.homeBed(self) @pyqtSlot(str) - def sendRawCommand(self, command: str): + def sendRawCommand(self, command: str) -> None: self._controller.sendRawCommand(self, command) @pyqtProperty("QVariantList", constant = True) - def extruders(self): + def extruders(self) -> List["ExtruderOutputModel"]: return self._extruders @pyqtProperty(QVariant, notify = headPositionChanged) - def headPosition(self): + def headPosition(self) -> Dict[str, float]: return {"x": self._head_position.x, "y": self._head_position.y, "z": self.head_position.z} - def updateHeadPosition(self, x, y, z): + def updateHeadPosition(self, x: float, y: float, z: float) -> None: if self._head_position.x != x or self._head_position.y != y or self._head_position.z != z: self._head_position = Vector(x, y, z) self.headPositionChanged.emit() @pyqtProperty(float, float, float) @pyqtProperty(float, float, float, float) - def setHeadPosition(self, x, y, z, speed = 3000): + def setHeadPosition(self, x: float, y: float, z: float, speed: float = 3000) -> None: self.updateHeadPosition(x, y, z) self._controller.setHeadPosition(self, x, y, z, speed) @pyqtProperty(float) @pyqtProperty(float, float) - def setHeadX(self, x, speed = 3000): + def setHeadX(self, x: float, speed: float = 3000) -> None: self.updateHeadPosition(x, self._head_position.y, self._head_position.z) self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed) @pyqtProperty(float) @pyqtProperty(float, float) - def setHeadY(self, y, speed = 3000): + def setHeadY(self, y: float, speed: float = 3000) -> None: self.updateHeadPosition(self._head_position.x, y, self._head_position.z) self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed) @pyqtProperty(float) @pyqtProperty(float, float) - def setHeadZ(self, z, speed = 3000): + def setHeadZ(self, z: float, speed:float = 3000) -> None: self.updateHeadPosition(self._head_position.x, self._head_position.y, z) self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed) @pyqtSlot(float, float, float) @pyqtSlot(float, float, float, float) - def moveHead(self, x = 0, y = 0, z = 0, speed = 3000): + def moveHead(self, x: float = 0, y: float = 0, z: float = 0, speed: float = 3000) -> None: self._controller.moveHead(self, x, y, z, speed) ## Pre-heats the heated bed of the printer. @@ -164,47 +165,47 @@ class PrinterOutputModel(QObject): # Celsius. # \param duration How long the bed should stay warm, in seconds. @pyqtSlot(float, float) - def preheatBed(self, temperature, duration): + def preheatBed(self, temperature: float, duration: float) -> None: self._controller.preheatBed(self, temperature, duration) @pyqtSlot() - def cancelPreheatBed(self): + def cancelPreheatBed(self) -> None: self._controller.cancelPreheatBed(self) - def getController(self): + def getController(self) -> PrinterOutputController: return self._controller @pyqtProperty(str, notify=nameChanged) - def name(self): + def name(self) -> str: return self._name - def setName(self, name): + def setName(self, name: str) -> None: self._setName(name) self.updateName(name) - def updateName(self, name): + def updateName(self, name: str) -> None: if self._name != name: self._name = name self.nameChanged.emit() ## Update the bed temperature. This only changes it locally. - def updateBedTemperature(self, temperature): + def updateBedTemperature(self, temperature: int) -> None: if self._bed_temperature != temperature: self._bed_temperature = temperature self.bedTemperatureChanged.emit() - def updateTargetBedTemperature(self, temperature): + def updateTargetBedTemperature(self, temperature: int) -> None: if self._target_bed_temperature != temperature: self._target_bed_temperature = temperature self.targetBedTemperatureChanged.emit() ## Set the target bed temperature. This ensures that it's actually sent to the remote. @pyqtSlot(int) - def setTargetBedTemperature(self, temperature): + def setTargetBedTemperature(self, temperature: int) -> None: self._controller.setTargetBedTemperature(self, temperature) self.updateTargetBedTemperature(temperature) - def updateActivePrintJob(self, print_job): + def updateActivePrintJob(self, print_job: Optional[PrintJobOutputModel]) -> None: if self._active_print_job != print_job: old_print_job = self._active_print_job @@ -216,83 +217,83 @@ class PrinterOutputModel(QObject): old_print_job.updateAssignedPrinter(None) self.activePrintJobChanged.emit() - def updateState(self, printer_state): + def updateState(self, printer_state: str) -> None: if self._printer_state != printer_state: self._printer_state = printer_state self.stateChanged.emit() @pyqtProperty(QObject, notify = activePrintJobChanged) - def activePrintJob(self): + def activePrintJob(self) -> Optional[PrintJobOutputModel]: return self._active_print_job @pyqtProperty(str, notify=stateChanged) - def state(self): + def state(self) -> str: return self._printer_state @pyqtProperty(int, notify = bedTemperatureChanged) - def bedTemperature(self): + def bedTemperature(self) -> int: return self._bed_temperature @pyqtProperty(int, notify=targetBedTemperatureChanged) - def targetBedTemperature(self): + def targetBedTemperature(self) -> int: return self._target_bed_temperature # Does the printer support pre-heating the bed at all @pyqtProperty(bool, constant=True) - def canPreHeatBed(self): + def canPreHeatBed(self) -> bool: if self._controller: return self._controller.can_pre_heat_bed return False # Does the printer support pre-heating the bed at all @pyqtProperty(bool, constant=True) - def canPreHeatHotends(self): + def canPreHeatHotends(self) -> bool: if self._controller: return self._controller.can_pre_heat_hotends return False # Does the printer support sending raw G-code at all @pyqtProperty(bool, constant=True) - def canSendRawGcode(self): + def canSendRawGcode(self) -> bool: if self._controller: return self._controller.can_send_raw_gcode return False # Does the printer support pause at all @pyqtProperty(bool, constant=True) - def canPause(self): + def canPause(self) -> bool: if self._controller: return self._controller.can_pause return False # Does the printer support abort at all @pyqtProperty(bool, constant=True) - def canAbort(self): + def canAbort(self) -> bool: if self._controller: return self._controller.can_abort return False # Does the printer support manual control at all @pyqtProperty(bool, constant=True) - def canControlManually(self): + def canControlManually(self) -> bool: if self._controller: return self._controller.can_control_manually return False # Does the printer support upgrading firmware @pyqtProperty(bool, notify = canUpdateFirmwareChanged) - def canUpdateFirmware(self): + def canUpdateFirmware(self) -> bool: if self._controller: return self._controller.can_update_firmware return False # Stub to connect UM.Signal to pyqtSignal - def _onControllerCanUpdateFirmwareChanged(self): + def _onControllerCanUpdateFirmwareChanged(self) -> None: self.canUpdateFirmwareChanged.emit() # Returns the configuration (material, variant and buildplate) of the current printer @pyqtProperty(QObject, notify = configurationChanged) - def printerConfiguration(self): + def printerConfiguration(self) -> Optional[ConfigurationModel]: if self._printer_configuration.isValid(): return self._printer_configuration return None \ No newline at end of file diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py index 171c81d557..c3852c46f6 100644 --- a/plugins/USBPrinting/AvrFirmwareUpdater.py +++ b/plugins/USBPrinting/AvrFirmwareUpdater.py @@ -10,7 +10,7 @@ class AvrFirmwareUpdater(FirmwareUpdater): def __init__(self, output_device: PrinterOutputDevice) -> None: super().__init__(output_device) - def _updateFirmware(self): + def _updateFirmware(self) -> None: try: hex_file = intelHex.readHex(self._firmware_location) assert len(hex_file) > 0 diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 4813696ffe..5e18e216bc 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -99,12 +99,12 @@ class USBPrinterOutputDevice(PrinterOutputDevice): application.triggerNextExitCheck() @pyqtSlot(str) - def updateFirmware(self, file): + def updateFirmware(self, file: Any[str, QUrl]) -> None: self._firmware_updater.updateFirmware(file) ## Reset USB device settings # - def resetDeviceSettings(self): + def resetDeviceSettings(self) -> None: self._firmware_name = None ## Request the current scene to be sent to a USB-connected printer. From 6be6d6cfc322630c20db6fbfa5271967324b60d4 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 28 Sep 2018 12:49:53 +0200 Subject: [PATCH 092/212] Fixed missing typing import --- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 5e18e216bc..c9fcdbe625 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -21,7 +21,7 @@ from serial import Serial, SerialException, SerialTimeoutException from threading import Thread, Event from time import time, sleep from queue import Queue -from typing import Union, Optional, List, cast +from typing import Union, Optional, List, cast, Any import re import functools # Used for reduce From 6ecc9366cb6ee80ad11bab33371dec7799a899ae Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 28 Sep 2018 13:06:09 +0200 Subject: [PATCH 093/212] Fix filename typos --- resources/definitions/ultimaker_original.def.json | 2 +- resources/definitions/ultimaker_original_dual.def.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index bb6a64d8dc..bb21e4b82e 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -20,7 +20,7 @@ "0": "ultimaker_original_extruder_0" }, "firmware_file": "MarlinUltimaker-{baudrate}.hex", - "firmware_hbk_file": "MarlinUltimaker-HKB-{baudrate}.hex" + "firmware_hbk_file": "MarlinUltimaker-HBK-{baudrate}.hex" }, "overrides": { diff --git a/resources/definitions/ultimaker_original_dual.def.json b/resources/definitions/ultimaker_original_dual.def.json index c6002ef396..1ffb6e840b 100644 --- a/resources/definitions/ultimaker_original_dual.def.json +++ b/resources/definitions/ultimaker_original_dual.def.json @@ -20,7 +20,7 @@ "1": "ultimaker_original_dual_2nd" }, "firmware_file": "MarlinUltimaker-{baudrate}-dual.hex", - "firmware_hbk_file": "MarlinUltimaker-HKB-{baudrate}-dual.hex", + "firmware_hbk_file": "MarlinUltimaker-HBK-{baudrate}-dual.hex", "first_start_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel"], "supported_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel", "UpgradeFirmware"] }, From b73a71746eb4ac44c6387388c1fac68ddcc618b7 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 28 Sep 2018 13:06:36 +0200 Subject: [PATCH 094/212] Fix missing imports --- plugins/USBPrinting/AvrFirmwareUpdater.py | 12 ++++++++++-- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py index c3852c46f6..ab71f70e30 100644 --- a/plugins/USBPrinting/AvrFirmwareUpdater.py +++ b/plugins/USBPrinting/AvrFirmwareUpdater.py @@ -1,10 +1,16 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from UM.Logger import Logger + +from cura.CuraApplication import CuraApplication from cura.PrinterOutputDevice import PrinterOutputDevice from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdater, FirmwareUpdateState from .avr_isp import stk500v2, intelHex +from serial import SerialException + +from time import sleep class AvrFirmwareUpdater(FirmwareUpdater): def __init__(self, output_device: PrinterOutputDevice) -> None: @@ -37,10 +43,12 @@ class AvrFirmwareUpdater(FirmwareUpdater): self.setFirmwareUpdateState(FirmwareUpdateState.communication_error) try: programmer.programChip(hex_file) - except SerialException: + except SerialException as e: + Logger.log("e", "A serial port exception occured during firmware update: %s" % e) self.setFirmwareUpdateState(FirmwareUpdateState.io_error) return - except: + except Exception as e: + Logger.log("e", "An unknown exception occured during firmware update: %s" % e) self.setFirmwareUpdateState(FirmwareUpdateState.unknown_error) return diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index c9fcdbe625..9ab2a06d50 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -15,7 +15,7 @@ from cura.PrinterOutput.GenericOutputController import GenericOutputController from .AutoDetectBaudJob import AutoDetectBaudJob from .AvrFirmwareUpdater import AvrFirmwareUpdater -from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty +from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty, QUrl from serial import Serial, SerialException, SerialTimeoutException from threading import Thread, Event From 09742f0cf51769b46ac8be2402d1db9df10a5061 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 28 Sep 2018 13:09:59 +0200 Subject: [PATCH 095/212] Simplify code --- cura/Settings/GlobalStack.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index e3ae8c2deb..da1ec61254 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -218,16 +218,16 @@ class GlobalStack(CuraContainerStack): if machine_has_heated_bed: hex_file = self.getMetaDataEntry("firmware_hbk_file", hex_file) - if hex_file: - try: - return Resources.getPath(cura.CuraApplication.CuraApplication.ResourceTypes.Firmware, hex_file.format(baudrate=baudrate)) - except FileNotFoundError: - Logger.log("w", "Firmware file %s not found.", hex_file) - return "" - else: + if not hex_file: Logger.log("w", "There is no firmware for machine %s.", self.getBottom().id) return "" + try: + return Resources.getPath(cura.CuraApplication.CuraApplication.ResourceTypes.Firmware, hex_file.format(baudrate=baudrate)) + except FileNotFoundError: + Logger.log("w", "Firmware file %s not found.", hex_file) + return "" + ## private: global_stack_mime = MimeType( name = "application/x-cura-globalstack", From 9af71f2888c1de1616af67f3241c08544f0958df Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 28 Sep 2018 13:40:39 +0200 Subject: [PATCH 096/212] Fix incorrect typing and issues caused by typing --- cura/PrinterOutput/FirmwareUpdater.py | 6 +++--- cura/PrinterOutput/GenericOutputController.py | 4 ++-- cura/PrinterOutput/PrintJobOutputModel.py | 2 +- cura/PrinterOutput/PrinterOutputController.py | 6 +++--- cura/PrinterOutput/PrinterOutputModel.py | 8 ++++---- plugins/USBPrinting/USBPrinterOutputDevice.py | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cura/PrinterOutput/FirmwareUpdater.py b/cura/PrinterOutput/FirmwareUpdater.py index 06e019c593..2f200118a9 100644 --- a/cura/PrinterOutput/FirmwareUpdater.py +++ b/cura/PrinterOutput/FirmwareUpdater.py @@ -9,7 +9,7 @@ from cura.CuraApplication import CuraApplication from enum import IntEnum from threading import Thread -from typing import Any +from typing import Union class FirmwareUpdater(QObject): firmwareProgressChanged = pyqtSignal() @@ -25,7 +25,7 @@ class FirmwareUpdater(QObject): self._firmware_progress = 0 self._firmware_update_state = FirmwareUpdateState.idle - def updateFirmware(self, file: Any[str, QUrl]) -> None: + def updateFirmware(self, file: Union[str, QUrl]) -> None: # the file path could be url-encoded. if file.startswith("file://"): self._firmware_location = QUrl(file).toLocalFile() @@ -60,7 +60,7 @@ class FirmwareUpdater(QObject): return self._firmware_progress @pyqtProperty(int, notify=firmwareUpdateStateChanged) - def firmwareUpdateState(self) -> FirmwareUpdateState: + def firmwareUpdateState(self) -> "FirmwareUpdateState": return self._firmware_update_state def setFirmwareUpdateState(self, state) -> None: diff --git a/cura/PrinterOutput/GenericOutputController.py b/cura/PrinterOutput/GenericOutputController.py index e6310e5bff..e26fefb520 100644 --- a/cura/PrinterOutput/GenericOutputController.py +++ b/cura/PrinterOutput/GenericOutputController.py @@ -1,7 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Union from cura.PrinterOutput.PrinterOutputController import PrinterOutputController from PyQt5.QtCore import QTimer @@ -109,7 +109,7 @@ class GenericOutputController(PrinterOutputController): self.setTargetBedTemperature(self._preheat_printer, 0) self._preheat_printer.updateIsPreheating(False) - def setTargetHotendTemperature(self, printer: "PrinterOutputModel", position: int, temperature: int): + def setTargetHotendTemperature(self, printer: "PrinterOutputModel", position: int, temperature: Union[int, float]) -> None: self._output_device.sendCommand("M104 S%s T%s" % (temperature, position)) def _onTargetHotendTemperatureChanged(self): diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 5b8cc39ad8..70878a7573 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -91,7 +91,7 @@ class PrintJobOutputModel(QObject): def assignedPrinter(self): return self._assigned_printer - def updateAssignedPrinter(self, assigned_printer: Optional[PrinterOutputModel]): + def updateAssignedPrinter(self, assigned_printer: Optional["PrinterOutputModel"]): if self._assigned_printer != assigned_printer: old_printer = self._assigned_printer self._assigned_printer = assigned_printer diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index 9a29233f95..cc7b78ac11 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -4,7 +4,7 @@ from UM.Logger import Logger from UM.Signal import Signal -from typing import Any +from typing import Union MYPY = False if MYPY: @@ -15,7 +15,7 @@ if MYPY: class PrinterOutputController: - def __init__(self, output_device: PrinterOutputDevice) -> None: + def __init__(self, output_device: "PrinterOutputDevice") -> None: self.can_pause = True self.can_abort = True self.can_pre_heat_bed = True @@ -25,7 +25,7 @@ class PrinterOutputController: self.can_update_firmware = False self._output_device = output_device - def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOutputModel", temperature: Any[int, float]) -> None: + def setTargetHotendTemperature(self, printer: "PrinterOutputModel", position: int, temperature: Union[int, float]) -> None: Logger.log("w", "Set target hotend temperature not implemented in controller") def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int) -> None: diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 96feef1b55..abfee41e80 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -172,7 +172,7 @@ class PrinterOutputModel(QObject): def cancelPreheatBed(self) -> None: self._controller.cancelPreheatBed(self) - def getController(self) -> PrinterOutputController: + def getController(self) -> "PrinterOutputController": return self._controller @pyqtProperty(str, notify=nameChanged) @@ -205,7 +205,7 @@ class PrinterOutputModel(QObject): self._controller.setTargetBedTemperature(self, temperature) self.updateTargetBedTemperature(temperature) - def updateActivePrintJob(self, print_job: Optional[PrintJobOutputModel]) -> None: + def updateActivePrintJob(self, print_job: Optional["PrintJobOutputModel"]) -> None: if self._active_print_job != print_job: old_print_job = self._active_print_job @@ -223,14 +223,14 @@ class PrinterOutputModel(QObject): self.stateChanged.emit() @pyqtProperty(QObject, notify = activePrintJobChanged) - def activePrintJob(self) -> Optional[PrintJobOutputModel]: + def activePrintJob(self) -> Optional["PrintJobOutputModel"]: return self._active_print_job @pyqtProperty(str, notify=stateChanged) def state(self) -> str: return self._printer_state - @pyqtProperty(int, notify = bedTemperatureChanged) + @pyqtProperty(int, notify=bedTemperatureChanged) def bedTemperature(self) -> int: return self._bed_temperature diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 9ab2a06d50..ebfdca2dab 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -21,7 +21,7 @@ from serial import Serial, SerialException, SerialTimeoutException from threading import Thread, Event from time import time, sleep from queue import Queue -from typing import Union, Optional, List, cast, Any +from typing import Union, Optional, List, cast import re import functools # Used for reduce @@ -99,7 +99,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): application.triggerNextExitCheck() @pyqtSlot(str) - def updateFirmware(self, file: Any[str, QUrl]) -> None: + def updateFirmware(self, file: Union[str, QUrl]) -> None: self._firmware_updater.updateFirmware(file) ## Reset USB device settings From fa5ee4c5a270111dad13803d4149ec06f49f8e20 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 28 Sep 2018 13:44:18 +0200 Subject: [PATCH 097/212] Fix typo --- .../UltimakerMachineActions/UpgradeFirmwareMachineAction.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml index 469ada7afb..1d0aabcae3 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml @@ -16,7 +16,7 @@ Cura.MachineAction anchors.fill: parent; property bool printerConnected: Cura.MachineManager.printerConnected property var activeOutputDevice: printerConnected ? Cura.MachineManager.printerOutputDevices[0] : null - property var canUpdateFirmware: activeOutputDevice ? activeOutputDevice.activePrinter.canUpdateFirmware : False + property var canUpdateFirmware: activeOutputDevice ? activeOutputDevice.activePrinter.canUpdateFirmware : false Column { From 7ae6800a14ada0b2c2ef81a1deaf0b1484b66e85 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 28 Sep 2018 14:01:28 +0200 Subject: [PATCH 098/212] Fix imports in QualityManager --- cura/CuraApplication.py | 2 +- cura/Machines/QualityManager.py | 12 ++++-------- cura/Scene/ConvexHullDecorator.py | 1 - 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 04c9ea88db..6fb79403cc 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -681,7 +681,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Initializing quality manager") from cura.Machines.QualityManager import QualityManager - self._quality_manager = QualityManager(container_registry, parent = self) + self._quality_manager = QualityManager(self, parent = self) self._quality_manager.initialize() Logger.log("i", "Initializing machine manager") diff --git a/cura/Machines/QualityManager.py b/cura/Machines/QualityManager.py index d924f4c83e..ce19624c21 100644 --- a/cura/Machines/QualityManager.py +++ b/cura/Machines/QualityManager.py @@ -5,8 +5,6 @@ from typing import TYPE_CHECKING, Optional, cast, Dict, List from PyQt5.QtCore import QObject, QTimer, pyqtSignal, pyqtSlot -from UM.Application import Application - from UM.ConfigurationErrorMessage import ConfigurationErrorMessage from UM.Logger import Logger from UM.Util import parseBool @@ -22,7 +20,6 @@ if TYPE_CHECKING: from cura.Settings.GlobalStack import GlobalStack from .QualityChangesGroup import QualityChangesGroup from cura.CuraApplication import CuraApplication - from UM.Settings.ContainerRegistry import ContainerRegistry # @@ -39,12 +36,11 @@ class QualityManager(QObject): qualitiesUpdated = pyqtSignal() - def __init__(self, container_registry: "ContainerRegistry", parent = None) -> None: + def __init__(self, application: "CuraApplication", parent = None) -> None: super().__init__(parent) - from cura.CuraApplication import CuraApplication - self._application = CuraApplication.getInstance() # type: CuraApplication + self._application = application self._material_manager = self._application.getMaterialManager() - self._container_registry = container_registry + self._container_registry = self._application.getContainerRegistry() self._empty_quality_container = self._application.empty_quality_container self._empty_quality_changes_container = self._application.empty_quality_changes_container @@ -460,7 +456,7 @@ class QualityManager(QObject): # stack and clear the user settings. @pyqtSlot(str) def createQualityChanges(self, base_name: str) -> None: - machine_manager = CuraApplication.getInstance().getMachineManager() + machine_manager = self._application.getMachineManager() global_stack = machine_manager.activeMachine if not global_stack: diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index 8532f40890..bdb4cbcba8 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -9,7 +9,6 @@ from UM.Math.Polygon import Polygon from UM.Scene.SceneNodeDecorator import SceneNodeDecorator from UM.Settings.ContainerRegistry import ContainerRegistry - from cura.Settings.ExtruderManager import ExtruderManager from cura.Scene import ConvexHullNode From 3bc91f15c34814e3de424ec025b2f070ff7a223a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 28 Sep 2018 14:17:00 +0200 Subject: [PATCH 099/212] Fix mypy complains --- cura/OAuth2/AuthorizationHelpers.py | 40 +++++++++++++++-------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py index 6cb53d2252..0a1447297c 100644 --- a/cura/OAuth2/AuthorizationHelpers.py +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -4,7 +4,7 @@ import json import random from hashlib import sha512 from base64 import b64encode -from typing import Optional +from typing import Dict, Optional import requests @@ -24,37 +24,39 @@ class AuthorizationHelpers: def settings(self) -> "OAuth2Settings": return self._settings + # Gets a dictionary with data that need to be used for any HTTP authorization request. + def getCommonRequestDataDict(self) -> Dict[str, str]: + data_dict = {"client_id": self._settings.CLIENT_ID if self._settings.CLIENT_ID is not None else "", + "redirect_uri": self._settings.CALLBACK_URL if self._settings.CALLBACK_URL is not None else "", + "scope": self._settings.CLIENT_SCOPES if self._settings.CLIENT_SCOPES is not None else "", + } + return data_dict + # Request the access token from the authorization server. # \param authorization_code: The authorization code from the 1st step. # \param verification_code: The verification code needed for the PKCE extension. # \return: An AuthenticationResponse object. - def getAccessTokenUsingAuthorizationCode(self, authorization_code: str, verification_code: str)-> "AuthenticationResponse": - return self.parseTokenResponse(requests.post(self._token_url, data={ - "client_id": self._settings.CLIENT_ID, - "redirect_uri": self._settings.CALLBACK_URL, - "grant_type": "authorization_code", - "code": authorization_code, - "code_verifier": verification_code, - "scope": self._settings.CLIENT_SCOPES - })) # type: ignore + def getAccessTokenUsingAuthorizationCode(self, authorization_code: str, verification_code: str) -> "AuthenticationResponse": + data = self.getCommonRequestDataDict() + data["grant_type"] = "authorization_code" + data["code"] = authorization_code + data["code_verifier"] = verification_code + return self.parseTokenResponse(requests.post(self._token_url, data = data)) # type: ignore # Request the access token from the authorization server using a refresh token. # \param refresh_token: # \return: An AuthenticationResponse object. - def getAccessTokenUsingRefreshToken(self, refresh_token: str) -> AuthenticationResponse: - return self.parseTokenResponse(requests.post(self._token_url, data={ - "client_id": self._settings.CLIENT_ID, - "redirect_uri": self._settings.CALLBACK_URL, - "grant_type": "refresh_token", - "refresh_token": refresh_token, - "scope": self._settings.CLIENT_SCOPES - })) # type: ignore + def getAccessTokenUsingRefreshToken(self, refresh_token: str) -> "AuthenticationResponse": + data = self.getCommonRequestDataDict() + data["grant_type"] = "refresh_token" + data["refresh_token"] = refresh_token + return self.parseTokenResponse(requests.post(self._token_url, data = data)) # type: ignore @staticmethod # Parse the token response from the authorization server into an AuthenticationResponse object. # \param token_response: The JSON string data response from the authorization server. # \return: An AuthenticationResponse object. - def parseTokenResponse(token_response: requests.models.Response) -> AuthenticationResponse: + def parseTokenResponse(token_response: requests.models.Response) -> "AuthenticationResponse": token_data = None try: From b0602e795c1d8b16f94af29c4748f946ac24b605 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 28 Sep 2018 14:20:12 +0200 Subject: [PATCH 100/212] Update translations by Bothof for Cura 3.5 These are the files that Bothof gave us. I'll check and correct them soon. Contributes to issue CURA-5741. --- resources/i18n/de_DE/cura.po | 188 +++++++---------- resources/i18n/de_DE/fdmprinter.def.json.po | 74 +++---- resources/i18n/es_ES/cura.po | 188 +++++++---------- resources/i18n/es_ES/fdmprinter.def.json.po | 74 +++---- resources/i18n/fr_FR/cura.po | 190 +++++++---------- resources/i18n/fr_FR/fdmprinter.def.json.po | 74 +++---- resources/i18n/it_IT/cura.po | 188 +++++++---------- resources/i18n/it_IT/fdmprinter.def.json.po | 74 +++---- resources/i18n/ja_JP/cura.po | 171 +++++++--------- resources/i18n/ja_JP/fdmprinter.def.json.po | 78 +++---- resources/i18n/ko_KR/cura.po | 188 +++++++---------- resources/i18n/ko_KR/fdmprinter.def.json.po | 70 +++---- resources/i18n/nl_NL/cura.po | 188 +++++++---------- resources/i18n/nl_NL/fdmprinter.def.json.po | 74 +++---- resources/i18n/pt_PT/cura.po | 202 ++++++++---------- resources/i18n/pt_PT/fdmprinter.def.json.po | 74 +++---- resources/i18n/ru_RU/cura.po | 216 ++++++++------------ resources/i18n/ru_RU/fdmprinter.def.json.po | 80 ++++---- resources/i18n/tr_TR/cura.po | 188 +++++++---------- resources/i18n/tr_TR/fdmprinter.def.json.po | 74 +++---- resources/i18n/zh_CN/cura.po | 188 +++++++---------- resources/i18n/zh_CN/fdmprinter.def.json.po | 74 +++---- 22 files changed, 1221 insertions(+), 1694 deletions(-) diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index dac39b8de1..91b76b69ec 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -43,13 +43,13 @@ msgstr "G-Code-Datei" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "GCodeWriter unterstützt keinen Nicht-Textmodus." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "Generieren Sie vor dem Speichern bitte einen G-Code." #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -64,11 +64,7 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "" -"

Ein oder mehrere 3D-Modelle können möglicherweise aufgrund der Modellgröße und Materialkonfiguration nicht optimal gedruckt werden:

\n" -"

{model_names}

\n" -"

Erfahren Sie, wie Sie die bestmögliche Druckqualität und Zuverlässigkeit sicherstellen.

\n" -"

Leitfaden zu Druckqualität anzeigen

" +msgstr "

Ein oder mehrere 3D-Modelle können möglicherweise aufgrund der Modellgröße und Materialkonfiguration nicht optimal gedruckt werden:

\n

{model_names}

\n

Erfahren Sie, wie Sie die bestmögliche Druckqualität und Zuverlässigkeit sicherstellen.

\n

Leitfaden zu Druckqualität anzeigen

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -108,7 +104,7 @@ msgstr "Über USB verbunden" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "Ein USB-Druck wird ausgeführt. Das Schließen von Cura beendet diesen Druck. Sind Sie sicher?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -135,7 +131,7 @@ msgstr "Komprimierte G-Code-Datei" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "GCodeWriter unterstützt keinen Textmodus." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -632,7 +628,7 @@ msgstr "Schneiden (Slicing) ist nicht möglich, da der Einzugsturm oder die Einz #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "Schneiden (Slicing) ist nicht möglich, da Objekte vorhanden sind, die mit dem deaktivierten Extruder %s verbunden sind." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -688,12 +684,12 @@ msgstr "Düse" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "Projektdatei {0} enthält einen unbekannten Maschinentyp {1}. Importieren der Maschine ist nicht möglich. Stattdessen werden die Modelle importiert." #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "Projektdatei öffnen" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -750,7 +746,7 @@ msgstr "Cura-Projekt 3MF-Datei" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "Fehler beim Schreiben von 3MF-Datei." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1078,12 +1074,7 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "" -"

Hoppla, bei Ultimaker Cura ist ein Problem aufgetreten.

\n" -"

Beim Start ist ein nicht behebbarer Fehler aufgetreten. Er wurde möglicherweise durch einige falsche Konfigurationsdateien verursacht. Wir empfehlen ein Backup und Reset Ihrer Konfiguration.

\n" -"

Backups sind im Konfigurationsordner abgelegt.

\n" -"

Senden Sie uns diesen Absturzbericht bitte, um das Problem zu beheben.

\n" -" " +msgstr "

Hoppla, bei Ultimaker Cura ist ein Problem aufgetreten.

\n

Beim Start ist ein nicht behebbarer Fehler aufgetreten. Er wurde möglicherweise durch einige falsche Konfigurationsdateien verursacht. Wir empfehlen ein Backup und Reset Ihrer Konfiguration.

\n

Backups sind im Konfigurationsordner abgelegt.

\n

Senden Sie uns diesen Absturzbericht bitte, um das Problem zu beheben.

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1116,10 +1107,7 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "" -"

Ein schwerer Fehler ist in Cura aufgetreten. Senden Sie uns diesen Absturzbericht, um das Problem zu beheben

\n" -"

Verwenden Sie bitte die Schaltfläche „Bericht senden“, um den Fehlerbericht automatisch an unsere Server zu senden

\n" -" " +msgstr "

Ein schwerer Fehler ist in Cura aufgetreten. Senden Sie uns diesen Absturzbericht, um das Problem zu beheben

\n

Verwenden Sie bitte die Schaltfläche „Bericht senden“, um den Fehlerbericht automatisch an unsere Server zu senden

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1466,7 +1454,7 @@ msgstr "Autor" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "Downloads" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1506,27 +1494,27 @@ msgstr "Zurück" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "Deinstallieren bestätigen " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "Sie sind dabei, Materialien und/oder Profile zu deinstallieren, die noch verwendet werden. Durch Bestätigen werden die folgenden Materialien/Profile auf ihre Standardeinstellungen zurückgesetzt." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "Materialien" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "Profile" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "Bestätigen" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1541,17 +1529,17 @@ msgstr "Quit Cura" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "Community-Beiträge" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "Community-Plugins" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "Generische Materialien" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1584,10 +1572,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Dieses Plugin enthält eine Lizenz.\n" -"Sie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\n" -"Stimmen Sie den nachfolgenden Bedingungen zu?" +msgstr "Dieses Plugin enthält eine Lizenz.\nSie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\nStimmen Sie den nachfolgenden Bedingungen zu?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1617,12 +1602,12 @@ msgstr "Pakete werden abgeholt..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "Website" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "E-Mail" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1707,10 +1692,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n" -"\n" -"Wählen Sie Ihren Drucker aus der folgenden Liste:" +msgstr "Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n\nWählen Sie Ihren Drucker aus der folgenden Liste:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1759,12 +1741,12 @@ msgstr "Adresse" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "Dieser Drucker ist nicht eingerichtet um eine Gruppe von Druckern anzusteuern." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "Dieser Drucker steuert eine Gruppe von %1 Druckern an." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1812,52 +1794,52 @@ msgstr "Drucken" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "Warten auf: Drucker nicht verfügbar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "Warten auf: Ersten verfügbaren" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "Warten auf: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "Vorziehen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "Druckauftrag vorziehen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "Soll dieser %1 wirklich an den Anfang der Warteschlange vorgezogen werden?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "Löschen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "Druckauftrag löschen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "Soll %1 wirklich gelöscht werden?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "Warteschlange verwalten" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1872,40 +1854,40 @@ msgstr "Drucken" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "Drucker verwalten" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "Nicht verfügbar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "Nicht erreichbar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "Verfügbar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "Zurückkehren" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "Pausieren" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "Abbrechen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 @@ -1916,13 +1898,13 @@ msgstr "Drucken abbrechen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "Möchten Sie %1 wirklich abbrechen?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "Abgebrochen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1937,7 +1919,7 @@ msgstr "Vorbereitung" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "Wird pausiert..." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2355,7 +2337,7 @@ msgstr "Öffnen" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "Zurück" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2367,12 +2349,12 @@ msgstr "Export" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "Weiter" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "Tipp" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2421,12 +2403,12 @@ msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "Druckexperiment" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "Checkliste" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2649,7 +2631,7 @@ msgstr "Bitte den Ausdruck entfernen" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "Drucken abbrechen" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -2666,9 +2648,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Sie haben einige Profileinstellungen angepasst.\n" -"Möchten Sie diese Einstellungen übernehmen oder verwerfen?" +msgstr "Sie haben einige Profileinstellungen angepasst.\nMöchten Sie diese Einstellungen übernehmen oder verwerfen?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3112,7 +3092,7 @@ msgstr "Standardverhalten beim Öffnen einer Projektdatei: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "Stets nachfragen" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3132,22 +3112,22 @@ msgstr "Wenn Sie Änderungen für ein Profil vorgenommen haben und zu einem ande #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "Profile" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "Standardverhalten für geänderte Einstellungswerte beim Wechsel zu einem anderen Profil: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "Geänderte Einstellungen immer verwerfen" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "Geänderte Einstellungen immer auf neues Profil übertragen" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3342,7 +3322,7 @@ msgstr "Drucker hinzufügen" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "Unbenannt" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3364,9 +3344,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\n" -"Cura verwendet mit Stolz die folgenden Open Source-Projekte:" +msgstr "Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\nCura verwendet mit Stolz die folgenden Open Source-Projekte:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3479,10 +3457,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n" -"\n" -"Klicken Sie, um den Profilmanager zu öffnen." +msgstr "Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n\nKlicken Sie, um den Profilmanager zu öffnen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3536,10 +3511,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n" -"\n" -"Klicken Sie, um diese Einstellungen sichtbar zu machen." +msgstr "Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n\nKlicken Sie, um diese Einstellungen sichtbar zu machen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3567,10 +3539,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Diese Einstellung hat einen vom Profil abweichenden Wert.\n" -"\n" -"Klicken Sie, um den Wert des Profils wiederherzustellen." +msgstr "Diese Einstellung hat einen vom Profil abweichenden Wert.\n\nKlicken Sie, um den Wert des Profils wiederherzustellen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3578,10 +3547,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n" -"\n" -"Klicken Sie, um den berechneten Wert wiederherzustellen." +msgstr "Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n\nKlicken Sie, um den berechneten Wert wiederherzustellen." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3700,17 +3666,17 @@ msgstr "Heizen Sie das Bett vor Druckbeginn auf. Sie können Ihren Druck währen #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "Favoriten" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "Generisch" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3806,9 +3772,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Druckeinrichtung deaktiviert\n" -"G-Code-Dateien können nicht geändert werden" +msgstr "Druckeinrichtung deaktiviert\nG-Code-Dateien können nicht geändert werden" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4150,17 +4114,17 @@ msgstr "&Datei" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "&Speichern" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "&Exportieren..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "Auswahl exportieren..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4262,13 +4226,13 @@ msgstr "Möchten Sie wirklich ein neues Projekt beginnen? Damit werden das Druck #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Cura wird geschlossen" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "Möchten Sie Cura wirklich beenden?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4450,7 +4414,7 @@ msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "Für diese Materialkombination Kleber verwenden" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4790,12 +4754,12 @@ msgstr "Upgrade von Version 2.7 auf 3.0" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Aktualisiert Konfigurationen von Cura 3.4 auf Cura 3.5." #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "Upgrade von Version 3.4 auf 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" diff --git a/resources/i18n/de_DE/fdmprinter.def.json.po b/resources/i18n/de_DE/fdmprinter.def.json.po index a4e3ac334f..693d27fb84 100644 --- a/resources/i18n/de_DE/fdmprinter.def.json.po +++ b/resources/i18n/de_DE/fdmprinter.def.json.po @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "" -"G-Code-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n" -"." +msgstr "G-Code-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "" -"G-Code-Befehle, die am Ende ausgeführt werden sollen – getrennt durch \n" -"." +msgstr "G-Code-Befehle, die am Ende ausgeführt werden sollen – getrennt durch \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -1072,12 +1068,12 @@ msgstr "Zickzack" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "Polygone oben/unten verbinden" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "Außenhaut-Pfade oben/unten verbinden, wenn sie nebeneinander laufen. Bei konzentrischen Mustern reduziert die Aktivierung dieser Einstellung die Durchlaufzeit erheblich. Da die Verbindungen jedoch auf halbem Weg über der Füllung erfolgen können, kann diese Funktion die Oberflächenqualität reduzieren." #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1162,22 +1158,22 @@ msgstr "Der Fluss für Teile einer Innenwand wird ausgeglichen, die dort gedruck #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "Mindestwandfluss" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "Minimal zulässiger Fluss als Prozentwert für eine Wandlinie. Die Wand-Überlappungskompensation reduziert den Fluss einer Wand, wenn sie nah an einer vorhandenen Wand liegt. Wände, deren Fluss unter diesem Wert liegt, werden durch eine Fahrbewegung ersetzt. Bei Verwendung dieser Einstellung müssen Sie die Wand-Überlappungskompensation aktivieren und die Außenwand vor den Innenwänden drucken." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "Einziehen bevorzugt" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "Bei Aktivierung wird der Einzug anstelle des Combings für zurückzulegende Wege verwendet, die Wände ersetzen, deren Fluss unter der mindestens erforderlichen Flussschwelle liegt." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1572,12 +1568,12 @@ msgstr "Verbindet die Enden, an denen das Füllmuster auf die Innenwand trifft, #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "Füllungspolygone verbinden" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "Verbinden Sie Füllungspfade, wenn sie nebeneinander laufen. Bei Füllungsmustern, die aus mehreren geschlossenen Polygonen bestehen, reduziert die Aktivierung dieser Einstellung die Durchlaufzeit erheblich." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1612,24 +1608,24 @@ msgstr "Das Füllmuster wird um diese Distanz entlang der Y-Achse verschoben." #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "Fülllinie multiplizieren" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "Konvertieren Sie jede Fülllinie in diese mehrfachen Linien. Die zusätzlichen Linien überschneiden sich nicht, sondern vermeiden sich vielmehr. Damit wird die Füllung steifer, allerdings erhöhen sich Druckzeit und Materialverbrauch." #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "Zusätzliche Füllung Wandlinien" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "" +msgstr "Fügen Sie zusätzliche Wände um den Füllbereich hinzu. Derartige Wände können zu einem verringerten Absacken der oberen/unteren Außenhautlinien beitragen, was bedeutet, dass Sie weniger Außenhautschichten oben/unten bei derselben Qualität von Kosten für zusätzliches Material benötigen.\n Diese Funktion ist verknüpfbar mit „Füllungspolygone verbinden“, um alle Füllungen mit einem einzigen Extrusionspfad zu verbinden, ohne dass hierzu Vorwärtsbewegungen oder Rückzüge erforderlich sind, sofern die richtige Konfiguration gewählt wurde." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2779,7 +2775,7 @@ msgstr "Combing-Modus" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "Durch Combing bleibt die Düse während der Bewegung innerhalb von bereits gedruckten Bereichen. Dies führt zu einer leicht verlängerten Bewegungszeit, reduziert jedoch die Notwendigkeit von Einzügen. Wenn Combing deaktiviert ist, wird das Material eingezogen und die Düse bewegt sich in einer geraden Linie zum nächsten Punkt. Es ist außerdem möglich, das Combing über die oberen/unteren Außenhautbereiche zu vermeiden, indem nur die Füllung berücksichtigt wird. Die Option „Innerhalb der Füllung“ verhält sich genauso wie die Option „Nicht in Außenhaut“ in früheren Cura Versionen." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2799,7 +2795,7 @@ msgstr "Nicht in Außenhaut" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "Innerhalb der Füllung" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3244,22 +3240,22 @@ msgstr "Der Abstand zwischen den gedruckten Stützstrukturlinien. Diese Einstell #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "Linienabstand der ursprünglichen Stützstruktur" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "Der Abstand zwischen der ursprünglichen gedruckten Stützstrukturlinien. Diese Einstellung wird anhand der Dichte der Stützstruktur berechnet." #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "Unterstützung Linienrichtung Füllung" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "Ausrichtung des Füllmusters für Unterstützung. Das Füllmuster für Unterstützung wird in der horizontalen Planfläche gedreht." #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3629,22 +3625,22 @@ msgstr "Zickzack" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "Lüfterdrehzahl überschreiben" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "Bei Aktivierung wird die Lüfterdrehzahl für die Druckkühlung für die Außenhautbereiche direkt über der Stützstruktur geändert." #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "Unterstützte Lüfterdrehzahl für Außenhaut" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "Prozentwert der Lüfterdrehzahl für die Verwendung beim Drucken der Außenhautbereiche direkt oberhalb der Stützstruktur. Die Verwendung einer hohen Lüfterdrehzahl ermöglicht ein leichteres Entfernen der Stützstruktur." #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3796,9 +3792,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" -"Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\n" -"Es handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden mehrere Skirt-Linien in äußerer Richtung angebracht." +msgstr "Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\nEs handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden mehrere Skirt-Linien in äußerer Richtung angebracht." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3973,7 +3967,7 @@ msgstr "Die Breite der Linien in der Raft-Basisschicht. Dabei sollte es sich um #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "Linienabstand der Raft-Basis" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4718,12 +4712,12 @@ msgstr "Der Materialfluss (in mm3 pro Sekunde) in Bezug zur Temperatur (Grad Cel #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "Mindestumfang Polygon" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "Polygone in geschnittenen Schichten, die einen Umfang unter diesem Wert haben, werden ausgefiltert. Niedrigere Werte führen zu einem Mesh mit höherer Auflösung zulasten der Slicing-Zeit. Dies gilt in erster Linie für SLA-Drucker mit höherer Auflösung und sehr kleine 3D-Modelle mit zahlreichen Details." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5235,9 +5229,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\n" -"Dies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur." +msgstr "Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\nDies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5387,22 +5379,22 @@ msgstr "Das ist der Schwellenwert, der definiert, ob eine kleinere Schicht verwe #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "Winkel für überhängende Wände" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "Wände, die über diesen Winkel hinaus hängen, werden mithilfe der Einstellungen für Winkel für überhängende Wände gedruckt. Wenn der Wert 90 beträgt, werden keine Wände als überhängend behandelt." #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "Geschwindigkeit für überhängende Wände" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "Überhängende Wände werden zu diesem Prozentwert ihrer normalen Druckgeschwindigkeit gedruckt." #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index 57b0ecf879..7a2e602c73 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -43,13 +43,13 @@ msgstr "Archivo GCode" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "GCodeWriter no es compatible con el modo sin texto." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "Genere un G-code antes de guardar." #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -64,11 +64,7 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "" -"

Es posible que uno o más modelos 3D no se impriman correctamente debido al tamaño del modelo y la configuración del material:

\n" -"

{model_names}

\n" -"

Obtenga más información sobre cómo garantizar la mejor calidad y fiabilidad de impresión posible.

\n" -"

Ver guía de impresión de calidad

" +msgstr "

Es posible que uno o más modelos 3D no se impriman correctamente debido al tamaño del modelo y la configuración del material:

\n

{model_names}

\n

Obtenga más información sobre cómo garantizar la mejor calidad y fiabilidad de impresión posible.

\n

Ver guía de impresión de calidad

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -108,7 +104,7 @@ msgstr "Conectado mediante USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "Se está realizando una impresión con USB, si cierra Cura detendrá la impresión. ¿Desea continuar?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -135,7 +131,7 @@ msgstr "Archivo GCode comprimido" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "GCodeGzWriter no es compatible con el modo texto." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -632,7 +628,7 @@ msgstr "No se puede segmentar porque la torre auxiliar o la posición o posicion #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "No se puede segmentar porque hay objetos asociados al extrusor %s que está deshabilitado." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -688,12 +684,12 @@ msgstr "Tobera" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "El archivo del proyecto{0} contiene un tipo de máquina desconocida {1}. No se puede importar la máquina, en su lugar, se importarán los modelos." #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "Abrir archivo de proyecto" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -750,7 +746,7 @@ msgstr "Archivo 3MF del proyecto de Cura" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "Error al escribir el archivo 3MF." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1078,12 +1074,7 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "" -"

¡Vaya! Ultimaker Cura ha encontrado un error.

\n" -"

Hemos detectado un error irreversible durante el inicio, posiblemente como consecuencia de varios archivos de configuración erróneos. Le recomendamos que realice una copia de seguridad y que restablezca los ajustes.

\n" -"

Las copias de seguridad se encuentran en la carpeta de configuración.

\n" -"

Envíenos el informe de errores para que podamos solucionar el problema.

\n" -" " +msgstr "

¡Vaya! Ultimaker Cura ha encontrado un error.

\n

Hemos detectado un error irreversible durante el inicio, posiblemente como consecuencia de varios archivos de configuración erróneos. Le recomendamos que realice una copia de seguridad y que restablezca los ajustes.

\n

Las copias de seguridad se encuentran en la carpeta de configuración.

\n

Envíenos el informe de errores para que podamos solucionar el problema.

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1116,10 +1107,7 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "" -"

Se ha producido un error grave en Cura. Envíenos este informe de errores para que podamos solucionar el problema.

\n" -"

Utilice el botón \"Enviar informe\" para publicar automáticamente el informe de errores en nuestros servidores.

\n" -" " +msgstr "

Se ha producido un error grave en Cura. Envíenos este informe de errores para que podamos solucionar el problema.

\n

Utilice el botón \"Enviar informe\" para publicar automáticamente el informe de errores en nuestros servidores.

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1466,7 +1454,7 @@ msgstr "Autor" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "Descargas" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1506,27 +1494,27 @@ msgstr "Atrás" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "Confirmar desinstalación " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "Va a desinstalar materiales o perfiles que todavía están en uso. Si confirma la desinstalación, los siguientes materiales o perfiles volverán a sus valores predeterminados." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "Materiales" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "Perfiles" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "Confirmar" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1541,17 +1529,17 @@ msgstr "Salir de Cura" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "Contribuciones de la comunidad" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "Complementos de la comunidad" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "Materiales genéricos" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1584,10 +1572,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Este complemento incluye una licencia.\n" -"Debe aceptar dicha licencia para instalar el complemento.\n" -"¿Acepta las condiciones que aparecen a continuación?" +msgstr "Este complemento incluye una licencia.\nDebe aceptar dicha licencia para instalar el complemento.\n¿Acepta las condiciones que aparecen a continuación?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1617,12 +1602,12 @@ msgstr "Buscando paquetes..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "Sitio web" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "Correo electrónico" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1707,10 +1692,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n" -"\n" -"Seleccione la impresora de la siguiente lista:" +msgstr "Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n\nSeleccione la impresora de la siguiente lista:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1759,12 +1741,12 @@ msgstr "Dirección" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "Esta impresora no está configurada para alojar un grupo de impresoras." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "Esta impresora aloja un grupo de %1 impresoras." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1812,52 +1794,52 @@ msgstr "Imprimir" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "Esperando: impresora no disponible" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "Esperando: primera disponible" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "Esperando: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "mover al principio" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "Mover trabajo de impresión al principio" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "¿Seguro que desea mover %1 al principio de la cola?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "Borrar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "Borrar trabajo de impresión" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "¿Seguro que desea borrar %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "Administrar cola" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1872,40 +1854,40 @@ msgstr "Imprimiendo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "Administrar impresoras" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "No disponible" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "No se puede conectar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "Disponible" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "Reanudar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "Pausar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "Cancelar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 @@ -1916,13 +1898,13 @@ msgstr "Cancela la impresión" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "¿Seguro que desea cancelar %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "Cancelado" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1937,7 +1919,7 @@ msgstr "Preparando" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "Pausando" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2355,7 +2337,7 @@ msgstr "Abrir" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "Anterior" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2367,12 +2349,12 @@ msgstr "Exportar" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "Siguiente" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "Consejo" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2421,12 +2403,12 @@ msgstr "%1 m/~ %2 g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "Ensayo de impresión" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "Lista de verificación" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2649,7 +2631,7 @@ msgstr "Retire la impresión." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "Cancelar impresión" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -2666,9 +2648,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Ha personalizado parte de los ajustes del perfil.\n" -"¿Desea descartar los cambios o guardarlos?" +msgstr "Ha personalizado parte de los ajustes del perfil.\n¿Desea descartar los cambios o guardarlos?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3112,7 +3092,7 @@ msgstr "Comportamiento predeterminado al abrir un archivo del proyecto: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "Preguntar siempre" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3132,22 +3112,22 @@ msgstr "Si ha realizado cambios en un perfil y, a continuación, ha cambiado a o #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "Perfiles" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "Comportamiento predeterminado para los valores modificados al cambiar a otro perfil: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "Descartar siempre los ajustes modificados" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "Transferir siempre los ajustes modificados al nuevo perfil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3342,7 +3322,7 @@ msgstr "Agregar impresora" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "Sin título" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3364,9 +3344,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\n" -"Cura se enorgullece de utilizar los siguientes proyectos de código abierto:" +msgstr "Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\nCura se enorgullece de utilizar los siguientes proyectos de código abierto:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3479,10 +3457,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n" -"\n" -"Haga clic para abrir el administrador de perfiles." +msgstr "Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n\nHaga clic para abrir el administrador de perfiles." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3536,10 +3511,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n" -"\n" -"Haga clic para mostrar estos ajustes." +msgstr "Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n\nHaga clic para mostrar estos ajustes." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3567,10 +3539,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Este ajuste tiene un valor distinto del perfil.\n" -"\n" -"Haga clic para restaurar el valor del perfil." +msgstr "Este ajuste tiene un valor distinto del perfil.\n\nHaga clic para restaurar el valor del perfil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3578,10 +3547,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n" -"\n" -"Haga clic para restaurar el valor calculado." +msgstr "Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n\nHaga clic para restaurar el valor calculado." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3700,17 +3666,17 @@ msgstr "Caliente la plataforma antes de imprimir. Puede continuar ajustando la i #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "Favoritos" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "Genérico" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3806,9 +3772,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Ajustes de impresión deshabilitados\n" -"No se pueden modificar los archivos GCode" +msgstr "Ajustes de impresión deshabilitados\nNo se pueden modificar los archivos GCode" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4150,17 +4114,17 @@ msgstr "&Archivo" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "&Guardar..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "&Exportar..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "Exportar selección..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4262,13 +4226,13 @@ msgstr "¿Está seguro de que desea iniciar un nuevo proyecto? Esto borrará la #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Cerrando Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "¿Seguro que desea salir de Cura?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4450,7 +4414,7 @@ msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "Utilizar pegamento con esta combinación de materiales" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4790,12 +4754,12 @@ msgstr "Actualización de la versión 2.7 a la 3.0" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Actualiza las configuraciones de Cura 3.4 a Cura 3.5." #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "Actualización de la versión 3.4 a la 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" diff --git a/resources/i18n/es_ES/fdmprinter.def.json.po b/resources/i18n/es_ES/fdmprinter.def.json.po index 62d8d4a158..6cfbabcf13 100644 --- a/resources/i18n/es_ES/fdmprinter.def.json.po +++ b/resources/i18n/es_ES/fdmprinter.def.json.po @@ -57,9 +57,7 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "" -"Los comandos de GCode que se ejecutarán justo al inicio separados por - \n" -"." +msgstr "Los comandos de GCode que se ejecutarán justo al inicio separados por - \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -71,9 +69,7 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "" -"Los comandos de GCode que se ejecutarán justo al final separados por -\n" -"." +msgstr "Los comandos de GCode que se ejecutarán justo al final separados por -\n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -1073,12 +1069,12 @@ msgstr "Zigzag" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "Conectar polígonos superiores/inferiores" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "Conectar las trayectorias de forro superior/inferior cuando están próximas entre sí. Al habilitar este ajuste, en el patrón concéntrico se reduce considerablemente el tiempo de desplazamiento, pero las conexiones pueden producirse en mitad del relleno, con lo que la bajaría la calidad de la superficie superior." #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1163,22 +1159,22 @@ msgstr "Compensa el flujo en partes de una pared interior que se están imprimie #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "Flujo de pared mínimo" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "Porcentaje mínimo de flujo permitido en una línea de pared. La compensación de superposición reduce el flujo de pared cuando se coloca cerca de otra pared. Las paredes con flujos inferiores a este valor se sustituirán con un movimiento de desplazamiento. Al utilizar este ajuste debe habilitar la compensación de superposición de pared e imprimir la pared exterior antes que las interiores." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "Preferencia de retracción" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "Si se habilita esta opción, se utilizará retracción en lugar de peinada para los movimientos de desplazamiento que sustituyen las paredes cuyo flujo está por debajo de los límites mínimos de flujo." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1573,12 +1569,12 @@ msgstr "Conectar los extremos donde los patrones de relleno se juntan con la par #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "Conectar polígonos de relleno" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "Conectar las trayectorias de polígonos cuando están próximas entre sí. Habilitar esta opción reduce considerablemente el tiempo de desplazamiento en los patrones de relleno que constan de varios polígonos cerrados." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1613,24 +1609,24 @@ msgstr "El patrón de relleno se mueve esta distancia a lo largo del eje Y." #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "Multiplicador de línea de relleno" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "Multiplicar cada línea de relleno. Las líneas adicionales no se cruzan entre sí, sino que se evitan entre ellas. Esto consigue un relleno más rígido, pero incrementa el tiempo de impresión y el uso de material." #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "Recuento de líneas de pared adicional" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "" +msgstr "Agregar paredes adicionales alrededor del área de relleno. Estas paredes pueden hacer que las líneas del forro superior/inferior se aflojen menos, lo que significa que necesitaría menos capas de forro superior/inferior para obtener la misma calidad utilizando algo más de material.\nPuede utilizar esta función junto a la de Conectar polígonos de relleno para conectar todo el relleno en una única trayectoria de extrusión sin necesidad de desplazamientos ni retracciones si se configura correctamente." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2780,7 +2776,7 @@ msgstr "Modo Peinada" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "La opción de peinada mantiene la tobera dentro de las áreas ya impresas al desplazarse. Esto ocasiona movimientos de desplazamiento ligeramente más largos, pero reduce la necesidad de realizar retracciones. Si se desactiva la opción de peinada, el material se retraerá y la tobera se moverá en línea recta hasta el siguiente punto. Otra posibilidad es evitar la peinada en áreas de forro superiores/inferiores y además peinar solo en el relleno. La opción de «Sobre el relleno» actúa exactamente igual que la «No está en el forro» de las versiones de Cura anteriores." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2800,7 +2796,7 @@ msgstr "No en el forro" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "Sobre el relleno" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3245,22 +3241,22 @@ msgstr "Distancia entre las líneas de estructuras del soporte impresas. Este aj #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "Distancia de línea del soporte de la capa inicial" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "Distancia entre las líneas de estructuras del soporte de la capa inicial impresas. Este ajuste se calcula por la densidad del soporte." #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "Dirección de línea de relleno de soporte" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "Orientación del patrón de relleno para soportes. El patrón de relleno de soporte se gira en el plano horizontal." #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3630,22 +3626,22 @@ msgstr "Zigzag" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "Alteración de velocidad del ventilador" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "Al habilitar esta opción, la velocidad del ventilador de enfriamiento de impresión cambia para las áreas de forro que se encuentran inmediatamente encima del soporte." #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "Velocidad del ventilador para forro con soporte" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "Porcentaje para la velocidad de ventilador que se utiliza al imprimir las áreas del forro que se encuentran inmediatamente encima del soporte. Si utiliza una velocidad alta para el ventilador, será más fácil retirar el soporte." #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3797,9 +3793,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" -"La distancia horizontal entre la falda y la primera capa de la impresión.\n" -"Se trata de la distancia mínima. Múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia." +msgstr "La distancia horizontal entre la falda y la primera capa de la impresión.\nSe trata de la distancia mínima. Múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3974,7 +3968,7 @@ msgstr "Ancho de las líneas de la capa base de la balsa. Estas deben ser línea #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "Espacio de la línea base de la balsa" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4719,12 +4713,12 @@ msgstr "Datos que vinculan el flujo de materiales (en 3 mm por segundo) a la tem #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "Circunferencia mínima de polígono" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "Se filtran los polígonos en capas segmentadas que tienen una circunferencia más pequeña que esta. Los valores más pequeños suponen una resolución de malla mayor a costa de un tiempo de segmentación. Está indicado, sobre todo, para impresoras SLA y modelos 3D muy pequeños con muchos detalles." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5236,9 +5230,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"Distancia de un movimiento ascendente que se extrude a media velocidad.\n" -"Esto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre." +msgstr "Distancia de un movimiento ascendente que se extrude a media velocidad.\nEsto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5388,22 +5380,22 @@ msgstr "Umbral para usar o no una capa más pequeña. Este número se compara co #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "Ángulo de voladizo de pared" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "Las paredes con un ángulo de voladizo mayor que este se imprimirán con los ajustes de voladizo de pared. Cuando el valor sea 90, no se aplicará la condición de voladizo a la pared." #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "Velocidad de voladizo de pared" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "Los voladizos de pared se imprimirán a este porcentaje de su velocidad de impresión normal." #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index 2a075f7c31..3a92054283 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -43,13 +43,13 @@ msgstr "Fichier GCode" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "GCodeWriter ne prend pas en charge le mode non-texte." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "Veuillez générer le G-Code avant d'enregistrer." #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -64,11 +64,7 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "" -"

Un ou plusieurs modèles 3D peuvent ne pas s'imprimer de manière optimale en raison de la taille du modèle et de la configuration matérielle :

\n" -"

{model_names}

\n" -"

Découvrez comment optimiser la qualité et la fiabilité de l'impression.

\n" -"

Consultez le guide de qualité d'impression

" +msgstr "

Un ou plusieurs modèles 3D peuvent ne pas s'imprimer de manière optimale en raison de la taille du modèle et de la configuration matérielle :

\n

{model_names}

\n

Découvrez comment optimiser la qualité et la fiabilité de l'impression.

\n

Consultez le guide de qualité d'impression

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -108,7 +104,7 @@ msgstr "Connecté via USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "Une impression USB est en cours, la fermeture de Cura arrêtera cette impression. Êtes-vous sûr ?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -135,7 +131,7 @@ msgstr "Fichier G-Code compressé" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "GCodeGzWriter ne prend pas en charge le mode texte." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -632,7 +628,7 @@ msgstr "Impossible de couper car la tour primaire ou la (les) position(s) d'amor #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "Impossible de couper car il existe des objets associés à l'extrudeuse désactivée %s." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -688,12 +684,12 @@ msgstr "Buse" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "Le fichier projet {0} contient un type de machine inconnu {1}. Impossible d'importer la machine. Les modèles seront importés à la place." #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "Ouvrir un fichier de projet" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -750,7 +746,7 @@ msgstr "Projet Cura fichier 3MF" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "Erreur d'écriture du fichier 3MF." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1078,12 +1074,7 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "" -"

Oups, un problème est survenu dans Ultimaker Cura.

\n" -"

Une erreur irrécupérable est survenue lors du démarrage. Elle peut avoir été causée par des fichiers de configuration incorrects. Nous vous suggérons de sauvegarder et de réinitialiser votre configuration.

\n" -"

Les sauvegardes se trouvent dans le dossier de configuration.

\n" -"

Veuillez nous envoyer ce rapport d'incident pour que nous puissions résoudre le problème.

\n" -" " +msgstr "

Oups, un problème est survenu dans Ultimaker Cura.

\n

Une erreur irrécupérable est survenue lors du démarrage. Elle peut avoir été causée par des fichiers de configuration incorrects. Nous vous suggérons de sauvegarder et de réinitialiser votre configuration.

\n

Les sauvegardes se trouvent dans le dossier de configuration.

\n

Veuillez nous envoyer ce rapport d'incident pour que nous puissions résoudre le problème.

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1116,10 +1107,7 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "" -"

Une erreur fatale est survenue dans Cura. Veuillez nous envoyer ce rapport d'incident pour résoudre le problème

\n" -"

Veuillez utiliser le bouton « Envoyer rapport » pour publier automatiquement un rapport d'erreur sur nos serveurs

\n" -" " +msgstr "

Une erreur fatale est survenue dans Cura. Veuillez nous envoyer ce rapport d'incident pour résoudre le problème

\n

Veuillez utiliser le bouton « Envoyer rapport » pour publier automatiquement un rapport d'erreur sur nos serveurs

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1466,7 +1454,7 @@ msgstr "Auteur" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "Téléchargements" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1506,27 +1494,27 @@ msgstr "Précédent" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "Confirmer la désinstallation " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "Vous désinstallez des matériaux et/ou des profils qui sont encore en cours d'utilisation. La confirmation réinitialisera les matériaux / profils suivants à leurs valeurs par défaut." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "Matériaux" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "Profils" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "Confirmer" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1541,17 +1529,17 @@ msgstr "Quitter Cura" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "Contributions de la communauté" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "Plug-ins de la communauté" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "Matériaux génériques" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1584,10 +1572,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Ce plug-in contient une licence.\n" -"Vous devez approuver cette licence pour installer ce plug-in.\n" -"Acceptez-vous les clauses ci-dessous ?" +msgstr "Ce plug-in contient une licence.\nVous devez approuver cette licence pour installer ce plug-in.\nAcceptez-vous les clauses ci-dessous ?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1617,12 +1602,12 @@ msgstr "Récupération des paquets..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "Site Internet" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "E-mail" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1707,10 +1692,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n" -"\n" -"Sélectionnez votre imprimante dans la liste ci-dessous :" +msgstr "Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n\nSélectionnez votre imprimante dans la liste ci-dessous :" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1759,12 +1741,12 @@ msgstr "Adresse" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "Cette imprimante n'est pas configurée pour héberger un groupe d'imprimantes." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "Cette imprimante est l'hôte d'un groupe d'imprimantes %1." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1812,52 +1794,52 @@ msgstr "Imprimer" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "En attente : imprimante non disponible" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "En attente : première imprimante disponible" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "En attente : " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "Déplacer l'impression en haut" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "Déplacer l'impression en haut de la file d'attente" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "Êtes-vous sûr de vouloir déplacer %1 en haut de la file d'attente ?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "Effacer" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "Supprimer l'impression" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "Êtes-vous sûr de vouloir supprimer %1 ?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "Gérer la file d'attente" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1872,40 +1854,40 @@ msgstr "Impression..." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "Gérer les imprimantes" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "Non disponible" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "Injoignable" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "Disponible" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "Reprendre" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "Pause" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "Abandonner" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 @@ -1916,13 +1898,13 @@ msgstr "Abandonner l'impression" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "Êtes-vous sûr de vouloir annuler %1 ?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "Abandonné" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1937,7 +1919,7 @@ msgstr "Préparation..." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "Mise en pause" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2355,7 +2337,7 @@ msgstr "Ouvrir" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "Précédent" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2367,12 +2349,12 @@ msgstr "Exporter" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "Suivant" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "Astuce" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2421,12 +2403,12 @@ msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "Test d'impression" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "Liste de contrôle" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2649,7 +2631,7 @@ msgstr "Supprimez l'imprimante" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "Abandonner l'impression" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -2666,9 +2648,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Vous avez personnalisé certains paramètres du profil.\n" -"Souhaitez-vous conserver ces changements, ou les annuler ?" +msgstr "Vous avez personnalisé certains paramètres du profil.\nSouhaitez-vous conserver ces changements, ou les annuler ?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3112,7 +3092,7 @@ msgstr "Comportement par défaut lors de l'ouverture d'un fichier de projet : " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "Toujours me demander" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3132,22 +3112,22 @@ msgstr "Lorsque vous apportez des modifications à un profil puis passez à un a #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "Profils" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "Comportement par défaut pour les valeurs de paramètres modifiées lors du passage à un profil différent : " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "Toujours rejeter les paramètres modifiés" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "Toujours transférer les paramètres modifiés dans le nouveau profil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3342,7 +3322,7 @@ msgstr "Ajouter une imprimante" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "Sans titre" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3364,9 +3344,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\n" -"Cura est fier d'utiliser les projets open source suivants :" +msgstr "Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\nCura est fier d'utiliser les projets open source suivants :" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3479,10 +3457,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n" -"\n" -"Cliquez pour ouvrir le gestionnaire de profils." +msgstr "Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n\nCliquez pour ouvrir le gestionnaire de profils." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3536,10 +3511,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n" -"\n" -"Cliquez pour rendre ces paramètres visibles." +msgstr "Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n\nCliquez pour rendre ces paramètres visibles." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3567,10 +3539,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Ce paramètre possède une valeur qui est différente du profil.\n" -"\n" -"Cliquez pour restaurer la valeur du profil." +msgstr "Ce paramètre possède une valeur qui est différente du profil.\n\nCliquez pour restaurer la valeur du profil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3578,10 +3547,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n" -"\n" -"Cliquez pour restaurer la valeur calculée." +msgstr "Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n\nCliquez pour restaurer la valeur calculée." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3700,17 +3666,17 @@ msgstr "Préchauffez le plateau avant l'impression. Vous pouvez continuer à aju #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "Matériau" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "Favoris" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "Générique" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3806,9 +3772,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Configuration de l'impression désactivée\n" -"Les fichiers G-Code ne peuvent pas être modifiés" +msgstr "Configuration de l'impression désactivée\nLes fichiers G-Code ne peuvent pas être modifiés" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4150,17 +4114,17 @@ msgstr "&Fichier" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "&Enregistrer..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "&Exporter..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "Exporter la sélection..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4207,7 +4171,7 @@ msgstr "Désactiver l'extrudeuse" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 msgctxt "@title:menu" msgid "&Build plate" -msgstr "Plateau" +msgstr "&Plateau" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:236 msgctxt "@title:settings" @@ -4262,13 +4226,13 @@ msgstr "Êtes-vous sûr(e) de souhaiter lancer un nouveau projet ? Cela supprim #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Fermeture de Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "Êtes-vous sûr de vouloir quitter Cura ?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4450,7 +4414,7 @@ msgstr "Matériau" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "Utiliser de la colle avec cette combinaison de matériaux" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4790,12 +4754,12 @@ msgstr "Mise à niveau de version, de 2.7 vers 3.0" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Configurations des mises à niveau de Cura 3.4 vers Cura 3.5." #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "Mise à niveau de 3.4 vers 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" diff --git a/resources/i18n/fr_FR/fdmprinter.def.json.po b/resources/i18n/fr_FR/fdmprinter.def.json.po index acf2f8d378..a411605fc2 100644 --- a/resources/i18n/fr_FR/fdmprinter.def.json.po +++ b/resources/i18n/fr_FR/fdmprinter.def.json.po @@ -57,9 +57,7 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "" -"Commandes G-Code à exécuter au tout début, séparées par \n" -"." +msgstr "Commandes G-Code à exécuter au tout début, séparées par \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -71,9 +69,7 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "" -"Commandes G-Code à exécuter tout à la fin, séparées par \n" -"." +msgstr "Commandes G-Code à exécuter tout à la fin, séparées par \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -1073,12 +1069,12 @@ msgstr "Zig Zag" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "Relier les polygones supérieurs / inférieurs" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "Relier les voies de couche extérieure supérieures / inférieures lorsqu'elles sont côte à côte. Pour le motif concentrique, ce paramètre réduit considérablement le temps de parcours, mais comme les liens peuvent se trouver à mi-chemin sur le remplissage, cette fonctionnalité peut réduire la qualité de la surface supérieure." #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1163,22 +1159,22 @@ msgstr "Compenser le débit pour les parties d'une paroi intérieure imprimées #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "Débit minimal de la paroi" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "Pourcentage de débit minimum autorisé pour une ligne de paroi. La compensation de chevauchement de paroi réduit le débit d'une paroi lorsqu'elle se trouve à proximité d'une paroi existante. Les parois dont le débit est inférieur à cette valeur seront remplacées par un déplacement. Lors de l'utilisation de ce paramètre, vous devez activer la compensation de chevauchement de paroi et imprimer la paroi externe avant les parois internes." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "Préférer la rétractation" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "Si cette option est activée, la rétraction est utilisée à la place des détours pour les déplacements qui remplacent les parois dont le débit est inférieur au seuil de débit minimal." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1573,12 +1569,12 @@ msgstr "Relie les extrémités où le motif de remplissage touche la paroi inter #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "Relier les polygones de remplissage" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "Relier les voies de remplissage lorsqu'elles sont côte à côte. Pour les motifs de remplissage composés de plusieurs polygones fermés, ce paramètre permet de réduire considérablement le temps de parcours." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1613,24 +1609,24 @@ msgstr "Le motif de remplissage est décalé de cette distance sur l'axe Y." #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "Multiplicateur de ligne de remplissage" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "Convertir chaque ligne de remplissage en ce nombre de lignes. Les lignes supplémentaires ne se croisent pas entre elles, mais s'évitent mutuellement. Cela rend le remplissage plus rigide, mais augmente le temps d'impression et la quantité de matériau utilisé." #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "Nombre de parois de remplissage supplémentaire" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "" +msgstr "Ajoutez des parois supplémentaires autour de la zone de remplissage. De telles parois peuvent réduire l'affaissement des lignes de couche extérieure supérieure / inférieure, réduisant le nombre de couches extérieures supérieures / inférieures nécessaires pour obtenir la même qualité, au prix d'un peu de matériau supplémentaire.\nConfigurée correctement, cette fonctionnalité peut être combinée avec « Relier les polygones de remplissage » pour relier tous les remplissages en un seul mouvement d'extrusion sans avoir besoin de déplacements ou de rétractions." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2780,7 +2776,7 @@ msgstr "Mode de détours" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "Les détours maintiennent la buse dans les zones déjà imprimées lors des déplacements. Cela résulte en des déplacements légèrement plus longs mais réduit le recours aux rétractions. Si les détours sont désactivés, le matériau se rétractera et la buse se déplacera en ligne droite jusqu'au point suivant. Il est également possible d'éviter les détours sur les zones de la couche extérieure supérieure / inférieure et aussi de n'effectuer les détours que dans le remplissage. Notez que l'option « À l'intérieur du remplissage » se comporte exactement comme l'option « Pas dans la couche extérieure » dans les versions précédentes de Cura." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2800,7 +2796,7 @@ msgstr "Pas dans la couche extérieure" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "À l'intérieur du remplissage" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3245,22 +3241,22 @@ msgstr "Distance entre les lignes de support imprimées. Ce paramètre est calcu #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "Distance d'écartement de ligne du support de la couche initiale" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "Distance entre les lignes de la structure de support de la couche initiale imprimée. Ce paramètre est calculé en fonction de la densité du support." #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "Direction de ligne de remplissage du support" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "Orientation du motif de remplissage pour les supports. Le motif de remplissage du support pivote dans le plan horizontal." #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3630,22 +3626,22 @@ msgstr "Zig Zag" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "Annulation de la vitesse du ventilateur" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "Lorsque cette fonction est activée, la vitesse du ventilateur de refroidissement de l'impression est modifiée pour les régions de la couche extérieure situées immédiatement au-dessus du support." #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "Vitesse du ventilateur de couche extérieure supportée" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "Pourcentage de la vitesse du ventilateur à utiliser lors de l'impression des zones de couche extérieure situées immédiatement au-dessus du support. Une vitesse de ventilateur élevée facilite le retrait du support." #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3797,9 +3793,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" -"La distance horizontale entre la jupe et la première couche de l’impression.\n" -"Il s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur." +msgstr "La distance horizontale entre la jupe et la première couche de l’impression.\nIl s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3974,7 +3968,7 @@ msgstr "Largeur des lignes de la couche de base du radeau. Elles doivent être #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "Espacement des lignes de base du radeau" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4719,12 +4713,12 @@ msgstr "Données reliant le flux de matériau (en mm3 par seconde) à la tempér #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "Circonférence minimale du polygone" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "Les polygones en couches tranchées dont la circonférence est inférieure à cette valeur seront filtrés. Des valeurs élevées permettent d'obtenir un maillage de meilleure résolution mais augmentent le temps de découpe. Cette option est principalement destinée aux imprimantes SLA haute résolution et aux modèles 3D de très petite taille avec beaucoup de détails." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5236,9 +5230,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\n" -"Cela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire." +msgstr "Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\nCela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5388,22 +5380,22 @@ msgstr "Limite indiquant d'utiliser ou non une couche plus petite. Ce nombre est #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "Angle de parois en porte-à-faux" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "Les parois ayant un angle supérieur à cette valeur seront imprimées en utilisant les paramètres de parois en porte-à-faux. Si la valeur est 90, aucune paroi ne sera considérée comme étant en porte-à-faux." #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "Vitesse de paroi en porte-à-faux" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "Les parois en porte-à-faux seront imprimées à ce pourcentage de leur vitesse d'impression normale." #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po index fa0a1b7b71..07ea3e8580 100644 --- a/resources/i18n/it_IT/cura.po +++ b/resources/i18n/it_IT/cura.po @@ -41,13 +41,13 @@ msgstr "File G-Code" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "GCodeWriter non supporta la modalità non di testo." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "Generare il codice G prima di salvare." #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -62,11 +62,7 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "" -"

La stampa di uno o più modelli 3D può non avvenire in modo ottimale a causa della dimensioni modello e della configurazione materiale:

\n" -"

{model_names}

\n" -"

Scopri come garantire la migliore qualità ed affidabilità di stampa.

\n" -"

Visualizza la guida alla qualità di stampa

" +msgstr "

La stampa di uno o più modelli 3D può non avvenire in modo ottimale a causa della dimensioni modello e della configurazione materiale:

\n

{model_names}

\n

Scopri come garantire la migliore qualità ed affidabilità di stampa.

\n

Visualizza la guida alla qualità di stampa

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -106,7 +102,7 @@ msgstr "Connesso tramite USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "Stampa tramite USB in corso, la chiusura di Cura interrompe la stampa. Confermare?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -133,7 +129,7 @@ msgstr "File G-Code compresso" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "GCodeGzWriter non supporta la modalità di testo." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -630,7 +626,7 @@ msgstr "Impossibile eseguire il sezionamento perché la torre di innesco o la po #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "Impossibile effettuare il sezionamento in quanto vi sono oggetti associati a Extruder %s disabilitato." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -686,12 +682,12 @@ msgstr "Ugello" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "Il file di progetto {0} contiene un tipo di macchina sconosciuto {1}. Impossibile importare la macchina. Verranno invece importati i modelli." #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "Apri file progetto" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -748,7 +744,7 @@ msgstr "File 3MF Progetto Cura" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "Errore scrittura file 3MF." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1076,12 +1072,7 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "" -"

Oops, Ultimaker Cura ha rilevato qualcosa che non sembra corretto.

\n" -"

Abbiamo riscontrato un errore irrecuperabile durante l’avvio. È stato probabilmente causato da alcuni file di configurazione errati. Suggeriamo di effettuare il backup e ripristinare la configurazione.

\n" -"

I backup sono contenuti nella cartella configurazione.

\n" -"

Si prega di inviare questo Rapporto su crash per correggere il problema.

\n" -" " +msgstr "

Oops, Ultimaker Cura ha rilevato qualcosa che non sembra corretto.

\n

Abbiamo riscontrato un errore irrecuperabile durante l’avvio. È stato probabilmente causato da alcuni file di configurazione errati. Suggeriamo di effettuare il backup e ripristinare la configurazione.

\n

I backup sono contenuti nella cartella configurazione.

\n

Si prega di inviare questo Rapporto su crash per correggere il problema.

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1114,10 +1105,7 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "" -"

Si è verificato un errore fatale in Cura. Si prega di inviare questo Rapporto su crash per correggere il problema

\n" -"

Usare il pulsante “Invia report\" per inviare automaticamente una segnalazione errore ai nostri server

\n" -" " +msgstr "

Si è verificato un errore fatale in Cura. Si prega di inviare questo Rapporto su crash per correggere il problema

\n

Usare il pulsante “Invia report\" per inviare automaticamente una segnalazione errore ai nostri server

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1464,7 +1452,7 @@ msgstr "Autore" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "Download" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1504,27 +1492,27 @@ msgstr "Indietro" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "Conferma disinstalla " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "Si stanno installando materiali e/o profili ancora in uso. La conferma ripristina i seguenti materiali/profili ai valori predefiniti." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "Materiali" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "Profili" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "Conferma" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1539,17 +1527,17 @@ msgstr "Esci da Cura" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "Contributi della comunità" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "Plugin della comunità" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "Materiali generici" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1582,10 +1570,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Questo plugin contiene una licenza.\n" -"È necessario accettare questa licenza per poter installare il plugin.\n" -"Accetti i termini sotto riportati?" +msgstr "Questo plugin contiene una licenza.\nÈ necessario accettare questa licenza per poter installare il plugin.\nAccetti i termini sotto riportati?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1615,12 +1600,12 @@ msgstr "Recupero dei pacchetti..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "Sito web" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "E-mail" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1705,10 +1690,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n" -"\n" -"Selezionare la stampante dall’elenco seguente:" +msgstr "Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n\nSelezionare la stampante dall’elenco seguente:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1757,12 +1739,12 @@ msgstr "Indirizzo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "Questa stampante non è predisposta per comandare un gruppo di stampanti." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "Questa stampante comanda un gruppo di %1 stampanti." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1810,52 +1792,52 @@ msgstr "Stampa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "In attesa: stampante non disponibile" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "In attesa della prima disponibile" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "In attesa: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "Sposta in alto" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "Sposta il processo di stampa in alto" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "Sei sicuro di voler spostare 1% all’inizio della coda?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "Cancella" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "Cancella processo di stampa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "Sei sicuro di voler cancellare %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "Gestione coda di stampa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1870,40 +1852,40 @@ msgstr "Stampa in corso" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "Gestione stampanti" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "Non disponibile" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "Non raggiungibile" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "Disponibile" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "Riprendi" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "Pausa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "Interrompi" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 @@ -1914,13 +1896,13 @@ msgstr "Interrompi la stampa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "Sei sicuro di voler interrompere %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "Interrotto" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1935,7 +1917,7 @@ msgstr "Preparazione in corso" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "Messa in pausa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2353,7 +2335,7 @@ msgstr "Apri" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "Precedente" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2365,12 +2347,12 @@ msgstr "Esporta" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "Avanti" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "Suggerimento" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2419,12 +2401,12 @@ msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "Prova di stampa" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "Lista di controllo" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2647,7 +2629,7 @@ msgstr "Rimuovere la stampa" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "Interrompi la stampa" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -2664,9 +2646,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Sono state personalizzate alcune impostazioni del profilo.\n" -"Mantenere o eliminare tali impostazioni?" +msgstr "Sono state personalizzate alcune impostazioni del profilo.\nMantenere o eliminare tali impostazioni?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3110,7 +3090,7 @@ msgstr "Comportamento predefinito all'apertura di un file progetto: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "Chiedi sempre" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3130,22 +3110,22 @@ msgstr "Dopo aver modificato un profilo ed essere passati a un altro, si apre un #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "Profili" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "Comportamento predefinito per i valori di impostazione modificati al passaggio a un profilo diverso: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "Elimina sempre le impostazioni modificate" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "Trasferisci sempre le impostazioni modificate a un nuovo profilo" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3340,7 +3320,7 @@ msgstr "Aggiungi stampante" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "Senza titolo" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3362,9 +3342,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura è stato sviluppato da Ultimaker B.V. in cooperazione con la comunità.\n" -"Cura è orgogliosa di utilizzare i seguenti progetti open source:" +msgstr "Cura è stato sviluppato da Ultimaker B.V. in cooperazione con la comunità.\nCura è orgogliosa di utilizzare i seguenti progetti open source:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3477,10 +3455,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Alcuni valori di impostazione/esclusione sono diversi dai valori memorizzati nel profilo.\n" -"\n" -"Fare clic per aprire la gestione profili." +msgstr "Alcuni valori di impostazione/esclusione sono diversi dai valori memorizzati nel profilo.\n\nFare clic per aprire la gestione profili." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3534,10 +3509,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Alcune impostazioni nascoste utilizzano valori diversi dal proprio valore normale calcolato.\n" -"\n" -"Fare clic per rendere visibili queste impostazioni." +msgstr "Alcune impostazioni nascoste utilizzano valori diversi dal proprio valore normale calcolato.\n\nFare clic per rendere visibili queste impostazioni." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3565,10 +3537,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Questa impostazione ha un valore diverso dal profilo.\n" -"\n" -"Fare clic per ripristinare il valore del profilo." +msgstr "Questa impostazione ha un valore diverso dal profilo.\n\nFare clic per ripristinare il valore del profilo." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3576,10 +3545,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Questa impostazione normalmente viene calcolata, ma attualmente ha impostato un valore assoluto.\n" -"\n" -"Fare clic per ripristinare il valore calcolato." +msgstr "Questa impostazione normalmente viene calcolata, ma attualmente ha impostato un valore assoluto.\n\nFare clic per ripristinare il valore calcolato." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3698,17 +3664,17 @@ msgstr "Riscalda il piano prima della stampa. È possibile continuare a regolare #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "Materiale" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "Preferiti" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "Generale" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3804,9 +3770,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Impostazione di stampa disabilitata\n" -"I file codice G non possono essere modificati" +msgstr "Impostazione di stampa disabilitata\nI file codice G non possono essere modificati" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4148,17 +4112,17 @@ msgstr "&File" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "&Salva..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "&Esporta..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "Esporta selezione..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4260,13 +4224,13 @@ msgstr "Sei sicuro di voler aprire un nuovo progetto? Questo cancellerà il pian #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Chiusura di Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "Sei sicuro di voler uscire da Cura?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4448,7 +4412,7 @@ msgstr "Materiale" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "Utilizzare la colla con questa combinazione di materiali" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4788,12 +4752,12 @@ msgstr "Aggiornamento della versione da 2.7 a 3.0" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Aggiorna le configurazioni da Cura 3.4 a Cura 3.5." #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "Aggiornamento della versione da 3.4 a 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" diff --git a/resources/i18n/it_IT/fdmprinter.def.json.po b/resources/i18n/it_IT/fdmprinter.def.json.po index f97eef75ba..2934b86a02 100644 --- a/resources/i18n/it_IT/fdmprinter.def.json.po +++ b/resources/i18n/it_IT/fdmprinter.def.json.po @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "" -"I comandi codice G da eseguire all’avvio, separati da \n" -"." +msgstr "I comandi codice G da eseguire all’avvio, separati da \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "" -"I comandi codice G da eseguire alla fine, separati da \n" -"." +msgstr "I comandi codice G da eseguire alla fine, separati da \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -1072,12 +1068,12 @@ msgstr "Zig Zag" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "Collega poligoni superiori/inferiori" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "Collega i percorsi del rivestimento esterno superiore/inferiore quando corrono uno accanto all’altro. Per le configurazioni concentriche, l’abilitazione di questa impostazione riduce notevolmente il tempo di spostamento, tuttavia poiché i collegamenti possono aver luogo a metà del riempimento, con questa funzione la qualità della superficie superiore potrebbe risultare inferiore." #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1162,22 +1158,22 @@ msgstr "Compensa il flusso per le parti di una parete interna che viene stampata #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "Flusso minimo della parete" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "Flusso percentuale minimo ammesso per una linea perimetrale. La compensazione di sovrapposizione pareti riduce il flusso di una parete quando si trova vicino a una parete esistente. Le pareti con un flusso inferiore a questo valore saranno sostituite da uno spostamento. Quando si utilizza questa impostazione, si deve abilitare la compensazione della sovrapposizione pareti e stampare la parete esterna prima delle pareti interne." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "Preferire retrazione" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "Se abilitata, la retrazione viene utilizzata al posto del combing per gli spostamenti che sostituiscono le pareti aventi un flusso inferiore alla soglia minima." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1572,12 +1568,12 @@ msgstr "Collegare le estremità nel punto in cui il riempimento incontra la pare #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "Collega poligoni di riempimento" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "Collega i percorsi di riempimento quando corrono uno accanto all’altro. Per le configurazioni di riempimento composte da più poligoni chiusi, l’abilitazione di questa impostazione riduce notevolmente il tempo di spostamento." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1612,24 +1608,24 @@ msgstr "Il riempimento si sposta di questa distanza lungo l'asse Y." #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "Moltiplicatore delle linee di riempimento" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "Converte ogni linea di riempimento in questo numero di linee. Le linee supplementari non si incrociano tra loro, ma si evitano. In tal modo il riempimento risulta più rigido, ma il tempo di stampa e la quantità di materiale aumentano." #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "Conteggio pareti di riempimento supplementari" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "" +msgstr "Aggiunge pareti supplementari intorno alla zona di riempimento. Queste pareti possono ridurre l’abbassamento delle linee del rivestimento esterno superiore/inferiore, pertanto saranno necessari meno strati di rivestimento esterno superiore/inferiore per ottenere la stessa qualità al costo del materiale supplementare.\nQuesta funzione può essere abbinata a Collega poligoni riempimento per collegare tutto il riempimento in un unico percorso di estrusione senza necessità di avanzamenti o arretramenti, se configurata correttamente." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2779,7 +2775,7 @@ msgstr "Modalità Combing" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "La funzione Combing tiene l’ugello all’interno delle aree già stampate durante lo spostamento. In tal modo le corse di spostamento sono leggermente più lunghe, ma si riduce l’esigenza di effettuare retrazioni. Se questa funzione viene disabilitata, il materiale viene retratto e l’ugello si sposta in linea retta al punto successivo. È anche possibile evitare il combing sopra le aree del rivestimento esterno superiore/inferiore effettuando il combing solo nel riempimento. Si noti che l’opzione ‘Nel riempimento' si comporta esattamente come l’opzione ‘Non nel rivestimento' delle precedenti versioni Cura." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2799,7 +2795,7 @@ msgstr "Non nel rivestimento" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "Nel riempimento" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3244,22 +3240,22 @@ msgstr "Indica la distanza tra le linee della struttura di supporto stampata. Qu #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "Distanza tra le linee del supporto dello strato iniziale" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "Indica la distanza tra le linee della struttura di supporto dello strato iniziale stampato. Questa impostazione viene calcolata mediante la densità del supporto." #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "Direzione delle linee di riempimento supporto" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "Indica l’orientamento della configurazione del riempimento per i supporti. La configurazione del riempimento del supporto viene ruotata sul piano orizzontale." #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3629,22 +3625,22 @@ msgstr "Zig Zag" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "Override velocità della ventola" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "Quando abilitata, la velocità della ventola di raffreddamento stampa viene modificata per le zone del rivestimento esterno subito sopra il supporto." #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "Velocità della ventola del rivestimento esterno supportato" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "Percentuale della velocità della ventola da usare quando si stampano le zone del rivestimento esterno subito sopra il supporto. L’uso di una velocità ventola elevata può facilitare la rimozione del supporto." #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3796,9 +3792,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" -"Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\n" -"Questa è la distanza minima. Più linee di skirt aumenteranno tale distanza." +msgstr "Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\nQuesta è la distanza minima. Più linee di skirt aumenteranno tale distanza." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3973,7 +3967,7 @@ msgstr "Indica la larghezza delle linee dello strato di base del raft. Le linee #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "Spaziatura delle linee dello strato di base del raft" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4718,12 +4712,12 @@ msgstr "Collegamento dei dati di flusso del materiale (in mm3 al secondo) alla t #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "Circonferenza minima dei poligoni" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "I poligoni in strati sezionati con una circonferenza inferiore a questo valore verranno scartati. I valori inferiori generano una maglia con risoluzione superiore al costo del tempo di sezionamento. È dedicata in particolare alle stampanti SLA ad alta risoluzione e a modelli 3D molto piccoli, ricchi di dettagli." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5235,9 +5229,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\n" -"Ciò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing." +msgstr "Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\nCiò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5387,22 +5379,22 @@ msgstr "Soglia per l’utilizzo o meno di uno strato di dimensioni minori. Quest #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "Angolo parete di sbalzo" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "Le pareti che sbalzano oltre questo angolo verranno stampate utilizzando le impostazioni parete di sbalzo. Quando il valore è 90, nessuna parete sarà trattata come sbalzo." #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "Velocità parete di sbalzo" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "Le pareti di sbalzo verranno stampate a questa percentuale della loro normale velocità di stampa." #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index 2730f19b52..1f4d1a3e6d 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -43,13 +43,13 @@ msgstr "G-codeファイル" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "GCodeWriter は非テキストモードはサポートしていません。" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "保存する前に G-code を生成してください。" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -64,11 +64,7 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "" -"

モデルのサイズまたは材料の設定によっては、適切に印刷しない3Dモデルがあります。:

\n" -"

{model_names}

\n" -"

可能な限り最高の品質および信頼性を得る方法をご覧ください。

\n" -"

印字品質ガイドを見る

" +msgstr "

モデルのサイズまたは材料の設定によっては、適切に印刷しない3Dモデルがあります。:

\n

{model_names}

\n

可能な限り最高の品質および信頼性を得る方法をご覧ください。

\n

印字品質ガイドを見る

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -110,7 +106,7 @@ msgstr "USBにて接続する" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "USBプリントを実行しています。Cura を閉じるとこのプリントも停止します。実行しますか?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -137,7 +133,7 @@ msgstr "圧縮G-codeファイル" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "GCodeGzWriter はテキストモードをサポートしていません。" #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -634,7 +630,7 @@ msgstr "プライムタワーまたはプライム位置が無効なためスラ #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "無効な Extruder %s に関連付けられている造形物があるため、スライスできません。" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -690,12 +686,12 @@ msgstr "ノズル" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "プロジェクトファイル {0} に不明なマシンタイプ {1} があります。マシンをインポートできません。代わりにモデルをインポートします。" #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "プロジェクトファイルを開く" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -752,7 +748,7 @@ msgstr "Curaが3MF fileを算出します。" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "3Mf ファイルの書き込みエラー" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1080,12 +1076,7 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "" -"

申し訳ありません。Ultimaker Cura で何らかの不具合が生じています。

\n" -"

開始時に回復不能のエラーが発生しました。不適切なファイル設定が原因の可能性があります。バックアップを実行してからリセットしてください。

\n" -"

バックアップは、設定フォルダに保存されます。

\n" -"

問題解決のために、このクラッシュ報告をお送りください。

\n" -" " +msgstr "

申し訳ありません。Ultimaker Cura で何らかの不具合が生じています。

\n

開始時に回復不能のエラーが発生しました。不適切なファイル設定が原因の可能性があります。バックアップを実行してからリセットしてください。

\n

バックアップは、設定フォルダに保存されます。

\n

問題解決のために、このクラッシュ報告をお送りください。

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1118,10 +1109,7 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "" -"

致命的なエラーが発生しました。問題解決のためこのクラッシュレポートを送信してください

\n" -"

「レポート送信」ボタンを使用してバグレポートが自動的に当社サーバーに送られるようにしてください

\n" -" " +msgstr "

致命的なエラーが発生しました。問題解決のためこのクラッシュレポートを送信してください

\n

「レポート送信」ボタンを使用してバグレポートが自動的に当社サーバーに送られるようにしてください

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1468,7 +1456,7 @@ msgstr "著者" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "ダウンロード" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1508,27 +1496,27 @@ msgstr "戻る" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "アンインストール確認 " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "使用中の材料またはプロファイルをアンインストールしようとしています。確定すると以下の材料/プロファイルをデフォルトにリセットします。" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "材料" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "プロファイル" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "確認" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1543,17 +1531,17 @@ msgstr "Curaを終了する" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "地域貢献" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "コミュニティプラグイン" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "汎用材料" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1586,10 +1574,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"このプラグインにはライセンスが含まれています。\n" -"このプラグインをインストールするにはこのライセンスに同意する必要があります。\n" -"下の利用規約に同意しますか?" +msgstr "このプラグインにはライセンスが含まれています。\nこのプラグインをインストールするにはこのライセンスに同意する必要があります。\n下の利用規約に同意しますか?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1619,12 +1604,12 @@ msgstr "パッケージ取得中" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "ウェブサイト" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "電子メール" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1758,12 +1743,12 @@ msgstr "アドレス" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "このプリンターは、プリンターのグループをホストするために設定されていません。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "このプリンターは %1 プリンターのループのホストプリンターです。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1811,52 +1796,52 @@ msgstr "プリント" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "待ち時間: 利用できないプリンター" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "待ち時間: 次の空き" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "待ち時間: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "最上位に移動" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "印刷ジョブを最上位に移動する" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "%1 をキューの最上位に移動しますか?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "削除" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "印刷ジョブの削除" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "%1 を削除しますか?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "キュー管理" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1871,40 +1856,40 @@ msgstr "プリント中" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "プリンター管理" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "利用できません" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "到達不能" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "利用可能" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "再開" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "一時停止" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "中止" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 @@ -1915,13 +1900,13 @@ msgstr "プリント中止" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "%1 を中止してよろしいですか?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "中止しました" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1936,7 +1921,7 @@ msgstr "準備中" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "一時停止中" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2356,7 +2341,7 @@ msgstr "開く" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "前" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2368,12 +2353,12 @@ msgstr "書き出す" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "次" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "ヒント" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2422,12 +2407,12 @@ msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "試し印刷" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "チェックリスト" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2650,7 +2635,7 @@ msgstr "造形物を取り出してください。" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "プリント中止" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -3111,7 +3096,7 @@ msgstr "プロジェクトファイル開く際のデフォルト機能:" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "毎回確認する" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3131,22 +3116,22 @@ msgstr "プロファイル内を変更し異なるプロファイルにしまし #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "プロファイル" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "プロファイル交換時に設定値を変更するためのデフォルト処理: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "常に変更した設定を廃棄する" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "常に変更した設定を新しいプロファイルに送信する" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3341,7 +3326,7 @@ msgstr "プリンターについて" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "無題" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3476,9 +3461,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"いくらかの設定プロファイルにある値とことなる場合無効にします。\n" -"プロファイルマネージャーをクリックして開いてください。" +msgstr "いくらかの設定プロファイルにある値とことなる場合無効にします。\nプロファイルマネージャーをクリックして開いてください。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3532,9 +3515,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n" -"表示されるようにクリックしてください。" +msgstr "いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n表示されるようにクリックしてください。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3562,9 +3543,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"この設定にプロファイルと異なった値があります。\n" -"プロファイルの値を戻すためにクリックしてください。" +msgstr "この設定にプロファイルと異なった値があります。\nプロファイルの値を戻すためにクリックしてください。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3572,9 +3551,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"このセッティングは通常計算されます、今は絶対値に固定されています。\n" -"計算された値に変更するためにクリックを押してください。" +msgstr "このセッティングは通常計算されます、今は絶対値に固定されています。\n計算された値に変更するためにクリックを押してください。" #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3693,17 +3670,17 @@ msgstr "プリント開始前にベッドを加熱します。加熱中もプリ #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "材料" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "お気に入り" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "汎用" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3799,9 +3776,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"プリントセットアップが無効\n" -"G-codeファイルを修正することができません。" +msgstr "プリントセットアップが無効\nG-codeファイルを修正することができません。" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4143,17 +4118,17 @@ msgstr "&ファイル" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "&保存..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "&エクスポート..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "選択エクスポート..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4255,13 +4230,13 @@ msgstr "新しいプロジェクトを開始しますか?この作業では保 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Cura を閉じる" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "Cura を終了しますか?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4443,7 +4418,7 @@ msgstr "フィラメント" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "この材料の組み合わせで接着する" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4783,12 +4758,12 @@ msgstr "2.7から3.0にバージョンアップグレート" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Cura 3.4 から Cura 3.5 のコンフィグレーションアップグレート" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "3.4 から 3.5 にバージョンアップグレート" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" diff --git a/resources/i18n/ja_JP/fdmprinter.def.json.po b/resources/i18n/ja_JP/fdmprinter.def.json.po index 85b3a89cfd..919dbc2033 100644 --- a/resources/i18n/ja_JP/fdmprinter.def.json.po +++ b/resources/i18n/ja_JP/fdmprinter.def.json.po @@ -61,9 +61,7 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "" -"最初に実行するG-codeコマンドは、\n" -"で区切ります。" +msgstr "最初に実行するG-codeコマンドは、\nで区切ります。" #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -75,9 +73,7 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "" -"最後に実行するG-codeコマンドは、\n" -"で区切ります。" +msgstr "最後に実行するG-codeコマンドは、\nで区切ります。" #: fdmprinter.def.json msgctxt "material_guid label" @@ -1118,12 +1114,12 @@ msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "上層/底層ポリゴンに接合" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "互いに次に実行する上層/底層スキンパスに接合します。同心円のパターンの場合、この設定を有効にすることにより、移動時間が短縮されますが、インフィルまでの途中で接合があるため、この機能で上層面の品質が損なわれることがあります。" #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1208,22 +1204,22 @@ msgstr "すでに壁が設置されている場所にプリントされている #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "最小壁フロー" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "ウォールラインに対する流れを最小割合にします。既存の壁に近い場合に、壁補正により壁の流れが減少します。壁の流れがこの値より低い場合は、移動に置き換えられます。この設定を使用する場合は、壁補正を有効にして、内装の前に外装を印刷する必要があります。" #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "引き戻し優先" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "有効にすると、フローが最小フローしきい値を下回っている壁を置き換える移動量より多い場合は、引き戻しを使用します。" #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1326,9 +1322,7 @@ msgstr "ZシームX" #: fdmprinter.def.json msgctxt "z_seam_x description" msgid "The X coordinate of the position near where to start printing each part in a layer." -msgstr "" -"レイヤー内の各印刷を開始するX座\n" -"標の位置。" +msgstr "レイヤー内の各印刷を開始するX座\n標の位置。" #: fdmprinter.def.json msgctxt "z_seam_y label" @@ -1648,12 +1642,12 @@ msgstr "内壁の形状に沿ったラインを使用してインフィルパタ #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "インフィルポリゴン接合" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "互いに次に実行するインフィルパスに接合します。いくつかの閉じられたポリゴンを含むインフィルパターンの場合、この設定を有効にすることにより、移動時間が大幅に短縮されます。" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1689,24 +1683,24 @@ msgstr "インフィルパターンはY軸に沿ってこの距離を移動し #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "インフィルライン乗算" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "各インフィルラインをこの多重ラインに変換します。余分なラインが互いに交差せず、互いを避け合います。これによりインフィルが硬くなり、印刷時間と材料使用量が増えます。" #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "外側インフィル壁の数" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "" +msgstr "インフィルエリア周辺に外壁を追加します。このような壁は、上層/底層ラインにたるみを作ります。つまり、一部の外壁材料の費用で同じ品質を実現するためには、必要な上層/底層スキンが少ないことを意味します。\nこの機能は、インフィルポリゴン接合と組み合わせて、構成が正しい場合、移動または引き戻しが必要なく、すべてのインフィルを1つの押出経路に接続することができます。" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1809,9 +1803,7 @@ msgstr "インフィル優先" #: fdmprinter.def.json msgctxt "infill_before_walls description" msgid "Print the infill before printing the walls. Printing the walls first may lead to more accurate walls, but overhangs print worse. Printing the infill first leads to sturdier walls, but the infill pattern might sometimes show through the surface." -msgstr "" -"壁より前にインフィルをプリントします はじめに壁をプリントするとより精密な壁になりますが、オーバーハングのプリントは悪化します\n" -"はじめにインフィルをプリントすると丈夫な壁になりますが、インフィルの模様が時折表面から透けて表れます" +msgstr "壁より前にインフィルをプリントします はじめに壁をプリントするとより精密な壁になりますが、オーバーハングのプリントは悪化します\nはじめにインフィルをプリントすると丈夫な壁になりますが、インフィルの模様が時折表面から透けて表れます" #: fdmprinter.def.json msgctxt "min_infill_area label" @@ -2878,7 +2870,7 @@ msgstr "コーミングモード" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "コーミングは、移動時に印刷済みエリア内にノズルを保持します。この結果、移動距離が長くなりますが、引き戻しの必要性が軽減されます。コーミングがオフの場合は、材料を引き戻して、ノズルを次のポイントまで直線に移動します。コーミングが上層/底層スキンエリアを超えずに、インフィル内のみコーミングするようにできます。「インフィル内」オプションは、Cura の旧版の「スキン内にない」オプションと全く同じ動作をします。" #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2898,7 +2890,7 @@ msgstr "スキン内にない" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "インフィル内" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3350,22 +3342,22 @@ msgstr "印刷されたサポート材の間隔。この設定は、サポート #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "初期層サポートラインの距離" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "印刷した初期層間の距離が構造ライをサポートします。この設定は、対応濃度で算出されます。" #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "サポートインフィルラインの向き" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "対応するインフィルラインの向きです。サポートインフィルパターンは平面で回転します。" #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3756,22 +3748,22 @@ msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "ファン速度上書き" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "有効にすると、サポートを超えた直後に印刷冷却ファンの速度がスキン領域に対して変更されます。" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "サポート対象スキンファン速度" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "サポートを超えた直後にスキン領域に印字するときに使用するファン速度を割合で示します。高速ファンを使用すると、サポートが取り外しやすくなります。" # msgstr "ジグザグ" #: fdmprinter.def.json @@ -3930,9 +3922,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" -"スカートと印刷の最初の層の間の水平距離。\n" -"これは最小距離です。複数のスカートラインがこの距離から外側に展開されます。" +msgstr "スカートと印刷の最初の層の間の水平距離。\nこれは最小距離です。複数のスカートラインがこの距離から外側に展開されます。" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4107,7 +4097,7 @@ msgstr "ベースラフト層の線幅。ビルドプレートの接着のため #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "ラフトベースラインスペース" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4864,12 +4854,12 @@ msgstr "マテリアルフロー(毎秒 3mm) と温度 (° c) をリンクしま #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "最小ポリゴン円周" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "この量よりも小さい円周を持つスライスレイヤーのポリゴンは、除外されます。値を小さくすると、スライス時間のコストで、メッシュの解像度が高くなります。つまり、ほとんどが高解像 SLA プリンター、極小多機能 3D モデルです。" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5542,22 +5532,22 @@ msgstr "小さいレイヤーを使用するかどうかの閾値。この値が #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "張り出し壁アングル" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "この角度以上に張り出した壁は、オーバーハング壁設定を使用して印刷されます。値が 90 の場合は、オーバーハング壁として処理されません。" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "張り出し壁速度" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "張り出し壁は、この割合で通常の印刷速度で印刷されます。" #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index 530aede5c7..44beb606d6 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -43,13 +43,13 @@ msgstr "G-code 파일" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "GCodeWriter는 텍스트가 아닌 모드는 지원하지 않습니다." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "저장하기 전에 G-code를 생성하십시오." #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -64,11 +64,7 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "" -"

하나 이상의 3D 모델이 모델 크기 및 재료 구성으로 인해 최적의 상태로 인쇄되지 않을 수 있습니다.

\n" -"

{model_names}

\n" -"

인쇄 품질 및 안정성을 최고로 높이는 방법을 알아보십시오.

\n" -"

인쇄 품질 가이드 보기

" +msgstr "

하나 이상의 3D 모델이 모델 크기 및 재료 구성으로 인해 최적의 상태로 인쇄되지 않을 수 있습니다.

\n

{model_names}

\n

인쇄 품질 및 안정성을 최고로 높이는 방법을 알아보십시오.

\n

인쇄 품질 가이드 보기

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -108,7 +104,7 @@ msgstr "USB를 통해 연결" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "USB 인쇄가 진행 중입니다. Cura를 닫으면 인쇄도 중단됩니다. 계속하시겠습니까?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -135,7 +131,7 @@ msgstr "압축된 G-code 파일" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "GCodeGzWriter는 텍스트 모드는 지원하지 않습니다." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -632,7 +628,7 @@ msgstr "프라임 타워 또는 위치가 유효하지 않아 슬라이스 할 #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "비활성화된 익스트루더 %s(와)과 연결된 개체가 있기 때문에 슬라이스할 수 없습니다." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -688,12 +684,12 @@ msgstr "노즐" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "프로젝트 파일 {0}에 알 수 없는 기기 유형 {1}이(가) 포함되어 있습니다. 기기를 가져올 수 없습니다. 대신 모델을 가져옵니다." #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "프로젝트 파일 열기" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -750,7 +746,7 @@ msgstr "Cura 프로젝트 3MF 파일" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "3MF 파일 작성 중 오류" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1078,12 +1074,7 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "" -"

죄송합니다, Ultimaker Cura가 정상적이지 않습니다. \n" -"                    

시작할 때 복구 할 수없는 오류가 발생했습니다. 이 오류는 잘못된 구성 파일로 인해 발생할 수 있습니다. 설정을 백업하고 재설정하는 것이 좋습니다. \n" -"                    

백업은 설정 폴더에서 찾을 수 있습니다. \n" -"                    

문제를 해결하기 위해이 오류 보고서를 보내주십시오. \n" -" " +msgstr "

죄송합니다, Ultimaker Cura가 정상적이지 않습니다. \n                    

시작할 때 복구 할 수없는 오류가 발생했습니다. 이 오류는 잘못된 구성 파일로 인해 발생할 수 있습니다. 설정을 백업하고 재설정하는 것이 좋습니다. \n                    

백업은 설정 폴더에서 찾을 수 있습니다. \n                    

문제를 해결하기 위해이 오류 보고서를 보내주십시오. \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1116,10 +1107,7 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "" -"

치명적인 오류가 발생했습니다. 문제를 해결할 수 있도록 이 충돌 보고서를 보내주십시오

\n" -"

\"보고서 전송\" 버튼을 사용하면 버그 보고서가 서버에 자동으로 전달됩니다

\n" -" " +msgstr "

치명적인 오류가 발생했습니다. 문제를 해결할 수 있도록 이 충돌 보고서를 보내주십시오

\n

\"보고서 전송\" 버튼을 사용하면 버그 보고서가 서버에 자동으로 전달됩니다

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1466,7 +1454,7 @@ msgstr "원작자" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "다운로드" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1506,27 +1494,27 @@ msgstr "뒤로" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "제거 확인 " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "아직 사용 중인 재료 및/또는 프로파일을 제거합니다. 확인하면 다음 재료/프로파일이 기본값으로 재설정됩니다." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "재료" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "프로파일" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "확인" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1541,17 +1529,17 @@ msgstr "Cura 끝내기" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "커뮤니티 기여" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "커뮤니티 플러그인" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "일반 재료" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1584,10 +1572,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"이 플러그인에는 라이선스가 포함되어 있습니다.\n" -"이 플러그인을 설치하려면 이 라이선스를 수락해야 합니다.\n" -"아래의 약관에 동의하시겠습니까?" +msgstr "이 플러그인에는 라이선스가 포함되어 있습니다.\n이 플러그인을 설치하려면 이 라이선스를 수락해야 합니다.\n아래의 약관에 동의하시겠습니까?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1617,12 +1602,12 @@ msgstr "패키지 가져오는 중..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "웹 사이트" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "이메일" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1707,10 +1692,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"네트워크를 통해 프린터로 직접 프린팅하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n" -"\n" -"아래 목록에서 프린터를 선택하십시오:" +msgstr "네트워크를 통해 프린터로 직접 프린팅하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n\n아래 목록에서 프린터를 선택하십시오:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1759,12 +1741,12 @@ msgstr "주소" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "이 프린터는 프린터 그룹을 호스트하도록 설정되어 있지 않습니다." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "이 프린터는 1%개 프린터 그룹의 호스트입니다." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1812,52 +1794,52 @@ msgstr "프린트" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "대기: 사용할 수 없는 프린터" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "대기: 첫 번째로 사용 가능" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "대기: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "맨 위로 이동" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "인쇄 작업을 맨 위로 이동" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "%1(을)를 대기열의 맨 위로 이동하시겠습니까?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "삭제" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "인쇄 작업 삭제" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "%1(을)를 삭제하시겠습니까?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "대기열 관리" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1872,40 +1854,40 @@ msgstr "프린팅" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "프린터 관리" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "사용 불가" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "연결할 수 없음" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "유효한" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "재개" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "중지" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "중단" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 @@ -1916,13 +1898,13 @@ msgstr "프린팅 중단" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "%1(을)를 정말로 중지하시겠습니까?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "중단됨" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1937,7 +1919,7 @@ msgstr "준비중인" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "일시 정지 중" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2353,7 +2335,7 @@ msgstr "열기" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "이전" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2365,12 +2347,12 @@ msgstr "내보내기" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "다음" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "팁" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2419,12 +2401,12 @@ msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "인쇄 실험" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "체크리스트" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2647,7 +2629,7 @@ msgstr "프린트물을 제거하십시오" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "프린팅 중단" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -2664,9 +2646,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"일부 프로파일 설정을 수정했습니다.\n" -"이러한 설정을 유지하거나 삭제 하시겠습니까?" +msgstr "일부 프로파일 설정을 수정했습니다.\n이러한 설정을 유지하거나 삭제 하시겠습니까?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3110,7 +3090,7 @@ msgstr "프로젝트 파일을 열 때 기본 동작 " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "항상 묻기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3130,22 +3110,22 @@ msgstr "프로파일을 변경하고 다른 프로파일로 전환하면 수정 #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "프로파일" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "다른 프로파일로 변경하는 경우 변경된 설정값에 대한 기본 동작 " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "항상 변경된 설정 삭제" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "항상 변경된 설정을 새 프로파일로 전송" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3340,7 +3320,7 @@ msgstr "프린터 추가" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "제목 없음" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3362,9 +3342,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura는 커뮤니티와 공동으로 Ultimaker B.V.에 의해 개발되었습니다.\n" -"Cura는 다음의 오픈 소스 프로젝트를 사용합니다:" +msgstr "Cura는 커뮤니티와 공동으로 Ultimaker B.V.에 의해 개발되었습니다.\nCura는 다음의 오픈 소스 프로젝트를 사용합니다:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3477,10 +3455,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"일부 설정/대체 값은 프로파일에 저장된 값과 다릅니다.\n" -"\n" -"프로파일 매니저를 열려면 클릭하십시오." +msgstr "일부 설정/대체 값은 프로파일에 저장된 값과 다릅니다.\n\n프로파일 매니저를 열려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3534,10 +3509,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"일부 숨겨진 설정은 일반적인 계산 값과 다른 값을 사용합니다.\n" -"\n" -"이 설정을 표시하려면 클릭하십시오." +msgstr "일부 숨겨진 설정은 일반적인 계산 값과 다른 값을 사용합니다.\n\n이 설정을 표시하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3565,10 +3537,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"이 설정에는 프로파일과 다른 값이 있습니다.\n" -"\n" -"프로파일 값을 복원하려면 클릭하십시오." +msgstr "이 설정에는 프로파일과 다른 값이 있습니다.\n\n프로파일 값을 복원하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3576,10 +3545,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"이 설정은 일반적으로 계산되지만 현재는 절대 값이 설정되어 있습니다.\n" -"\n" -"계산 된 값을 복원하려면 클릭하십시오." +msgstr "이 설정은 일반적으로 계산되지만 현재는 절대 값이 설정되어 있습니다.\n\n계산 된 값을 복원하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3698,17 +3664,17 @@ msgstr "프린팅하기 전에 베드를 미리 가열하십시오. 가열되는 #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "재료" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "즐겨찾기" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "일반" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3802,9 +3768,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"프린팅 설정 사용 안 함\n" -"G-코드 파일은 수정할 수 없습니다" +msgstr "프린팅 설정 사용 안 함\nG-코드 파일은 수정할 수 없습니다" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4143,17 +4107,17 @@ msgstr "파일" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "저장(&S)..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "내보내기(&E)..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "내보내기 선택..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4255,13 +4219,13 @@ msgstr "새 프로젝트를 시작 하시겠습니까? 빌드 플레이트 및 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Cura 닫기" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "Cura를 정말로 종료하시겠습니까?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4442,7 +4406,7 @@ msgstr "재료" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "이 재료 조합과 함께 접착제를 사용하십시오." #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4782,12 +4746,12 @@ msgstr "2.7에서 3.0으로 버전 업그레이드" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Cura 3.4에서 Cura 3.5로 구성을 업그레이드합니다." #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "3.4에서 3.5로 버전 업그레이드" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 8ae7eb2b57..50df8f7128 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -58,9 +58,7 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "" -"시작과 동시에형실행될 G 코드 명령어 \n" -"." +msgstr "시작과 동시에형실행될 G 코드 명령어 \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -72,9 +70,7 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "" -"맨 마지막에 실행될 G 코드 명령 \n" -"." +msgstr "맨 마지막에 실행될 G 코드 명령 \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -1074,12 +1070,12 @@ msgstr "지그재그" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "상단/하단 다각형 연결" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "스킨 경로가 나란히 이어지는 상단/하단 스킨 경로를 연결합니다. 동심원 패턴의 경우 이 설정을 사용하면 이동 시간이 크게 감소하지만, 내부채움의 중간에 연결될 수 있기 때문에 이 기능은 상단 표면 품질을 저하시킬 수 있습니다." #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1164,22 +1160,22 @@ msgstr "이미 벽이있는 곳에 프린팅되는 내부 벽 부분에 대한 #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "최소 압출량" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "벽 라인에 대한 최소 허용 백분율 흐름 벽 오버랩 보상이 기존 벽과 가까울 때 벽의 흐름을 줄입니다. 흐름이 이 값보다 작은 벽은 이동으로 대체됩니다. 이 설정을 사용하는 경우 벽 오버랩 보상을 사용하고 내벽 전에 외벽을 인쇄해야 합니다." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "리트렉션 선호" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "이 옵션을 사용하면 흐름이 최소 흐름 임계 값보다 낮은 벽을 교체하는 이동에 대해 빗질 대신에 리트렉션을 사용합니다." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1574,12 +1570,12 @@ msgstr "내벽의 형태를 따라가는 선을 사용하여 내부채움 패턴 #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "내부채움 다각형 연결" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "스킨 경로가 나란히 이어지는 내부채움 경로를 연결합니다. 여러 개의 폐다각형으로 구성되는 내부채움 패턴의 경우 이 설정을 사용하면 이동 시간이 크게 감소합니다." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1614,24 +1610,24 @@ msgstr "내부채움 패턴이 Y축을 따라 이 거리만큼 이동합니다." #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "내부채움 선 승수" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "각 내부채움 선을 여러 개의 선으로 변환합니다. 추가되는 선은 다른 선을 교차하지 않고, 다른 선을 피해 변환됩니다. 내부채움을 빽빽하게 만들지만, 인쇄 및 재료 사용이 증가합니다." #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "여분의 내부채움 벽 수" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "" +msgstr "내부채움 영역 주변에 여분의 벽을 추가합니다. 이러한 벽은 상단/하단 스킨 라인이 늘어지는 것을 줄여줄 수 있습니다. 일부 여분 재료를 사용해도 같은 품질을 유지하는 데 필요한 필요한 상단/하단 스킨 층이 감소한다는 의미입니다.\n이 기능을 올바르게 구성하는 경우 내부채움 다각형 연결과 함께 사용해 이동 또는 리트랙션없이 모든 내부채움을 단일 돌출 경로에 연결할 수 있습니다." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2781,7 +2777,7 @@ msgstr "Combing 모드" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "Combing은 이동할 때 이미 인쇄 된 영역 내에 노즐을 유지합니다. 이로 인해 이동이 약간 더 길어 지지만 리트렉션의 필요성은 줄어 듭니다. Combing이 꺼져 있으면 재료가 후퇴하고 노즐이 직선으로 다음 점으로 이동합니다. 또한 내부채움 내에서만 빗질하여 상단/하단 스킨 영역을 Combing하는 것을 피할 수 있습니다. '내부채움 내' 옵션은 이전 Cura 릴리즈에서 '스킨에 없음' 옵션과 정확하게 동일한 동작을 합니다." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2801,7 +2797,7 @@ msgstr "스킨에 없음" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "내부채움 내" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3246,22 +3242,22 @@ msgstr "프린팅 된 서포트 구조 선 사이의 거리. 이 설정은 서 #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "초기 레이어 서포트 선 거리" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "인쇄된 초기 레이어 서포트 구조 선 사이의 거리. 이 설정은 서포트 밀도로 계산됩니다." #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "서포트 내부채움 선 방향" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "서포트에 대한 내부채움 패턴 방향. 서포트 내부채움 패턴은 수평면에서 회전합니다." #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3631,22 +3627,22 @@ msgstr "지그재그" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "팬 속도 무시" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "활성화되면 서포트 바로 위의 스킨 영역에 대한 프린팅 냉각 팬 속도가 변경됩니다." #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "지원되는 스킨 팬 속도" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "서포트 바로 위의 스킨 영역을 인쇄할 때 사용할 팬 속도 백분율 빠른 팬 속도를 사용하면 서포트를 더 쉽게 제거할 수 있습니다." #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3798,9 +3794,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" -"프린트의 스커트와 첫 번째 레이어 사이의 수평 거리입니다.\n" -"이것은 최소 거리입니다. 여러 개의 스커트 선이 이 거리에서 바깥쪽으로 연장됩니다." +msgstr "프린트의 스커트와 첫 번째 레이어 사이의 수평 거리입니다.\n이것은 최소 거리입니다. 여러 개의 스커트 선이 이 거리에서 바깥쪽으로 연장됩니다." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3975,7 +3969,7 @@ msgstr "기본 래프트 층에있는 선의 너비. 이것은 빌드 플레이 #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "래프트 기준 선 간격" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4720,12 +4714,12 @@ msgstr "재료 공급 데이터 (mm3 / 초) - 온도 (섭씨)." #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "최소 다각형 둘레" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "레이어가 슬라이스 된, 이 값보다 둘레가 작은 다각형은 필터링됩니다. 값을 낮을수록 슬라이스가 느려지지만, 해상도 메쉬가 높아집니다. 주로 고해상도 SLA 프린터 및 세부 사항이 많은 매우 작은 3D 모델에 적합합니다." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5387,22 +5381,22 @@ msgstr "더 작은 레이어를 사용할지 여부에 대한 임계 값. 이 #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "오버행된 벽 각도" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "이 각도를 초과해 오버행된 벽은 오버행된 벽 설정을 사용해 인쇄됩니다. 값이 90인 경우 벽이 오버행된 것으로 간주하지 않습니다." #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "오버행된 벽 속도" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "오버행된 벽은 정상적인 인쇄 속도의 이 비율로 인쇄됩니다." #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index 165d26a8fc..7e903989eb 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -41,13 +41,13 @@ msgstr "G-code-bestand" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "GCodeWriter ondersteunt geen non-tekstmodus." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "Genereer G-code voordat u het bestand opslaat." #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -62,11 +62,7 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "" -"

Een of meer 3D-modellen worden mogelijk niet optimaal geprint vanwege het modelformaat en de materiaalconfiguratie:

\n" -"

{model_names}

\n" -"

Ontdek hoe u de best mogelijke printkwaliteit en betrouwbaarheid verkrijgt.

\n" -"

Handleiding printkwaliteit bekijken

" +msgstr "

Een of meer 3D-modellen worden mogelijk niet optimaal geprint vanwege het modelformaat en de materiaalconfiguratie:

\n

{model_names}

\n

Ontdek hoe u de best mogelijke printkwaliteit en betrouwbaarheid verkrijgt.

\n

Handleiding printkwaliteit bekijken

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -106,7 +102,7 @@ msgstr "Aangesloten via USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "Er wordt momenteel via USB geprint. Wanneer u Cura afsluit, wordt het printen gestopt. Weet u zeker dat u wilt afsluiten?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -133,7 +129,7 @@ msgstr "Gecomprimeerd G-code-bestand" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "GCodeWriter ondersteunt geen tekstmodus." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -630,7 +626,7 @@ msgstr "Slicen is niet mogelijk omdat de terugduwpijler of terugduwpositie(s) on #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "Slicen is niet mogelijk omdat er objecten gekoppeld zijn aan uitgeschakelde Extruder %s." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -686,12 +682,12 @@ msgstr "Nozzle" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "Projectbestand {0} bevat een onbekend type machine {1}. Kan de machine niet importeren. In plaats daarvan worden er modellen geïmporteerd." #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "Projectbestand Openen" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -748,7 +744,7 @@ msgstr "Cura-project 3MF-bestand" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "Fout bij het schrijven van het 3mf-bestand." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1076,12 +1072,7 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "" -"

Oeps, Ultimaker Cura heeft een probleem gedetecteerd.

\n" -"

Tijdens het opstarten is een onherstelbare fout opgetreden. Deze fout is mogelijk veroorzaakt door enkele onjuiste configuratiebestanden. Het wordt aanbevolen een back-up te maken en de standaardinstelling van uw configuratie te herstellen.

\n" -"

Back-ups bevinden zich in de configuratiemap.

\n" -"

Stuur ons dit crashrapport om het probleem op te lossen.

\n" -" " +msgstr "

Oeps, Ultimaker Cura heeft een probleem gedetecteerd.

\n

Tijdens het opstarten is een onherstelbare fout opgetreden. Deze fout is mogelijk veroorzaakt door enkele onjuiste configuratiebestanden. Het wordt aanbevolen een back-up te maken en de standaardinstelling van uw configuratie te herstellen.

\n

Back-ups bevinden zich in de configuratiemap.

\n

Stuur ons dit crashrapport om het probleem op te lossen.

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1114,10 +1105,7 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "" -"

Er is een fatale fout opgetreden in Cura. Stuur ons het crashrapport om het probleem op te lossen

\n" -"

Druk op de knop \"Rapport verzenden\" om het foutenrapport automatisch naar onze servers te verzenden

\n" -" " +msgstr "

Er is een fatale fout opgetreden in Cura. Stuur ons het crashrapport om het probleem op te lossen

\n

Druk op de knop \"Rapport verzenden\" om het foutenrapport automatisch naar onze servers te verzenden

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1464,7 +1452,7 @@ msgstr "Auteur" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "Downloads" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1504,27 +1492,27 @@ msgstr "Terug" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "De-installeren bevestigen " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "U verwijdert materialen en/of profielen die nog in gebruik zijn. Wanneer u het verwijderen bevestigt, worden de volgende materialen/profielen teruggezet naar hun standaardinstellingen." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "Materialen" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "Profielen" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "Bevestigen" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1539,17 +1527,17 @@ msgstr "Cura sluiten" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "Community-bijdragen" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "Community-invoegtoepassingen" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "Standaard materialen" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1582,10 +1570,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Deze invoegtoepassing bevat een licentie.\n" -"U moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\n" -"Gaat u akkoord met de onderstaande voorwaarden?" +msgstr "Deze invoegtoepassing bevat een licentie.\nU moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\nGaat u akkoord met de onderstaande voorwaarden?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1615,12 +1600,12 @@ msgstr "Packages ophalen..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "Website" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "E-mail" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1705,10 +1690,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n" -"\n" -"Selecteer uw printer in de onderstaande lijst:" +msgstr "Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n\nSelecteer uw printer in de onderstaande lijst:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1757,12 +1739,12 @@ msgstr "Adres" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "Deze printer is niet ingesteld voor het hosten van een groep printers." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "Deze printer is de host voor een groep van %1 printers." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1810,52 +1792,52 @@ msgstr "Printen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "Wachten op: Niet-beschikbare printer" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "Wachten op: Eerst beschikbaar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "Wachten op: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "Naar boven verplaatsen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "Printtaak naar boven verplaatsen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "Weet u zeker dat u %1 bovenaan de wachtrij wilt plaatsen?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "Verwijderen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "Printtaak verwijderen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "Weet u zeker dat u %1 wilt verwijderen?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "Wachtrij beheren" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1870,40 +1852,40 @@ msgstr "Printen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "Printers beheren" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "Niet beschikbaar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "Niet bereikbaar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "Beschikbaar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "Hervatten" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "Pauzeren" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "Afbreken" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 @@ -1914,13 +1896,13 @@ msgstr "Printen afbreken" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "Weet u zeker dat u %1 wilt afbreken?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "Afgebroken" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1935,7 +1917,7 @@ msgstr "Voorbereiden" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "Pauzeren" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2353,7 +2335,7 @@ msgstr "Openen" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "Vorige" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2365,12 +2347,12 @@ msgstr "Exporteren" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "Volgende" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "Punt" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2419,12 +2401,12 @@ msgstr "%1 m / ~ %2 g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "Proefprint" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "Checklist" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2647,7 +2629,7 @@ msgstr "Verwijder de print" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "Printen Afbreken" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -2664,9 +2646,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"U hebt enkele profielinstellingen aangepast.\n" -"Wilt u deze instellingen behouden of verwijderen?" +msgstr "U hebt enkele profielinstellingen aangepast.\nWilt u deze instellingen behouden of verwijderen?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3110,7 +3090,7 @@ msgstr "Standaardgedrag tijdens het openen van een projectbestand: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "Altijd vragen" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3130,22 +3110,22 @@ msgstr "Wanneer u wijzigingen hebt aangebracht aan een profiel en naar een ander #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "Profielen" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "Standaardgedrag voor gewijzigde instellingen wanneer er naar een ander profiel wordt overgeschakeld: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "Gewijzigde instellingen altijd verwijderen" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "Gewijzigde instellingen altijd naar nieuw profiel overbrengen" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3340,7 +3320,7 @@ msgstr "Printer Toevoegen" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "Zonder titel" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3362,9 +3342,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\n" -"Cura maakt met trots gebruik van de volgende opensourceprojecten:" +msgstr "Cura is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\nCura maakt met trots gebruik van de volgende opensourceprojecten:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3477,10 +3455,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n" -"\n" -"Klik om het profielbeheer te openen." +msgstr "Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n\nKlik om het profielbeheer te openen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3534,10 +3509,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n" -"\n" -"Klik om deze instellingen zichtbaar te maken." +msgstr "Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n\nKlik om deze instellingen zichtbaar te maken." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3565,10 +3537,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Deze instelling heeft een andere waarde dan in het profiel.\n" -"\n" -"Klik om de waarde van het profiel te herstellen." +msgstr "Deze instelling heeft een andere waarde dan in het profiel.\n\nKlik om de waarde van het profiel te herstellen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3576,10 +3545,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n" -"\n" -"Klik om de berekende waarde te herstellen." +msgstr "Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n\nKlik om de berekende waarde te herstellen." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3698,17 +3664,17 @@ msgstr "Verwarm het bed voordat u gaat printen. U kunt doorgaan met het aanpasse #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "Materiaal" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "Favorieten" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "Standaard" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3804,9 +3770,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Instelling voor printen uitgeschakeld\n" -"G-code-bestanden kunnen niet worden aangepast" +msgstr "Instelling voor printen uitgeschakeld\nG-code-bestanden kunnen niet worden aangepast" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4148,17 +4112,17 @@ msgstr "&Bestand" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "&Opslaan..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "&Exporteren..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "Selectie Exporteren..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4260,13 +4224,13 @@ msgstr "Weet u zeker dat u een nieuw project wilt starten? Hiermee wordt het pla #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Cura afsluiten" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "Weet u zeker dat u Cura wilt verlaten?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4448,7 +4412,7 @@ msgstr "Materiaal" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "Gebruik lijm bij deze combinatie van materialen" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4788,12 +4752,12 @@ msgstr "Versie-upgrade van 2.7 naar 3.0" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Hiermee worden configuraties bijgewerkt van Cura 3.4 naar Cura 3.5." #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "Versie-upgrade van 3.4 naar 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" diff --git a/resources/i18n/nl_NL/fdmprinter.def.json.po b/resources/i18n/nl_NL/fdmprinter.def.json.po index 73c9023c88..f7dab57356 100644 --- a/resources/i18n/nl_NL/fdmprinter.def.json.po +++ b/resources/i18n/nl_NL/fdmprinter.def.json.po @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "" -"G-code-opdrachten die aan het begin worden uitgevoerd, gescheiden door \n" -"." +msgstr "G-code-opdrachten die aan het begin worden uitgevoerd, gescheiden door \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "" -"G-code-opdrachten die aan het eind worden uitgevoerd, gescheiden door \n" -"." +msgstr "G-code-opdrachten die aan het eind worden uitgevoerd, gescheiden door \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -1072,12 +1068,12 @@ msgstr "Zigzag" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "Boven-/onderkant Polygonen Verbinden" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "Skinpaden aan boven-/onderkant verbinden waar ze naast elkaar lopen. Met deze instelling wordt bij concentrische patronen de bewegingstijd aanzienlijk verkort. Dit kan echter ten koste gaan van de kwaliteit van de bovenste laag aangezien de verbindingen in het midden van de vulling kunnen komen te liggen." #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1162,22 +1158,22 @@ msgstr "Hiermee wordt de doorvoer gecompenseerd voor delen van binnenwanden die #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "Minimale Wanddoorvoer" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "Minimaal toegestane doorvoerpercentage voor een wandlijn. Compensatie van de overlapping van wanden zorgt voor een kortere doorvoer van een wand als deze dicht bij een bestaande wand ligt. Wanden waarbij de doorvoerwaarde lager is dan deze waarde, worden vervangen door een beweging. Wanneer u deze instelling gebruikt, moet u compensatie van overlapping van wanden inschakelen en de buitenwand printen voordat u de binnenwanden print." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "Bij Voorkeur Intrekken" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "Als deze optie ingeschakeld is, volgt er een intrekbeweging in plaats van een combing-beweging ter vervanging van wanden waarbij de doorvoer lager is dan de minimale doorvoerwaarde." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1572,12 +1568,12 @@ msgstr "Verbindt de uiteinden waar het vulpatroon bij de binnenwand komt, met ee #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "Vulpolygonen Verbinden" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "Vulpaden verbinden waar ze naast elkaar lopen. Bij vulpatronen die uit meerdere gesloten polygonen bestaan, wordt met deze instelling de bewegingstijd aanzienlijk verkort." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1612,24 +1608,24 @@ msgstr "Het vulpatroon wordt over deze afstand verplaatst langs de Y-as." #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "Vermenigvuldiging Vullijn" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "Zet elke vullijn om naar zoveel keer vullijnen. De extra lijnen kruisen elkaar niet, maar mijden elkaar. Hierdoor wordt de vulling stijver, maar duurt het printen langer en wordt er meer materiaal verbruikt." #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "Aantal Extra Wanden Rond vulling" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "" +msgstr "Voeg extra wanden toe rondom de vulling. Deze wanden kunnen ervoor zorgen dat de skin aan de boven-/onderkant minder doorzakt. Dit betekent dat u met alleen wat extra materiaal voor dezelfde kwaliteit minder skinlagen aan de boven-/onderkant nodig hebt.\nDeze optie kan in combinatie met de optie 'Polygonen voor de vulling verbinden' worden gebruikt om alle vulling in één doorvoerpad te verbinden zonder extra bewegingen of intrekkingen, mits correct ingesteld." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2779,7 +2775,7 @@ msgstr "Combing-modus" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "Met combing blijft de nozzle tijdens bewegingen binnen eerder geprinte delen. Hierdoor zijn de bewegingen iets langer, maar hoeft het filament minder vaak te worden ingetrokken. Als combing uitgeschakeld is, wordt het materiaal ingetrokken en beweegt de nozzle in een rechte lijn naar het volgende punt. Het is ook mogelijk om combing over boven-/onderskingedeelten te voorkomen en ook om alleen combing te gebruiken binnen de vulling. Houd er rekening mee dat de optie 'Binnen Vulling' precies dezelfde uitwerking heeft als de optie 'Niet in skin' in eerdere versies van Cura." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2799,7 +2795,7 @@ msgstr "Niet in skin" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "Binnen Vulling" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3244,22 +3240,22 @@ msgstr "De afstand tussen de geprinte lijnen van de supportstructuur. Deze inste #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "Lijnafstand Supportstructuur Eerste Laag" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "Afstand tussen de lijnen van de supportstructuur voor de eerste laag. Deze wordt berekend op basis van de dichtheid van de supportstructuur." #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "Lijnrichting Vulling Supportstructuur" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "Richting van het vulpatroon voor supportstructuren. Het vulpatroon voor de supportstructuur wordt in het horizontale vlak gedraaid." #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3629,22 +3625,22 @@ msgstr "Zigzag" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "Ventilatorsnelheid Overschrijven" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "Wanneer deze optie ingeschakeld is, wordt de ventilatorsnelheid voor het koelen van de print gewijzigd voor de skinregio's direct boven de supportstructuur." #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "Ondersteunde Ventilatorsnelheid Skin" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "Percentage van de ventilatorsnelheid dat tijdens het printen van skinregio's direct boven de supportstructuur moet worden gebruikt. Bij gebruikmaking van een hoge ventilatorsnelheid kan de supportstructuur gemakkelijker worden verwijderd." #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3796,9 +3792,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" -"De horizontale afstand tussen de skirt en de eerste laag van de print.\n" -"Dit is de minimumafstand. Als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint." +msgstr "De horizontale afstand tussen de skirt en de eerste laag van de print.\nDit is de minimumafstand. Als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3973,7 +3967,7 @@ msgstr "Breedte van de lijnen van de onderste laag van de raft. Deze lijnen moet #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "Tussenruimte Lijnen Grondvlak Raft" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4718,12 +4712,12 @@ msgstr "Grafiek om de materiaaldoorvoer (in mm3 per seconde) te koppelen aan de #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "Minimale Polygoonomtrek" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "Polygonen in geslicete lagen, die een kleinere omtrek hebben dan deze waarde, worden eruit gefilterd. Bij lagere waarden krijgt het raster een hogere resolutie, waardoor het slicen langer duurt. Dit is voornamelijk bedoeld voor SLA-printers met een hoge resolutie en zeer kleine 3D-modellen die veel details bevatten." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5235,9 +5229,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\n" -"Hierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten." +msgstr "De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\nHierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5387,22 +5379,22 @@ msgstr "De drempel of er al dan niet een kleinere laag moet worden gebruikt. Dez #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "Hoek Overhangende Wand" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "Wanden die overhangen in een hoek groter dan deze waarde, worden geprint met instellingen voor overhangende wanden. Wanneer de waarde 90 is, wordt een wand niet als een overhangende wand gezien." #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "Snelheid Overhangende Wand" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "Overhangende wanden worden geprint met een snelheid die gelijk is aan dit percentage van hun normale printsnelheid." #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po index f77df4d932..e23d4705bf 100644 --- a/resources/i18n/pt_PT/cura.po +++ b/resources/i18n/pt_PT/cura.po @@ -43,13 +43,13 @@ msgstr "Ficheiro G-code" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "O GCodeWriter não suporta modo sem texto." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "Crie um G-code antes de guardar." #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -65,11 +65,7 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "" -"

Um, ou mais, dos modelos 3D podem ter menos qualidade de impressão devido à dimensão do modelo 3D e definição de material:

\n" -"

{model_names}

\n" -"

Descubra como assegurar a melhor qualidade e fiabilidade possível da impressão.

\n" -"

Ver o guia de qualidade da impressão

" +msgstr "

Um, ou mais, dos modelos 3D podem ter menos qualidade de impressão devido à dimensão do modelo 3D e definição de material:

\n

{model_names}

\n

Descubra como assegurar a melhor qualidade e fiabilidade possível da impressão.

\n

Ver o guia de qualidade da impressão

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -112,7 +108,7 @@ msgstr "Ligado via USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "Existe uma impressão por USB em curso; fechar o Cura irá interromper esta impressão. Tem a certeza?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -139,7 +135,7 @@ msgstr "Ficheiro G-code comprimido" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "O GCodeGzWriter não suporta modo de texto." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -650,7 +646,7 @@ msgstr "Não é possível seccionar porque a torre de preparação ou a(s) posi #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "Não é possível seccionar porque existem objetos associados à extrusora %s desativada." # rever! # models fit the @@ -712,12 +708,12 @@ msgstr "Nozzle" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "O ficheiro de projeto {0} contém um tipo de máquina desconhecido {1}. Não é possível importar a máquina. Em vez disso, serão importados os modelos." #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "Abrir ficheiro de projeto" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -754,12 +750,12 @@ msgstr "Perfil Cura" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 msgctxt "@item:inmenu" msgid "Profile Assistant" -msgstr "" +msgstr "Assistente de perfis" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 msgctxt "@item:inlistbox" msgid "Profile Assistant" -msgstr "" +msgstr "Assistente de perfis" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:26 msgctxt "@item:inlistbox" @@ -774,7 +770,7 @@ msgstr "Ficheiro 3MF de Projeto Cura" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "Erro ao gravar ficheiro 3mf." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1105,12 +1101,7 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "" -"

Ups, o Ultimaker Cura encontrou um possível problema.

\n" -"

Foi encontrado um erro irrecuperável durante o arranque da aplicação. Este pode ter sido causado por alguns ficheiros de configuração incorrectos. Sugerimos que faça um backup e reponha a sua configuração.

\n" -"

Os backups estão localizados na pasta de configuração.

\n" -"

Por favor envie-nos este Relatório de Falhas para podermos resolver o problema.

\n" -" " +msgstr "

Ups, o Ultimaker Cura encontrou um possível problema.

\n

Foi encontrado um erro irrecuperável durante o arranque da aplicação. Este pode ter sido causado por alguns ficheiros de configuração incorrectos. Sugerimos que faça um backup e reponha a sua configuração.

\n

Os backups estão localizados na pasta de configuração.

\n

Por favor envie-nos este Relatório de Falhas para podermos resolver o problema.

\n " # rever! # button size? @@ -1145,10 +1136,7 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "" -"

Ocorreu um erro fatal no Cura. Por favor envie-nos este Relatório de Falhas para podermos resolver o problema

\n" -"

Por favor utilize o botão \"Enviar relatório\" para publicar um relatório de erros automaticamente nos nossos servidores

\n" -" " +msgstr "

Ocorreu um erro fatal no Cura. Por favor envie-nos este Relatório de Falhas para podermos resolver o problema

\n

Por favor utilize o botão \"Enviar relatório\" para publicar um relatório de erros automaticamente nos nossos servidores

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1497,7 +1485,7 @@ msgstr "Autor" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "Transferências" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1537,27 +1525,27 @@ msgstr "Anterior" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "Confirmar desinstalação " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "Está a desinstalar materiais e/ou perfis que ainda estão a ser utilizados. Mediante confirmação, as predefinições dos seguintes materiais/perfis serão repostas." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "Materiais" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "Perfis" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "Confirmar" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1572,17 +1560,17 @@ msgstr "Sair do Cura" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "Contribuições comunitárias" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "Plug-ins comunitários" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "Materiais genéricos" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1615,10 +1603,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Este plug-in contém uma licença.\n" -"É necessário aceitar esta licença para instalar o plug-in.\n" -"Concorda com os termos abaixo?" +msgstr "Este plug-in contém uma licença.\nÉ necessário aceitar esta licença para instalar o plug-in.\nConcorda com os termos abaixo?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1648,12 +1633,12 @@ msgstr "A obter pacotes..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "Site" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "E-mail" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1738,10 +1723,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Para imprimir diretamente para a sua impressora através da rede, certifique-se de que a sua impressora está ligada à rede por meio de um cabo de rede ou através de ligação à rede Wi-Fi. Se não ligar o Cura por rede à impressora, poderá ainda assim utilizar uma unidade USB para transferir ficheiros g-code para a impressora.\n" -"\n" -"Selecione a sua impressora na lista em baixo:" +msgstr "Para imprimir diretamente para a sua impressora através da rede, certifique-se de que a sua impressora está ligada à rede por meio de um cabo de rede ou através de ligação à rede Wi-Fi. Se não ligar o Cura por rede à impressora, poderá ainda assim utilizar uma unidade USB para transferir ficheiros g-code para a impressora.\n\nSelecione a sua impressora na lista em baixo:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1790,12 +1772,12 @@ msgstr "Endereço" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "Esta impressora não está configurada para alojar um grupo de impressoras." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "Esta impressora aloja um grupo de %1 impressoras." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1843,52 +1825,52 @@ msgstr "Imprimir" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "A aguardar: Impressora indisponível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "A aguardar: Primeira disponível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "A aguardar: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "Mover para o topo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "Mover trabalho de impressão para o topo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "Tem a certeza de que pretende mover %1 para o topo da fila?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "Eliminar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "Eliminar trabalho de impressão" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "Tem a certeza de que pretende eliminar %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "Gerir fila" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1903,40 +1885,40 @@ msgstr "A Imprimir" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "Gerir impressoras" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "Não disponível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "Inacessível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "Disponível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "Retomar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "Colocar em pausa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "Cancelar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 @@ -1947,13 +1929,13 @@ msgstr "Cancelar impressão" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "Tem a certeza de que deseja cancelar %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "Cancelado" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1963,12 +1945,12 @@ msgstr "Impressão terminada" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:670 msgctxt "@label:status" msgid "Preparing" -msgstr "" +msgstr "A preparar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "A colocar em pausa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2397,7 +2379,7 @@ msgstr "Abrir" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "Anterior" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2409,12 +2391,12 @@ msgstr "Exportar" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "Seguinte" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "Sugestão" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2453,22 +2435,22 @@ msgstr "Total:" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:205 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1 m / ~ %2 g / ~ %4 %3" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:210 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1 m / ~ %2 g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "Imprimir teste" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "Lista de verificação" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2699,7 +2681,7 @@ msgstr "Remova a impressão" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "Cancelar impressão" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -2716,9 +2698,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Alterou algumas das definições do perfil.\n" -"Gostaria de manter ou descartar essas alterações?" +msgstr "Alterou algumas das definições do perfil.\nGostaria de manter ou descartar essas alterações?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3164,7 +3144,7 @@ msgstr "Comportamento predefinido ao abrir um ficheiro de projeto: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "Perguntar sempre isto" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3184,22 +3164,22 @@ msgstr "Quando tiver realizado alterações a um perfil e mudado para outro, ser #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "Perfis" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "Comportamento predefinido para valores de definição alterados ao mudar para um perfil diferente: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "Descartar sempre definições alteradas" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "Transferir sempre definições alteradas para o novo perfil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3396,7 +3376,7 @@ msgstr "Adicionar Impressora" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "Sem título" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3418,9 +3398,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"O Cura foi desenvolvido pela Ultimaker B.V. em colaboração com a comunidade.\n" -"O Cura tem o prazer de utilizar os seguintes projetos open source:" +msgstr "O Cura foi desenvolvido pela Ultimaker B.V. em colaboração com a comunidade.\nO Cura tem o prazer de utilizar os seguintes projetos open source:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3536,10 +3514,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Alguns valores de definição/substituição são diferentes dos valores armazenados no perfil.\n" -"\n" -"Clique para abrir o gestor de perfis." +msgstr "Alguns valores de definição/substituição são diferentes dos valores armazenados no perfil.\n\nClique para abrir o gestor de perfis." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3597,10 +3572,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Algumas das definições invisíveis têm valores diferentes dos valores normais calculados automaticamente.\n" -"\n" -"Clique para tornar estas definições visíveis." +msgstr "Algumas das definições invisíveis têm valores diferentes dos valores normais calculados automaticamente.\n\nClique para tornar estas definições visíveis." # rever! # Afeta? @@ -3637,10 +3609,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Esta definição tem um valor que é diferente do perfil.\n" -"\n" -"Clique para restaurar o valor do perfil." +msgstr "Esta definição tem um valor que é diferente do perfil.\n\nClique para restaurar o valor do perfil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3648,10 +3617,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Normalmente, o valor desta definição é calculado, mas atualmente tem definido um valor diferente.\n" -"\n" -"Clique para restaurar o valor calculado." +msgstr "Normalmente, o valor desta definição é calculado, mas atualmente tem definido um valor diferente.\n\nClique para restaurar o valor calculado." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3776,17 +3742,17 @@ msgstr "Aqueçer a base com antecedência antes de imprimir. Pode continuar a aj #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "Favoritos" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "Genérico" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3884,9 +3850,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Configuração da Impressão desativada\n" -"Os ficheiros G-code não podem ser modificados" +msgstr "Configuração da Impressão desativada\nOs ficheiros G-code não podem ser modificados" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4237,17 +4201,17 @@ msgstr "&Ficheiro" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "&Guardar..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "&Exportar..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "Exportar seleção..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4349,13 +4313,13 @@ msgstr "Tem a certeza de que deseja iniciar um novo projeto? Isto irá apagar tu #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Fechar Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "Tem a certeza de que deseja sair do Cura?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4550,7 +4514,7 @@ msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "Utilizar cola com esta combinação de materiais" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4899,12 +4863,12 @@ msgstr "Atualização da versão 2.7 para 3.0" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Atualiza as configurações do Cura 3.4 para o Cura 3.5." #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "Atualização da versão 3.4 para 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" @@ -5021,12 +4985,12 @@ msgstr "Gravador de perfis Cura" #: CuraPrintProfileCreator/plugin.json msgctxt "description" msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." -msgstr "" +msgstr "Permite aos fabricantes de materiais criar novos materiais e perfis de qualidade utilizando uma IU de fácil acesso." #: CuraPrintProfileCreator/plugin.json msgctxt "name" msgid "Print Profile Assistant" -msgstr "" +msgstr "Assistente de perfis de impressão" #: 3MFWriter/plugin.json msgctxt "description" diff --git a/resources/i18n/pt_PT/fdmprinter.def.json.po b/resources/i18n/pt_PT/fdmprinter.def.json.po index f56cc56345..5545d3f2cd 100644 --- a/resources/i18n/pt_PT/fdmprinter.def.json.po +++ b/resources/i18n/pt_PT/fdmprinter.def.json.po @@ -58,9 +58,7 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "" -"Comandos G-code a serem executados no início – separados por \n" -"." +msgstr "Comandos G-code a serem executados no início – separados por \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -72,9 +70,7 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "" -"Comandos G-code a serem executados no fim – separados por \n" -"." +msgstr "Comandos G-code a serem executados no fim – separados por \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -1094,12 +1090,12 @@ msgstr "Ziguezague" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "Ligar polígonos superiores/inferiores" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "Ligar caminhos de revestimento superiores/inferiores quando as trajetórias são paralelas. Para o padrão concêntrico, ativar esta definição reduz consideravelmente o tempo de deslocação mas, uma vez que as ligações podem suceder num ponto intermediário sobre o enchimento, esta funcionalidade pode reduzir a qualidade da superfície superior." #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1193,22 +1189,22 @@ msgstr "Compensar o fluxo em partes de uma parede interior a ser impressa, onde #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "Fluxo de parede mínimo" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "Fluxo percentual mínimo permitido para uma linha de parede. A compensação de substituição de paredes reduz o fluxo de uma parede quando se situa junto a uma parede existente. As paredes cujo fluxo é inferior a este valor serão substituídas com um movimento de deslocação. Ao utilizar esta definição, deve ativar a compensação de sobreposição de paredes e imprimir a parede exterior antes das paredes interiores." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "Preferir retração" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "Se ativada, é utilizada retração em vez de combing para movimentos de deslocação que substituem paredes cujo fluxo está abaixo do limiar mínimo de fluxo." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1642,12 +1638,12 @@ msgstr "Ligar as extremidades onde o padrão de enchimento entra em contacto com #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "Ligar polígonos de enchimento" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "Ligar caminhos de enchimento quando as trajetórias são paralelas. Para padrões de enchimento que consistem em vários polígonos fechados, ativar esta definição reduz consideravelmente o tempo de deslocação." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1685,24 +1681,24 @@ msgstr "O padrão geométrico de enchimento é deslocado por esta distância ao #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "Multiplicador de linhas de enchimento" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "Converter cada linha de enchimento em determinado número de linhas. As linhas adicionais não se cruzam, mas sim evitam-se. Isto torna o enchimento mais duro, mas também aumenta o tempo de impressão e o gasto de material." #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "Contagem de paredes de enchimento adicionais" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "" +msgstr "Adicionar paredes adicionais em torno da área de enchimento. Essas paredes podem fazer com que as linhas de revestimento superiores/inferiores desçam menos, o que significa que são necessárias menos camadas de revestimento superior/inferior para a mesma qualidade à custa de algum material adicional.\nEsta funcionalidade pode ser combinada com a opção Ligar polígonos de enchimento para unir todo o enchimento num único caminho de extrusão sem necessidade de deslocações ou retrações, se configurado corretamente." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2901,7 +2897,7 @@ msgstr "Modo de Combing" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "Combing mantém o bocal em áreas já impressas durante a deslocação. Isto resulta em movimentos de deslocação ligeiramente mais longos, mas reduz a necessidade de retrações. Se o combing estiver desativado, o material será retraído e o bocal irá deslocar-se em linha reta para o próximo ponto. Também é possível evitar o combing em áreas de revestimento superiores/inferiores e também apenas efetuar o combing no enchimento. Observe que a opção \"No enchimento\" tem o mesmo comportamento que a opção \"Não no Revestimento\" em versões anteriores do Cura." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2921,7 +2917,7 @@ msgstr "Não no Revestimento" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "No Enchimento" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3384,22 +3380,22 @@ msgstr "A distância entre as linhas da estrutura de suporte impressas. Esta def #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "Distância da linha de suporte da camada inicial" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "Distância entre as linhas da estrutura de suporte da camada inicial impressas. Esta definição é calculada pela densidade do suporte." #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "Direção da linha de enchimento do suporte" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "Orientação do padrão de enchimento para suportes. O padrão de enchimento do suporte gira no plano horizontal." #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3772,22 +3768,22 @@ msgstr "Ziguezague" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "Substituir velocidade da ventoinha" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "Quando ativada, a velocidade da ventoinha de arrefecimento de impressão é alterada para as regiões de revestimento imediatamente acima do suporte." #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "Velocidade da ventoinha de revestimento suportada" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "Velocidade percentual da ventoinha a utilizar ao imprimir as regiões de revestimento imediatamente acima do suporte. A utilização de uma velocidade de ventoinha elevada facilita a remoção do suporte." #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3942,9 +3938,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" -"A distância horizontal entre o contorno e o perímetro exterior da primeira camada da impressão.\n" -"Esta é a distância mínima. Linhas múltiplas de contorno serão impressas para o exterior." +msgstr "A distância horizontal entre o contorno e o perímetro exterior da primeira camada da impressão.\nEsta é a distância mínima. Linhas múltiplas de contorno serão impressas para o exterior." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4120,7 +4114,7 @@ msgstr "O diâmetro das linhas na camada inferior (base) do raft. Devem ser linh #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "Espaçamento da Linha Base do Raft" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4892,12 +4886,12 @@ msgstr "Os dados que ligam o fluxo de material (em mm3 por segundo) à temperatu #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "Circunferência Mínima do Polígono" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "Os polígonos em camadas seccionadas que apresentem uma circunferência mais pequena do que este valor serão filtrados. Valores mais reduzidos originam malhas de resolução superior à custa do tempo de seccionamento. Destina-se principalmente a impressoras SLA de alta resolução e a modelos 3D muito pequenos com muitos detalhes." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5423,9 +5417,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"A distância de um movimento ascendente que é extrudido a metade da velocidade.\n" -"Isto pode causar melhor aderência às camadas anteriores, sendo que o material nessas camadas não é demasiado aquecido. Aplica-se apenas à impressão de fios." +msgstr "A distância de um movimento ascendente que é extrudido a metade da velocidade.\nIsto pode causar melhor aderência às camadas anteriores, sendo que o material nessas camadas não é demasiado aquecido. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5575,22 +5567,22 @@ msgstr "O limiar em que se deve usar, ou não, uma menor espessura de camada. Es #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "Ângulo da parede de saliências" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "As paredes que se salientam mais do que este ângulo serão impressas utilizando definições de parede de saliências. Quando o valor é 90, nenhuma parede será tratada como saliente." #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "Velocidade da parede de saliências" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "As paredes de saliências serão impressas a esta percentagem da sua velocidade de impressão normal." #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" diff --git a/resources/i18n/ru_RU/cura.po b/resources/i18n/ru_RU/cura.po index 3151acbd34..49ed8ab1a2 100644 --- a/resources/i18n/ru_RU/cura.po +++ b/resources/i18n/ru_RU/cura.po @@ -43,13 +43,13 @@ msgstr "Файл G-code" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "Средство записи G-кода (GCodeWriter) не поддерживает нетекстовый режим." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "Сгенерируйте G-код перед сохранением." #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -64,11 +64,7 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "" -"

Одна или несколько 3D-моделей могут не напечататься оптимальным образом из-за размера модели и конфигурации материала:

\n" -"

{model_names}

\n" -"

Узнайте, как обеспечить максимально возможное качество и высокую надежность печати.

\n" -"

Ознакомиться с руководством по качеству печати

" +msgstr "

Одна или несколько 3D-моделей могут не напечататься оптимальным образом из-за размера модели и конфигурации материала:

\n

{model_names}

\n

Узнайте, как обеспечить максимально возможное качество и высокую надежность печати.

\n

Ознакомиться с руководством по качеству печати

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -88,7 +84,7 @@ msgstr "Профиль был нормализован и активирован #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:40 msgctxt "@item:inmenu" msgid "USB printing" -msgstr "USB печать" +msgstr "Печать через USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:41 msgctxt "@action:button Preceded by 'Ready to'." @@ -108,7 +104,7 @@ msgstr "Подключено через USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "Выполняется печать через USB, закрытие Cura остановит эту печать. Вы уверены?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -135,7 +131,7 @@ msgstr "Сжатый файл с G-кодом" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "Средство записи G-кода с расширением GZ (GCodeGzWriter) не поддерживает текстовый режим." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -632,7 +628,7 @@ msgstr "Слайсинг невозможен, так как черновая б #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "Невозможно разделить на слои из-за наличия объектов, связанных с отключенным экструдером %s." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -688,12 +684,12 @@ msgstr "Сопло" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "Файл проекта {0} содержит неизвестный тип принтера {1}. Не удалось импортировать принтер. Вместо этого будут импортированы модели." #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "Открыть файл проекта" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -750,7 +746,7 @@ msgstr "3MF файл проекта Cura" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "Ошибка в ходе записи файла 3MF." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1078,12 +1074,7 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "" -"

В ПО Ultimaker Cura обнаружена ошибка.

\n" -"

Во время запуска обнаружена неустранимая ошибка. Возможно, она вызвана некоторыми файлами конфигурации с неправильными данными. Рекомендуется создать резервную копию конфигурации и сбросить ее.

\n" -"

Резервные копии хранятся в папке конфигурации.

\n" -"

Отправьте нам этот отчет о сбое для устранения проблемы.

\n" -" " +msgstr "

В ПО Ultimaker Cura обнаружена ошибка.

\n

Во время запуска обнаружена неустранимая ошибка. Возможно, она вызвана некоторыми файлами конфигурации с неправильными данными. Рекомендуется создать резервную копию конфигурации и сбросить ее.

\n

Резервные копии хранятся в папке конфигурации.

\n

Отправьте нам этот отчет о сбое для устранения проблемы.

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1116,10 +1107,7 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "" -"

В Cura возникла критическая ошибка. Отправьте нам этот отчет о сбое для устранения проблемы

\n" -"

Нажмите кнопку «Отправить отчет», чтобы автоматически опубликовать отчет об ошибке на наших серверах

\n" -" " +msgstr "

В Cura возникла критическая ошибка. Отправьте нам этот отчет о сбое для устранения проблемы

\n

Нажмите кнопку «Отправить отчет», чтобы автоматически опубликовать отчет об ошибке на наших серверах

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1466,7 +1454,7 @@ msgstr "Автор" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "Загрузки" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1506,27 +1494,27 @@ msgstr "Назад" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "Подтвердить удаление " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "Вы удаляете материалы и/или профили, которые все еще используются. Подтверждение приведет к сбросу указанных ниже материалов/профилей к их настройкам по умолчанию." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "Материалы" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "Профили" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "Подтвердить" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1541,17 +1529,17 @@ msgstr "Выйти из Cura" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "Вклад в развитие сообщества" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "Плагины сообщества" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "Универсальные материалы" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1584,10 +1572,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Этот плагин содержит лицензию.\n" -"Чтобы установить этот плагин, необходимо принять условия лицензии.\n" -"Принять приведенные ниже условия?" +msgstr "Этот плагин содержит лицензию.\nЧтобы установить этот плагин, необходимо принять условия лицензии.\nПринять приведенные ниже условия?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1617,12 +1602,12 @@ msgstr "Выборка пакетов..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "Веб-сайт" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "Электронная почта" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1707,10 +1692,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Для печати на вашем принтере через сеть, пожалуйста, удостоверьтесь, что ваш принтер подключен к сети с помощью кабеля или через WiFi. Если вы не подключили Cura к вашему принтеру, вы по-прежнему можете использовать USB флешку для переноса G-Code файлов на ваш принтер.\n" -"\n" -"Укажите ваш принтер в списке ниже:" +msgstr "Для печати на вашем принтере через сеть, пожалуйста, удостоверьтесь, что ваш принтер подключен к сети с помощью кабеля или через WiFi. Если вы не подключили Cura к вашему принтеру, вы по-прежнему можете использовать USB флешку для переноса G-Code файлов на ваш принтер.\n\nУкажите ваш принтер в списке ниже:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1759,12 +1741,12 @@ msgstr "Адрес" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "Данный принтер не настроен для управления группой принтеров." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "Данный принтер управляет группой из %1 принтера (-ов)." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1812,52 +1794,52 @@ msgstr "Печать" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "Ожидание: недоступный принтер" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "Ожидание: первое доступное" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "Ожидание: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "переместить в начало" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "Переместить задание печати в начало очереди" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "Вы уверены, что хотите переместить %1 в начало очереди?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "Удалить" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "Удалить задание печати" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "Вы уверены, что хотите удалить %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "Управление очередью" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1872,57 +1854,57 @@ msgstr "Печать" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "Управление принтерами" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "Недоступно" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "Недостижимо" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "Доступен" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "Продолжить" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "Пауза" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "Прервать" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 msgctxt "@window:title" msgid "Abort print" -msgstr "Прекращение печати" +msgstr "Прервать печать" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "Вы уверены, что хотите прервать %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "Прервано" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1937,7 +1919,7 @@ msgstr "Подготовка" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "Приостановка" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2357,7 +2339,7 @@ msgstr "Открыть" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "Предыдущий" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2369,12 +2351,12 @@ msgstr "Экспорт" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "Следующий" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "Кончик" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2423,12 +2405,12 @@ msgstr "%1 м / ~ %2 г" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "Пробная печать" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "Контрольный список" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2651,7 +2633,7 @@ msgstr "Пожалуйста, удалите напечатанное" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "Прервать печать" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -2668,9 +2650,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Вы изменили некоторые параметры профиля.\n" -"Желаете сохранить их или вернуть к прежним значениям?" +msgstr "Вы изменили некоторые параметры профиля.\nЖелаете сохранить их или вернуть к прежним значениям?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2888,7 +2868,7 @@ msgstr "Материал успешно экспортирован в #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 msgctxt "@title:tab" msgid "Setting Visibility" -msgstr "Видимость настроек" +msgstr "Видимость параметров" #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:50 msgctxt "@label:textbox" @@ -3114,7 +3094,7 @@ msgstr "Стандартное поведение при открытии фай #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "Всегда спрашивать меня" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3134,22 +3114,22 @@ msgstr "При внесении изменений в профиль и пере #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "Профили" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "Поведение по умолчанию для измененных значений настройки при переключении на другой профиль: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "Всегда сбрасывать измененные настройки" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "Всегда передавать измененные настройки новому профилю" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3344,7 +3324,7 @@ msgstr "Добавить принтер" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "Без имени" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3366,9 +3346,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura разработана компанией Ultimaker B.V. совместно с сообществом.\n" -"Cura использует следующие проекты с открытым исходным кодом:" +msgstr "Cura разработана компанией Ultimaker B.V. совместно с сообществом.\nCura использует следующие проекты с открытым исходным кодом:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3481,10 +3459,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Значения некоторых параметров отличаются от значений профиля.\n" -"\n" -"Нажмите для открытия менеджера профилей." +msgstr "Значения некоторых параметров отличаются от значений профиля.\n\nНажмите для открытия менеджера профилей." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3538,10 +3513,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Некоторые из скрытых параметров используют значения, отличающиеся от их вычисленных значений.\n" -"\n" -"Щёлкните, чтобы сделать эти параметры видимыми." +msgstr "Некоторые из скрытых параметров используют значения, отличающиеся от их вычисленных значений.\n\nЩёлкните, чтобы сделать эти параметры видимыми." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3569,10 +3541,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Значение этого параметра отличается от значения в профиле.\n" -"\n" -"Щёлкните для восстановления значения из профиля." +msgstr "Значение этого параметра отличается от значения в профиле.\n\nЩёлкните для восстановления значения из профиля." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3580,10 +3549,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Обычно это значение вычисляется, но в настоящий момент было установлено явно.\n" -"\n" -"Щёлкните для восстановления вычисленного значения." +msgstr "Обычно это значение вычисляется, но в настоящий момент было установлено явно.\n\nЩёлкните для восстановления вычисленного значения." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3677,7 +3643,7 @@ msgstr "Сопло, вставленное в данный экструдер." #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:493 msgctxt "@label" msgid "Build plate" -msgstr "Стол" +msgstr "Рабочий стол" #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/HeatedBedBox.qml:55 msgctxt "@tooltip" @@ -3702,17 +3668,17 @@ msgstr "Нагрев горячего стола перед печатью. Вы #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "Материал" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "Избранные" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "Универсальные" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3810,9 +3776,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Настройка принтера отключена\n" -"G-code файлы нельзя изменять" +msgstr "Настройка принтера отключена\nG-code файлы нельзя изменять" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -3917,7 +3881,7 @@ msgstr "Управление материалами…" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" -msgstr "Обновить профиль, используя текущие параметры" +msgstr "Обновить профиль текущими параметрами" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:184 msgctxt "@action:inmenu menubar:profile" @@ -4157,17 +4121,17 @@ msgstr "Файл" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "&Сохранить…" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "&Экспорт…" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "Экспорт выбранного…" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4269,13 +4233,13 @@ msgstr "Вы действительно желаете начать новый #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Закрытие Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "Вы уверены, что хотите выйти из Cura?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4458,7 +4422,7 @@ msgstr "Материал" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "Использовать клей с этой комбинацией материалов" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4778,52 +4742,52 @@ msgstr "Обновление версии 3.3 до 3.4" #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." -msgstr "Обновляет конфигурацию Cura 2.5 до Cura 2.6." +msgstr "Обновляет настройки Cura 2.5 до Cura 2.6." #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "name" msgid "Version Upgrade 2.5 to 2.6" -msgstr "Обновление версии с 2.5 до 2.6" +msgstr "Обновление версии 2.5 до 2.6" #: VersionUpgrade/VersionUpgrade27to30/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." -msgstr "Обновляет конфигурацию Cura 2.7 до Cura 3.0." +msgstr "Обновляет настройки Cura 2.7 до Cura 3.0." #: VersionUpgrade/VersionUpgrade27to30/plugin.json msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" -msgstr "Обновление версии с 2.7 до 3.0" +msgstr "Обновление версии 2.7 до 3.0" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Обновляет настройки Cura 3.4 до Cura 3.5." #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "Обновление версии 3.4 до 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "Обновление конфигураций с Cura 3.0 до Cura 3.1." +msgstr "Обновление настроек Cura 3.0 до Cura 3.1." #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "Обновление версии с 3.0 до 3.1" +msgstr "Обновление версии 3.0 до 3.1" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." -msgstr "Обновляет конфигурацию Cura 2.6 до Cura 2.7." +msgstr "Обновляет настройки Cura 2.6 до Cura 2.7." #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "name" msgid "Version Upgrade 2.6 to 2.7" -msgstr "Обновление версии с 2.6 до 2.7" +msgstr "Обновление версии 2.6 до 2.7" #: VersionUpgrade/VersionUpgrade21to22/plugin.json msgctxt "description" @@ -4838,7 +4802,7 @@ msgstr "Обновление версии 2.1 до 2.2" #: VersionUpgrade/VersionUpgrade22to24/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." -msgstr "Обновляет конфигурации Cura 2.2 до Cura 2.4." +msgstr "Обновляет настройки Cura 2.2 до Cura 2.4." #: VersionUpgrade/VersionUpgrade22to24/plugin.json msgctxt "name" diff --git a/resources/i18n/ru_RU/fdmprinter.def.json.po b/resources/i18n/ru_RU/fdmprinter.def.json.po index 17efdcadaf..aa5d716e55 100644 --- a/resources/i18n/ru_RU/fdmprinter.def.json.po +++ b/resources/i18n/ru_RU/fdmprinter.def.json.po @@ -58,9 +58,7 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "" -"Команды в G-коде, которые будут выполнены в самом начале, разделенные с помощью \n" -"." +msgstr "Команды в G-коде, которые будут выполнены в самом начале, разделенные с помощью \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -72,9 +70,7 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "" -"Команды в G-коде, которые будут выполнены в самом конце, разделенные с помощью \n" -"." +msgstr "Команды в G-коде, которые будут выполнены в самом конце, разделенные с помощью \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -1074,12 +1070,12 @@ msgstr "Зигзаг" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "Соединение верхних/нижних полигонов" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "Соединение верхних/нижних путей оболочки на участках, где они проходят рядом. При использовании концентрического шаблона активация данной настройки значительно сокращает время перемещения, но, учитывая возможность наличия соединений на полпути над заполнением, эта функция может ухудшить качество верхней оболочки." #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1164,22 +1160,22 @@ msgstr "Компенсирует поток для печатаемых част #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "Минимальный поток для стенки" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "Минимальный разрешенный поток (в процентах) для линии стенки. Компенсация перекрытия стенок снижает поток для стенки при нахождении вблизи от существующей стенки. Стенки с потоком меньше указанного значения будут заменены посредством движения. При использовании этой настройки необходимо активировать компенсацию перекрытия стенок и печатать сначала внешнюю стенку, а затем — внутренние." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "Предпочтительный откат" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "Если включено, вместо комбинга для движений, заменяющих стенки с потоком меньше минимального установленного порога, используется откат." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1574,12 +1570,12 @@ msgstr "Соединение мест пересечения шаблона за #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "Соединение полигонов заполнения" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "Соединение путей заполнения на участках, где они проходят рядом. Для шаблонов заполнения, состоящих из нескольких замкнутых полигонов, активация данной настройки значительно сокращает время перемещения." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1614,24 +1610,24 @@ msgstr "Расстояние перемещения шаблона заполн #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "Множитель для линии заполнения" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "Преобразовывать каждую линию заполнения во множество линий. Дополнительные линии не пересекаются, а уклоняются от столкновения друг с другом. Благодаря этому заполнение становится более плотным, но время печати и расход материалов увеличиваются." #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "Количество дополнительных стенок заполнения" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "" +msgstr "Добавление дополнительных стенок вокруг области заполнения. Эти стенки могут уменьшить провисание верхних/нижних линий оболочки, что уменьшает необходимое количество верхних/нижних слоев оболочки без ухудшения качества за счет небольшого увеличения количества материала.\nЭта функция может сочетаться с соединением полигонов заполнения для соединения всего участка заполнения в один путь экструзии без необходимости в движениях или откатах в случае правильной настройки." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2751,7 +2747,7 @@ msgstr "Рывок перемещения первого слоя" #: fdmprinter.def.json msgctxt "jerk_travel_layer_0 description" msgid "The acceleration for travel moves in the initial layer." -msgstr "Изменение максимальной мгновенной скорости, с которой происходят перемещения на первом слое." +msgstr "Ускорение для перемещения на первом слое." #: fdmprinter.def.json msgctxt "jerk_skirt_brim label" @@ -2781,7 +2777,7 @@ msgstr "Режим комбинга" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "Комбинг удерживает сопло внутри напечатанных зон при перемещении. Это выражается в небольшом увеличении пути, но уменьшает необходимость в откатах. При отключенном комбинге выполняется откат материала, а сопло передвигается в следующую точку по прямой. Также можно не применять комбинг над верхними/нижними областями оболочки, разрешив комбинг только в области заполнения. Обратите внимание, что опция «В области заполнения» предполагает те же действия, что и опция «Не в оболочке» более ранних выпусков Cura." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2801,7 +2797,7 @@ msgstr "Не в оболочке" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "В области заполнения" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3246,22 +3242,22 @@ msgstr "Дистанция между напечатанными линями с #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "Дистанция между линиями поддержки первого слоя" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "Дистанция между напечатанными линиями структуры поддержек первого слоя. Этот параметр вычисляется по плотности поддержек." #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "Направление линии заполнения поддержек" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "Ориентация шаблона заполнения для поддержек. Шаблон заполнения поддержек вращается в горизонтальной плоскости." #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3631,22 +3627,22 @@ msgstr "Зигзаг" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "Переопределение скорости вентилятора" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "Если включено, скорость охлаждающего вентилятора, используемого во время печати, изменяется для областей оболочки непосредственно над поддержкой." #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "Поддерживаемая скорость вентилятора для оболочки" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "Скорость вентилятора в процентах, с которой печатаются области оболочки непосредственно над поддержкой. Использование высоких значений скорости вентилятора может упростить снятие поддержки." #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3701,7 +3697,7 @@ msgstr "Будет поддерживать всё ниже объекта, ни #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" -msgstr "Прилипание к столу" +msgstr "Тип прилипания к столу" #: fdmprinter.def.json msgctxt "platform_adhesion description" @@ -3766,7 +3762,7 @@ msgstr "Подложка" #: fdmprinter.def.json msgctxt "adhesion_type option none" msgid "None" -msgstr "Отсутствует" +msgstr "Нет" #: fdmprinter.def.json msgctxt "adhesion_extruder_nr label" @@ -3798,9 +3794,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" -"Горизонтальное расстояние между юбкой и первым слоем печати.\n" -"Минимальное расстояние. Несколько линий юбки будут расширяться от этого расстояния." +msgstr "Горизонтальное расстояние между юбкой и первым слоем печати.\nМинимальное расстояние. Несколько линий юбки будут расширяться от этого расстояния." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3975,7 +3969,7 @@ msgstr "Ширина линий нижнего слоя подложки. Она #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "Дистанция между линиями нижнего слоя подложки" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4720,12 +4714,12 @@ msgstr "График, объединяющий поток (в мм3 в секу #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "Минимальная длина окружности полигона" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "Полигоны в разделенных слоях, длина окружности которых меньше указанной величины, будут отфильтрованы. Пониженные значения приводят к увеличению разрешения объекта за счет времени разделения. Это предназначено главным образом для принтеров SLA с высоким разрешением и миниатюрных 3D-моделей с множеством деталей." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5237,9 +5231,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\n" -"Это может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при каркасной печати." +msgstr "Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\nЭто может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при каркасной печати." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5389,22 +5381,22 @@ msgstr "Пороговое значение, при достижении кот #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "Угол нависающей стенки" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "Стенки, нависающие под углом, который больше указанного, будут напечатаны с использованием настроек нависающей стенки. Если значение составляет 90, стенки не считаются нависающими." #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "Скорость печати нависающей стенки" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "Нависающие стенки будут напечатаны с данным процентным значением нормальной скорости печати." #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" diff --git a/resources/i18n/tr_TR/cura.po b/resources/i18n/tr_TR/cura.po index 8c85d5c456..057036220b 100644 --- a/resources/i18n/tr_TR/cura.po +++ b/resources/i18n/tr_TR/cura.po @@ -41,13 +41,13 @@ msgstr "G-code dosyası" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "GCodeWriter metin dışı modu desteklemez." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "Lütfen kaydetmeden önce G-code oluşturun." #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -62,11 +62,7 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "" -"

Model boyutu ve model yapılandırması nedeniyle bir veya daha fazla 3D model optimum yazdırılamayabilir:

\n" -"

{model_names}

\n" -"

En iyi kalite ve güvenilirliği nasıl elde edeceğinizi öğrenin.

\n" -"

Yazdırma kalitesi kılavuzunu görüntüleyin

" +msgstr "

Model boyutu ve model yapılandırması nedeniyle bir veya daha fazla 3D model optimum yazdırılamayabilir:

\n

{model_names}

\n

En iyi kalite ve güvenilirliği nasıl elde edeceğinizi öğrenin.

\n

Yazdırma kalitesi kılavuzunu görüntüleyin

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -106,7 +102,7 @@ msgstr "USB ile bağlı" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "USB’den yazdırma devam ediyor, Cura’yı kapatmanız bu yazdırma işlemini durduracak. Emin misiniz?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -133,7 +129,7 @@ msgstr "Sıkıştırılmış G-code Dosyası" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "GCodeGzWriter yazı modunu desteklemez." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -630,7 +626,7 @@ msgstr "İlk direk veya ilk konum(lar) geçersiz olduğu için dilimlenemiyor." #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "Etkisizleştirilmiş Extruder %s ile ilgili nesneler olduğundan dilimleme yapılamıyor." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -686,12 +682,12 @@ msgstr "Nozül" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "Proje dosyası {0} bilinmeyen bir makine tipi içeriyor: {1}. Makine alınamıyor. Bunun yerine modeller alınacak." #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "Proje Dosyası Aç" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -748,7 +744,7 @@ msgstr "Cura Projesi 3MF dosyası" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "3mf dosyasını yazarken hata oluştu." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1076,12 +1072,7 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "" -"

Ultimaker Cura doğru görünmeyen bir şeyle karşılaştı.

\n" -"

Başlatma esnasında kurtarılamaz bir hata ile karşılaştık. Muhtemelen bazı hatalı yapılandırma dosyalarından kaynaklanıyordu. Yapılandırmanızı yedekleyip sıfırlamanızı öneriyoruz.

\n" -"

Yedekler yapılandırma klasöründe bulunabilir.

\n" -"

Sorunu düzeltmek için lütfen bu Çökme Raporunu bize gönderin.

\n" -" " +msgstr "

Ultimaker Cura doğru görünmeyen bir şeyle karşılaştı.

\n

Başlatma esnasında kurtarılamaz bir hata ile karşılaştık. Muhtemelen bazı hatalı yapılandırma dosyalarından kaynaklanıyordu. Yapılandırmanızı yedekleyip sıfırlamanızı öneriyoruz.

\n

Yedekler yapılandırma klasöründe bulunabilir.

\n

Sorunu düzeltmek için lütfen bu Çökme Raporunu bize gönderin.

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1114,10 +1105,7 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "" -"

Cura’da onarılamaz bir hata oluştu. Lütfen sorunu çözmek için bize Çökme Raporunu gönderin

\n" -"

Sunucularımıza otomatik olarak bir hata raporu yüklemek için lütfen \"Rapor gönder\" düğmesini kullanın

\n" -" " +msgstr "

Cura’da onarılamaz bir hata oluştu. Lütfen sorunu çözmek için bize Çökme Raporunu gönderin

\n

Sunucularımıza otomatik olarak bir hata raporu yüklemek için lütfen \"Rapor gönder\" düğmesini kullanın

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1464,7 +1452,7 @@ msgstr "Yazar" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "İndirmeler" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1504,27 +1492,27 @@ msgstr "Geri" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "Kaldırmayı onayla " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "Kullanımda olan materyalleri ve/veya profilleri kaldırıyorsunuz. Onay verirseniz aşağıdaki materyaller/profiller varsayılan değerlerine sıfırlanacaktır." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "Malzemeler" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "Profiller" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "Onayla" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1539,17 +1527,17 @@ msgstr "Cura’dan Çıkın" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "Topluluk Katkıları" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "Topluluk Eklentileri" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "Genel Materyaller" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1582,10 +1570,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Bu eklenti bir lisans içerir.\n" -"Bu eklentiyi yüklemek için bu lisansı kabul etmeniz gerekir.\n" -"Aşağıdaki koşulları kabul ediyor musunuz?" +msgstr "Bu eklenti bir lisans içerir.\nBu eklentiyi yüklemek için bu lisansı kabul etmeniz gerekir.\nAşağıdaki koşulları kabul ediyor musunuz?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1615,12 +1600,12 @@ msgstr "Paketler alınıyor..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "Web sitesi" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "E-posta" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1705,10 +1690,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n" -"\n" -"Aşağıdaki listeden yazıcınızı seçin:" +msgstr "Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n\nAşağıdaki listeden yazıcınızı seçin:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1757,12 +1739,12 @@ msgstr "Adres" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "Bu yazıcı, bir yazıcı grubunu barındırmak için ayarlı değildir." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "Bu yazıcı, %1 yazıcı grubunun ana makinesidir." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1810,52 +1792,52 @@ msgstr "Yazdır" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "Bekleniyor: Kullanım dışı yazıcı" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "Bekleniyor: İlk mevcut olan" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "Bekleniyor: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "En üste taşı" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "Yazdırma işini en üste taşı" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "%1 öğesini kuyruğun en üstüne taşımak ister misiniz?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "Sil" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "Yazdırma işini sil" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "%1 öğesini silmek istediğinizden emin misiniz?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "Kuyruğu yönet" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1870,40 +1852,40 @@ msgstr "Yazdırma" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "Yazıcıları yönet" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "Mevcut değil" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "Ulaşılamıyor" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "Mevcut" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "Devam et" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "Duraklat" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "Durdur" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 @@ -1914,13 +1896,13 @@ msgstr "Yazdırmayı durdur" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "%1 öğesini durdurmak istediğinizden emin misiniz?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "Durduruldu" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1935,7 +1917,7 @@ msgstr "Hazırlanıyor" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "Duraklatılıyor" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2353,7 +2335,7 @@ msgstr "Aç" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "Önceki" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2365,12 +2347,12 @@ msgstr "Dışa Aktar" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "Sonraki" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "İpucu" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2419,12 +2401,12 @@ msgstr "%1 m / ~ %2 g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "Yazdırma denemesi" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "Kontrol listesi" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2647,7 +2629,7 @@ msgstr "Lütfen yazıcıyı çıkarın " #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "Yazdırmayı Durdur" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -2664,9 +2646,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Bazı profil ayarlarını özelleştirdiniz.\n" -"Bu ayarları kaydetmek veya iptal etmek ister misiniz?" +msgstr "Bazı profil ayarlarını özelleştirdiniz.\nBu ayarları kaydetmek veya iptal etmek ister misiniz?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3110,7 +3090,7 @@ msgstr "Bir proje dosyası açıldığında varsayılan davranış: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "Her zaman sor" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3130,22 +3110,22 @@ msgstr "Bir profil üzerinde değişiklik yapıp farklı bir profile geçtiğini #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "Profiller" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "Farklı bir profile geçerken değişen ayar değerleriyle ilgili varsayılan davranış: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "Değiştirilen ayarları her zaman at" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "Değiştirilen ayarları her zaman yeni profile taşı" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3340,7 +3320,7 @@ msgstr "Yazıcı Ekle" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "Başlıksız" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3362,9 +3342,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura, topluluk iş birliği ile Ultimaker B.V. tarafından geliştirilmiştir.\n" -"Cura aşağıdaki açık kaynak projelerini gururla kullanmaktadır:" +msgstr "Cura, topluluk iş birliği ile Ultimaker B.V. tarafından geliştirilmiştir.\nCura aşağıdaki açık kaynak projelerini gururla kullanmaktadır:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3477,10 +3455,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Bazı ayar/geçersiz kılma değerleri profilinizde saklanan değerlerden farklıdır.\n" -"\n" -"Profil yöneticisini açmak için tıklayın." +msgstr "Bazı ayar/geçersiz kılma değerleri profilinizde saklanan değerlerden farklıdır.\n\nProfil yöneticisini açmak için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3534,10 +3509,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Gizlenen bazı ayarlar normal hesaplanan değerden farklı değerler kullanır.\n" -"\n" -"Bu ayarları görmek için tıklayın." +msgstr "Gizlenen bazı ayarlar normal hesaplanan değerden farklı değerler kullanır.\n\nBu ayarları görmek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3565,10 +3537,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Bu ayarın değeri profilden farklıdır.\n" -"\n" -"Profil değerini yenilemek için tıklayın." +msgstr "Bu ayarın değeri profilden farklıdır.\n\nProfil değerini yenilemek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3576,10 +3545,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Bu ayar normal olarak yapılır ama şu anda mutlak değer ayarı var.\n" -"\n" -"Hesaplanan değeri yenilemek için tıklayın." +msgstr "Bu ayar normal olarak yapılır ama şu anda mutlak değer ayarı var.\n\nHesaplanan değeri yenilemek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3698,17 +3664,17 @@ msgstr "Yazdırma öncesinde yatağı ısıt. Isıtma sırasında yazdırma işi #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "Malzeme" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "Favoriler" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "Genel" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3804,9 +3770,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Yazdırma Ayarı devre dışı\n" -"G-code dosyaları üzerinde değişiklik yapılamaz" +msgstr "Yazdırma Ayarı devre dışı\nG-code dosyaları üzerinde değişiklik yapılamaz" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4148,17 +4112,17 @@ msgstr "&Dosya" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "&Kaydet..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "&Dışa Aktar..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "Seçimi Dışa Aktar..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4260,13 +4224,13 @@ msgstr "Yeni bir proje başlatmak istediğinizden emin misiniz? Bu işlem yapı #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Cura Kapatılıyor" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "Cura’dan çıkmak istediğinizden emin misiniz?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4448,7 +4412,7 @@ msgstr "Malzeme" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "Bu malzeme kombinasyonuyla yapışkan kullan" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4788,12 +4752,12 @@ msgstr "2.7’den 3.0’a Sürüm Yükseltme" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Yapılandırmaları Cura 3.4’ten Cura 3.5’e yükseltir." #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "3.4’ten 3.5’e Sürüm Yükseltme" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" diff --git a/resources/i18n/tr_TR/fdmprinter.def.json.po b/resources/i18n/tr_TR/fdmprinter.def.json.po index d8d7bd6524..7a6778aeff 100644 --- a/resources/i18n/tr_TR/fdmprinter.def.json.po +++ b/resources/i18n/tr_TR/fdmprinter.def.json.po @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "" -" \n" -" ile ayrılan, başlangıçta yürütülecek G-code komutları." +msgstr " \n ile ayrılan, başlangıçta yürütülecek G-code komutları." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "" -" \n" -" ile ayrılan, bitişte yürütülecek G-code komutları." +msgstr " \n ile ayrılan, bitişte yürütülecek G-code komutları." #: fdmprinter.def.json msgctxt "material_guid label" @@ -1072,12 +1068,12 @@ msgstr "Zikzak" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "Üst/Alt Poligonları Bağla" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "Üst/alt yüzey yollarını yan yana ise bağla. Eş merkezli şekil için bu ayarı etkinleştirmek hareket süresini önemli ölçüde kısaltır; ancak bağlantılar dolgunun üzerinde meydana gelebileceğinden bu özellik üst yüzeyin kalitesini düşürebilir." #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1162,22 +1158,22 @@ msgstr "Halihazırda duvarın olduğu bir yere yazdırılan bir iç duvarın par #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "Minimum Duvar Akışı" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "Bir duvar hattı için izin verilen en düşük yüzde akımdır. Duvar çakışması, mevcut bir duvara yakın duruyorsa bir duvarın akışını azaltır. Akışları bu değerden düşük olan duvarların yerine hareket hamlesi konacaktır. Bu ayarı kullanırken duvar çakışma telafisini açmanız ve iç duvardan önce dış duvarı yazdırmanız gerekir." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "Geri Çekmeyi Tercih Et" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "Geri çekme etkinleştirildiğinde, akışları minimum akış eşiğinin altındaki duvarların yerini alacak hareketleri taramak yerine geri çekme kullanılır." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1572,12 +1568,12 @@ msgstr "İç duvarın şeklini takip eden bir hattı kullanarak dolgu şeklinin #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "Dolgu Poligonlarını Bağla" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "Yan yana giden dolgu yollarını bağla. Birkaç kapalı poligondan oluşan dolgu şekilleri için bu ayarı etkinleştirmek hareket süresini büyük ölçüde kısaltır." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1612,24 +1608,24 @@ msgstr "Dolgu şekli Y ekseni boyunca bu mesafe kadar kaydırılır." #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "Dolgu Hattı Çoğaltıcı" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "Her bir dolgu hattını bu sayıda hatta dönüştür. Ekstra hatlar birbirlerini kesmez, birbirlerinden bağımsız kalırlar. Bu dolguyu sertleştirir, ancak yazdırma süresini uzatırken materyal kullanımını artırır." #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "Ekstra Dolgu Duvar Sayısı" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "" +msgstr "Dolgu alanının etrafına ekstra duvar ekle. Bu duvarlar üst/alt yüzey hatlarının daha az aşağı düşmesini sağlar. Yani biraz fazla materyal kullanarak, daha az üst/alt yüzey katmanı ile aynı kaliteyi yakalayabilirsiniz.\nBu özellik, doğru konfigüre edildiğinde, harekete veya geri çekmeye gerek kalmadan Dolgu Poligonlarını Bağlama ile birlikte tüm dolguyu tek bir ekstrüzyon yoluna bağlayabilir." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2779,7 +2775,7 @@ msgstr "Tarama Modu" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "Tarama, hareket sırasında nozülü daha önce yazdırılmış alanlarda tutar. Bu durum hareketleri biraz uzatır ancak geri çekme ihtiyacını azaltır. Tarama kapalıysa materyal geri çekilecektir, nozül de bir sonraki noktaya düz bir çizgi üzerinden gider. Üst/alt yüzey alanlarının üzerinde tarama yapmayarak sadece dolgu içerisinde tarama yapılabilir. “Dolgu İçinde” seçeneğinin daha önceki Cura sürümlerinde bulunan “Yüzey Alanında Değil” seçeneğiyle tamamen aynı davranışı gösterdiğini unutmayın." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2799,7 +2795,7 @@ msgstr "Yüzey Alanında Değil" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "Dolgu İçinde" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3244,22 +3240,22 @@ msgstr "Yazdırılan destek yapısı hatları arasındaki mesafe. Bu ayar, deste #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "İlk Katman Destek Hattı Mesafesi" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "Yazdırılan ilk katman destek yapı hatları arasındaki mesafedir. Bu ayar destek yoğunluğuna göre hesaplanır." #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "Destek Dolgu Hattı Yönü" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "Destekler için dolgu şeklinin döndürülmesi. Destek dolgu şekli yatay düzlemde döndürülür." #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3629,22 +3625,22 @@ msgstr "Zikzak" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "Fan Hızı Geçersiz Kılma" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "Bu ayar etkinleştirildiğinde, yazıcı soğutma fanının hızı desteğin hemen üzerindeki yüzey bölgeleri için değiştirilir." #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "Desteklenen Yüzey Fan Hızı" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "Desteğin hemen üzerindeki yüzey bölgeleri yazdırılırken kullanılacak yüzdelik fan hızıdır. Yüksek fan hızı kullanmak desteğin daha kolay kaldırılmasını sağlayabilir." #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3796,9 +3792,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" -"Baskının eteği ve ilk katmanı arasındaki yatay mesafe.\n" -"Minimum mesafedir. Bu mesafeden çok sayıda etek hattı dışarı doğru uzanır." +msgstr "Baskının eteği ve ilk katmanı arasındaki yatay mesafe.\nMinimum mesafedir. Bu mesafeden çok sayıda etek hattı dışarı doğru uzanır." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3973,7 +3967,7 @@ msgstr "Radyenin taban katmanındaki hatların genişliği. Bunlar, yapı levhas #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "Radye Taban Hat Genişliği" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4718,12 +4712,12 @@ msgstr "Malzeme akışını (saniye başına mm3 bazında) sıcaklığa (santigr #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "Minimum Poligon Çevre Uzunluğu" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "Bu miktardan daha kısa çevre uzunluğuna sahip dilimlenmiş katmanlardaki poligonlar filtre ile elenecektir. Daha düşük değerler dilimleme süresini uzatacak ancak daha yüksek çözünürlükte bir ağ oluşturacaktır. Genellikle yüksek çözünürlüklü SLA yazıcılarına yöneliktir ve çok fazla detay içeren çok küçük 3D modellerinde kullanılır." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5235,9 +5229,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"Yarı hızda sıkıştırılmış yukarı doğru hareket mesafesi.\n" -"Bu katmanlarda malzemeyi çok fazla ısıtmayarak önceki katmanlarda daha iyi yapışma sağlayabilir. Sadece kablo yazdırmaya uygulanır." +msgstr "Yarı hızda sıkıştırılmış yukarı doğru hareket mesafesi.\nBu katmanlarda malzemeyi çok fazla ısıtmayarak önceki katmanlarda daha iyi yapışma sağlayabilir. Sadece kablo yazdırmaya uygulanır." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5387,22 +5379,22 @@ msgstr "Daha küçük bir katmanın kullanılıp kullanılmayacağını belirley #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "Çıkıntılı Duvar Açısı" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "Bu açıdan daha fazla çıkıntı yapan duvarlar çıkıntılı duvar ayarları kullanılarak yazdırılacaktır. Değer 90 ise hiçbir duvar çıkıntılı kabul edilmeyecektir." #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "Çıkıntılı Duvar Hızı" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "Çıkıntılı duvarlar, normal yazdırma hızına göre bu yüzdeye denk bir hızda yazdırılacaktır." #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" diff --git a/resources/i18n/zh_CN/cura.po b/resources/i18n/zh_CN/cura.po index 7627e91a91..1c32f85fe6 100644 --- a/resources/i18n/zh_CN/cura.po +++ b/resources/i18n/zh_CN/cura.po @@ -43,13 +43,13 @@ msgstr "GCode 文件" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "GCodeWriter 不支持非文本模式。" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "保存之前,请生成 G-code。" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -64,11 +64,7 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "" -"

由于模型的大小和材质的配置,一个或多个3D模型可能无法最优地打印:

\n" -"

{model_names}

\n" -"

找出如何确保最好的打印质量和可靠性.

\n" -"

查看打印质量指南

" +msgstr "

由于模型的大小和材质的配置,一个或多个3D模型可能无法最优地打印:

\n

{model_names}

\n

找出如何确保最好的打印质量和可靠性.

\n

查看打印质量指南

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -108,7 +104,7 @@ msgstr "通过 USB 连接" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "正在进行 USB 打印,关闭 Cura 将停止此打印。您确定吗?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -135,7 +131,7 @@ msgstr "压缩 G-code 文件" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "GCodeGzWriter 不支持文本模式。" #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -632,7 +628,7 @@ msgstr "无法切片(原因:主塔或主位置无效)。" #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "无法切片,因为存在与已禁用挤出机 %s 相关联的对象。" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -688,12 +684,12 @@ msgstr "喷嘴" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "项目文件 {0} 包含未知机器类型 {1}。无法导入机器。将改为导入模型。" #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "打开项目文件" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -750,7 +746,7 @@ msgstr "Cura 项目 3MF 文件" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "写入 3mf 文件时出错。" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1078,12 +1074,7 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "" -"

糟糕,Ultimaker Cura 似乎遇到了问题。

\n" -"

在启动时发生了不可修复的错误。这可能是因某些配置文件出错导致的。建议您备份并重置配置。

\n" -"

您可在配置文件夹中找到备份。

\n" -"

请向我们发送此错误报告,以便解决问题。

\n" -" " +msgstr "

糟糕,Ultimaker Cura 似乎遇到了问题。

\n

在启动时发生了不可修复的错误。这可能是因某些配置文件出错导致的。建议您备份并重置配置。

\n

您可在配置文件夹中找到备份。

\n

请向我们发送此错误报告,以便解决问题。

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1116,10 +1107,7 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "" -"

Cura 发生了严重错误。请将这份错误报告发送给我们以便修复问题

\n" -"

请使用“发送报告”按钮将错误报告自动发布到我们的服务器

\n" -" " +msgstr "

Cura 发生了严重错误。请将这份错误报告发送给我们以便修复问题

\n

请使用“发送报告”按钮将错误报告自动发布到我们的服务器

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1466,7 +1454,7 @@ msgstr "作者" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "下载项" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1506,27 +1494,27 @@ msgstr "背部" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "确认卸载 " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "您正在卸载仍在使用的材料和/或配置文件。确认会将以下材料/配置文件重置为默认值。" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "材料" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "配置文件" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "确认" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1541,17 +1529,17 @@ msgstr "退出 Cura" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "社区贡献" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "社区插件" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "通用材料" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1584,10 +1572,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"该插件包含一个许可。\n" -"您需要接受此许可才能安装此插件。\n" -"是否同意下列条款?" +msgstr "该插件包含一个许可。\n您需要接受此许可才能安装此插件。\n是否同意下列条款?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1617,12 +1602,12 @@ msgstr "获取包……" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "网站" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "电子邮件" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1707,10 +1692,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"要通过网络向打印机发送打印请求,请确保您的打印机已通过网线或 WIFI 连接到网络。若您不能连接 Cura 与打印机,您仍然可以使用 USB 设备将 G-code 文件传输到打印机。\n" -"\n" -"从以下列表中选择您的打印机:" +msgstr "要通过网络向打印机发送打印请求,请确保您的打印机已通过网线或 WIFI 连接到网络。若您不能连接 Cura 与打印机,您仍然可以使用 USB 设备将 G-code 文件传输到打印机。\n\n从以下列表中选择您的打印机:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1759,12 +1741,12 @@ msgstr "地址" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "这台打印机未设置为运行一组打印机。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "这台打印机是一组共 %1 台打印机的主机。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1812,52 +1794,52 @@ msgstr "打印" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "等待:不可用的打印机" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "等待:第一个可用的" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "等待: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "移至顶部" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "将打印作业移至顶部" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "您确定要将 %1 移至队列顶部吗?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "删除" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "删除打印作业" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "您确定要删除 %1 吗?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "管理队列" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1872,40 +1854,40 @@ msgstr "打印" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "管理打印机" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "不可用" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "无法连接" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "可用" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "恢复" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "暂停" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "中止" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 @@ -1916,13 +1898,13 @@ msgstr "中止打印" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "您确定要中止 %1 吗?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "已中止" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1937,7 +1919,7 @@ msgstr "准备" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "暂停" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2353,7 +2335,7 @@ msgstr "打开" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "上一步" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2365,12 +2347,12 @@ msgstr "导出" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "下一步" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "提示" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2419,12 +2401,12 @@ msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "打印试验" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "检查表" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2647,7 +2629,7 @@ msgstr "请取出打印件" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "中止打印" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -2664,9 +2646,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"您已自定义某些配置文件设置。\n" -"您想保留或舍弃这些设置吗?" +msgstr "您已自定义某些配置文件设置。\n您想保留或舍弃这些设置吗?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3110,7 +3090,7 @@ msgstr "打开项目文件时的默认行为:" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "总是询问" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3130,22 +3110,22 @@ msgstr "当您对配置文件进行更改并切换到其他配置文件时将显 #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "配置文件" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "切换到不同配置文件时对设置值更改的默认操作: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "总是舍失更改的设置" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "总是将更改的设置传输至新配置文件" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3340,7 +3320,7 @@ msgstr "新增打印机" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "未命名" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3362,9 +3342,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura 由 Ultimaker B.V. 与社区合作开发。\n" -"Cura 使用以下开源项目:" +msgstr "Cura 由 Ultimaker B.V. 与社区合作开发。\nCura 使用以下开源项目:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3477,10 +3455,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"某些设置/重写值与存储在配置文件中的值不同。\n" -"\n" -"点击打开配置文件管理器。" +msgstr "某些设置/重写值与存储在配置文件中的值不同。\n\n点击打开配置文件管理器。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3534,10 +3509,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"一些隐藏设置正在使用有别于一般设置的计算值。\n" -"\n" -"单击以使这些设置可见。" +msgstr "一些隐藏设置正在使用有别于一般设置的计算值。\n\n单击以使这些设置可见。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3565,10 +3537,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"此设置的值与配置文件不同。\n" -"\n" -"单击以恢复配置文件的值。" +msgstr "此设置的值与配置文件不同。\n\n单击以恢复配置文件的值。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3576,10 +3545,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"此设置通常可被自动计算,但其当前已被绝对定义。\n" -"\n" -"单击以恢复自动计算的值。" +msgstr "此设置通常可被自动计算,但其当前已被绝对定义。\n\n单击以恢复自动计算的值。" #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3698,17 +3664,17 @@ msgstr "打印前请预热热床。您可以在热床加热时继续调整相关 #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "材料" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "收藏" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "通用" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3802,9 +3768,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"打印设置已禁用\n" -"G-code 文件无法被修改" +msgstr "打印设置已禁用\nG-code 文件无法被修改" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4143,17 +4107,17 @@ msgstr "文件(&F)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "保存(&S)..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "导出(&E)..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "导出选择..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4255,13 +4219,13 @@ msgstr "你确定要开始一个新项目吗?这将清除打印平台及任何 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "关闭 Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "您确定要退出 Cura 吗?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4442,7 +4406,7 @@ msgstr "材料" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "用胶粘和此材料组合" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4782,12 +4746,12 @@ msgstr "版本自 2.7 升级到 3.0" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "将配置从 Cura 3.4 版本升级至 3.5 版本。" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "版本自 3.4 升级到 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" diff --git a/resources/i18n/zh_CN/fdmprinter.def.json.po b/resources/i18n/zh_CN/fdmprinter.def.json.po index f2e14bc412..57ebf225b4 100644 --- a/resources/i18n/zh_CN/fdmprinter.def.json.po +++ b/resources/i18n/zh_CN/fdmprinter.def.json.po @@ -58,9 +58,7 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "" -"在开始时执行的 G-code 命令 - 以 \n" -" 分行。" +msgstr "在开始时执行的 G-code 命令 - 以 \n 分行。" #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -72,9 +70,7 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "" -"在结束前执行的 G-code 命令 - 以 \n" -" 分行。" +msgstr "在结束前执行的 G-code 命令 - 以 \n 分行。" #: fdmprinter.def.json msgctxt "material_guid label" @@ -1074,12 +1070,12 @@ msgstr "锯齿状" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "连接顶部/底部多边形" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "在顶部/底部皮肤路径互相紧靠运行的地方连接它们。对于同心图案,启用此设置可大大减少空驶时间,但因为连接可在填充中途发生,此功能可能会降低顶部表面质量。" #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1164,22 +1160,22 @@ msgstr "在内壁已经存在时补偿所打印内壁部分的流量。" #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "最小壁流量" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "壁线允许的最小百分比流量。当某个壁靠近现有壁时,壁重叠补偿可减小其流量。流量小于此值的壁将由空驶替代。在使用此设置时,您必须启用壁重叠补偿并在打印内壁之前打印外壁。" #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "首选回抽" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "如启用,会使用回抽而不是梳理取代流量低于最小流量阈值的壁的空驶。" #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1574,12 +1570,12 @@ msgstr "使用沿内壁形状的走线连接填充图案与内壁相接的各端 #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "连接填充多边形" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "在填充路径互相紧靠运行的地方连接它们。对于包含若干闭合多边形的填充图案,启用此设置可大大减少空驶时间。" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1614,24 +1610,24 @@ msgstr "填充图案沿 Y 轴移动此距离。" #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "填充走线乘数" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "将每个填充走线转换成这种多重走线。额外走线互相不交叉,而是互相避开。这使得填充更严格,但会增加打印时间和材料使用。" #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "额外填充壁计数" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "" +msgstr "在填充区域周围添加额外壁。此类壁可减少顶部/底部皮肤走线,这意味着只要付出一些额外的材料就可以使用更少的顶部/底部皮肤层达到相同的质量。\n在适当配置的情况下,此功能可结合连接填充多边形以将所有填充物连接到单一挤出路径而无需空驶或回抽。" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2781,7 +2777,7 @@ msgstr "梳理模式" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "梳理可在空驶时让喷嘴保持在已打印区域内。这会使空驶距离稍微延长,但可减少回抽需求。如果关闭梳理,则材料将回抽,且喷嘴沿着直线移动到下一个点。也可以避免顶部/底部皮肤区域的梳理和仅在填充物内进行梳理。请注意,“在填充物内”选项的操作方式与较早 Cura 版本中的“不在皮肤中”选项完全相同。" #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2801,7 +2797,7 @@ msgstr "除了皮肤" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "在填充物内" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3246,22 +3242,22 @@ msgstr "已打印支撑结构走线之间的距离。 该设置通过支撑密 #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "起始层支撑走线距离" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "已打印起始层支撑结构走线之间的距离。该设置通过支撑密度计算。" #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "支撑填充走线方向" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "用于支撑的填充图案的方向。支撑填充图案在水平面中旋转。" #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3631,22 +3627,22 @@ msgstr "锯齿形" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "风扇速度覆盖" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "启用时,会为支撑正上方的表面区域更改打印冷却风扇速度。" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "支撑的表面风扇速度" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "打印支撑正上方表面区域时使用的风扇百分比速度。使用高风扇速度可能使支撑更容易移除。" #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3798,9 +3794,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" -"skirt 和打印第一层之间的水平距离。\n" -"这是最小距离。多个 skirt 走线将从此距离向外延伸。" +msgstr "skirt 和打印第一层之间的水平距离。\n这是最小距离。多个 skirt 走线将从此距离向外延伸。" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3975,7 +3969,7 @@ msgstr "基础 Raft 层的走线宽度。 这些走线应该是粗线,以便 #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "Raft 基础走线间距" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4720,12 +4714,12 @@ msgstr "数据连接材料流量(mm3/s)到温度(摄氏度)。" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "最小多边形周长" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "切片层中周长小于此数值的多边形将被滤除。以切片时间为代价,较低的值可实现较高分辨率的网格。它主要用于高分辨率 SLA 打印机和包含大量细节的极小 3D 模型。" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5237,9 +5231,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"以半速挤出的上行移动的距离。\n" -"这会与之前的层产生更好的附着,而不会将这些层中的材料过度加热。 仅应用于单线打印。" +msgstr "以半速挤出的上行移动的距离。\n这会与之前的层产生更好的附着,而不会将这些层中的材料过度加热。 仅应用于单线打印。" #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5389,22 +5381,22 @@ msgstr "决定是否使用较小图层的阈值。该数字相当于一层中最 #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "悬垂壁角度" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "悬垂超过此角度的壁将使用悬垂壁设置打印。该值为 90 时,不会将任何壁视为悬垂。" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "悬垂壁速度" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "悬垂壁将以其正常打印速度的此百分比打印。" #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" From 5761d28f7f8620c4735c80ea442ec7a6ad4de877 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 28 Sep 2018 14:24:21 +0200 Subject: [PATCH 101/212] Use old data dict code style, more readable --- cura/OAuth2/AuthorizationHelpers.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py index 0a1447297c..c149f74ab2 100644 --- a/cura/OAuth2/AuthorizationHelpers.py +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -37,19 +37,27 @@ class AuthorizationHelpers: # \param verification_code: The verification code needed for the PKCE extension. # \return: An AuthenticationResponse object. def getAccessTokenUsingAuthorizationCode(self, authorization_code: str, verification_code: str) -> "AuthenticationResponse": - data = self.getCommonRequestDataDict() - data["grant_type"] = "authorization_code" - data["code"] = authorization_code - data["code_verifier"] = verification_code + data = { + "client_id": self._settings.CLIENT_ID if self._settings.CLIENT_ID is not None else "", + "redirect_uri": self._settings.CALLBACK_URL if self._settings.CALLBACK_URL is not None else "", + "grant_type": "authorization_code", + "code": authorization_code, + "code_verifier": verification_code, + "scope": self._settings.CLIENT_SCOPES if self._settings.CLIENT_SCOPES is not None else "", + } return self.parseTokenResponse(requests.post(self._token_url, data = data)) # type: ignore # Request the access token from the authorization server using a refresh token. # \param refresh_token: # \return: An AuthenticationResponse object. def getAccessTokenUsingRefreshToken(self, refresh_token: str) -> "AuthenticationResponse": - data = self.getCommonRequestDataDict() - data["grant_type"] = "refresh_token" - data["refresh_token"] = refresh_token + data = { + "client_id": self._settings.CLIENT_ID if self._settings.CLIENT_ID is not None else "", + "redirect_uri": self._settings.CALLBACK_URL if self._settings.CALLBACK_URL is not None else "", + "grant_type": "refresh_token", + "refresh_token": refresh_token, + "scope": self._settings.CLIENT_SCOPES if self._settings.CLIENT_SCOPES is not None else "", + } return self.parseTokenResponse(requests.post(self._token_url, data = data)) # type: ignore @staticmethod From 1bee201cfd2db5453e34e06d98ccd166518bfd26 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 28 Sep 2018 14:24:40 +0200 Subject: [PATCH 102/212] Remove unused code --- cura/OAuth2/AuthorizationHelpers.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py index c149f74ab2..f75ad9c9f9 100644 --- a/cura/OAuth2/AuthorizationHelpers.py +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -24,14 +24,6 @@ class AuthorizationHelpers: def settings(self) -> "OAuth2Settings": return self._settings - # Gets a dictionary with data that need to be used for any HTTP authorization request. - def getCommonRequestDataDict(self) -> Dict[str, str]: - data_dict = {"client_id": self._settings.CLIENT_ID if self._settings.CLIENT_ID is not None else "", - "redirect_uri": self._settings.CALLBACK_URL if self._settings.CALLBACK_URL is not None else "", - "scope": self._settings.CLIENT_SCOPES if self._settings.CLIENT_SCOPES is not None else "", - } - return data_dict - # Request the access token from the authorization server. # \param authorization_code: The authorization code from the 1st step. # \param verification_code: The verification code needed for the PKCE extension. From 44fd0752b6e680fee712d715516411f941199a99 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 28 Sep 2018 14:28:55 +0200 Subject: [PATCH 103/212] Update revision dates They are being checked today. I'm not that bothered about the exact time. Contributes to issue CURA-5741. --- resources/i18n/de_DE/cura.po | 2 +- resources/i18n/de_DE/fdmextruder.def.json.po | 2 +- resources/i18n/de_DE/fdmprinter.def.json.po | 2 +- resources/i18n/es_ES/cura.po | 2 +- resources/i18n/es_ES/fdmextruder.def.json.po | 2 +- resources/i18n/es_ES/fdmprinter.def.json.po | 2 +- resources/i18n/fr_FR/cura.po | 2 +- resources/i18n/fr_FR/fdmextruder.def.json.po | 2 +- resources/i18n/fr_FR/fdmprinter.def.json.po | 2 +- resources/i18n/it_IT/cura.po | 2 +- resources/i18n/it_IT/fdmextruder.def.json.po | 2 +- resources/i18n/it_IT/fdmprinter.def.json.po | 2 +- resources/i18n/ja_JP/cura.po | 2 +- resources/i18n/ja_JP/fdmextruder.def.json.po | 4 ++-- resources/i18n/ja_JP/fdmprinter.def.json.po | 4 ++-- resources/i18n/ko_KR/cura.po | 2 +- resources/i18n/ko_KR/fdmextruder.def.json.po | 2 +- resources/i18n/ko_KR/fdmprinter.def.json.po | 2 +- resources/i18n/nl_NL/cura.po | 2 +- resources/i18n/nl_NL/fdmextruder.def.json.po | 2 +- resources/i18n/nl_NL/fdmprinter.def.json.po | 2 +- resources/i18n/pt_PT/cura.po | 2 +- resources/i18n/pt_PT/fdmextruder.def.json.po | 2 +- resources/i18n/pt_PT/fdmprinter.def.json.po | 2 +- resources/i18n/ru_RU/cura.po | 2 +- resources/i18n/ru_RU/fdmextruder.def.json.po | 2 +- resources/i18n/ru_RU/fdmprinter.def.json.po | 2 +- resources/i18n/tr_TR/cura.po | 2 +- resources/i18n/tr_TR/fdmextruder.def.json.po | 2 +- resources/i18n/tr_TR/fdmprinter.def.json.po | 2 +- resources/i18n/zh_CN/cura.po | 2 +- resources/i18n/zh_CN/fdmextruder.def.json.po | 2 +- resources/i18n/zh_CN/fdmprinter.def.json.po | 2 +- 33 files changed, 35 insertions(+), 35 deletions(-) diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index 91b76b69ec..c3433ac9f1 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: German\n" "Language: de_DE\n" diff --git a/resources/i18n/de_DE/fdmextruder.def.json.po b/resources/i18n/de_DE/fdmextruder.def.json.po index 82b33e656b..56b6c35c93 100644 --- a/resources/i18n/de_DE/fdmextruder.def.json.po +++ b/resources/i18n/de_DE/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: German\n" "Language: de_DE\n" diff --git a/resources/i18n/de_DE/fdmprinter.def.json.po b/resources/i18n/de_DE/fdmprinter.def.json.po index 693d27fb84..223639d3fc 100644 --- a/resources/i18n/de_DE/fdmprinter.def.json.po +++ b/resources/i18n/de_DE/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: German\n" "Language: de_DE\n" diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index 7a2e602c73..95385902ca 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" "Language: es_ES\n" diff --git a/resources/i18n/es_ES/fdmextruder.def.json.po b/resources/i18n/es_ES/fdmextruder.def.json.po index 14bf25d79c..ec191c5271 100644 --- a/resources/i18n/es_ES/fdmextruder.def.json.po +++ b/resources/i18n/es_ES/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" "Language: es_ES\n" diff --git a/resources/i18n/es_ES/fdmprinter.def.json.po b/resources/i18n/es_ES/fdmprinter.def.json.po index 6cfbabcf13..5520a7737b 100644 --- a/resources/i18n/es_ES/fdmprinter.def.json.po +++ b/resources/i18n/es_ES/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" "Language: es_ES\n" diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index 3a92054283..87af488e31 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: French\n" "Language: fr_FR\n" diff --git a/resources/i18n/fr_FR/fdmextruder.def.json.po b/resources/i18n/fr_FR/fdmextruder.def.json.po index 0c408116b4..b2b54fbced 100644 --- a/resources/i18n/fr_FR/fdmextruder.def.json.po +++ b/resources/i18n/fr_FR/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: French\n" "Language: fr_FR\n" diff --git a/resources/i18n/fr_FR/fdmprinter.def.json.po b/resources/i18n/fr_FR/fdmprinter.def.json.po index a411605fc2..60c17b93f8 100644 --- a/resources/i18n/fr_FR/fdmprinter.def.json.po +++ b/resources/i18n/fr_FR/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: French\n" "Language: fr_FR\n" diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po index 07ea3e8580..610d113af8 100644 --- a/resources/i18n/it_IT/cura.po +++ b/resources/i18n/it_IT/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" "Language: it_IT\n" diff --git a/resources/i18n/it_IT/fdmextruder.def.json.po b/resources/i18n/it_IT/fdmextruder.def.json.po index 60346c3eb4..3fa62440ea 100644 --- a/resources/i18n/it_IT/fdmextruder.def.json.po +++ b/resources/i18n/it_IT/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" "Language: it_IT\n" diff --git a/resources/i18n/it_IT/fdmprinter.def.json.po b/resources/i18n/it_IT/fdmprinter.def.json.po index 2934b86a02..b12c404f98 100644 --- a/resources/i18n/it_IT/fdmprinter.def.json.po +++ b/resources/i18n/it_IT/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" "Language: it_IT\n" diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index 1f4d1a3e6d..2ab5bb0e1e 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Japanese\n" "Language: ja_JP\n" diff --git a/resources/i18n/ja_JP/fdmextruder.def.json.po b/resources/i18n/ja_JP/fdmextruder.def.json.po index 0fa92f6afe..cfa3fe4dee 100644 --- a/resources/i18n/ja_JP/fdmextruder.def.json.po +++ b/resources/i18n/ja_JP/fdmextruder.def.json.po @@ -8,9 +8,9 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" -"Language-Team: Brule\n" +"Language-Team: Japanese\n" "Language: ja_JP\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/resources/i18n/ja_JP/fdmprinter.def.json.po b/resources/i18n/ja_JP/fdmprinter.def.json.po index 919dbc2033..23497053a7 100644 --- a/resources/i18n/ja_JP/fdmprinter.def.json.po +++ b/resources/i18n/ja_JP/fdmprinter.def.json.po @@ -8,9 +8,9 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" -"Language-Team: Brule\n" +"Language-Team: Japanese\n" "Language: ja_JP\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index 44beb606d6..18a54715c1 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-04-19 16:10+0900\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Jinbuhm Kim \n" "Language-Team: Jinbum Kim , Korean \n" "Language: ko_KR\n" diff --git a/resources/i18n/ko_KR/fdmextruder.def.json.po b/resources/i18n/ko_KR/fdmextruder.def.json.po index 047515e962..b3cf7e0e9d 100644 --- a/resources/i18n/ko_KR/fdmextruder.def.json.po +++ b/resources/i18n/ko_KR/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-19 13:27+0900\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Jinbuhm Kim \n" "Language-Team: Jinbum Kim , Korean \n" "Language: ko_KR\n" diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 50df8f7128..232e7185e4 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-19 13:26+0900\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Jinbuhm Kim \n" "Language-Team: Jinbum Kim , Korean \n" "Language: ko_KR\n" diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index 7e903989eb..23bcf17c19 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" "Language: nl_NL\n" diff --git a/resources/i18n/nl_NL/fdmextruder.def.json.po b/resources/i18n/nl_NL/fdmextruder.def.json.po index 24c5abae55..f7fd1717b0 100644 --- a/resources/i18n/nl_NL/fdmextruder.def.json.po +++ b/resources/i18n/nl_NL/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" "Language: nl_NL\n" diff --git a/resources/i18n/nl_NL/fdmprinter.def.json.po b/resources/i18n/nl_NL/fdmprinter.def.json.po index f7dab57356..85d7a6e949 100644 --- a/resources/i18n/nl_NL/fdmprinter.def.json.po +++ b/resources/i18n/nl_NL/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" "Language: nl_NL\n" diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po index e23d4705bf..90bde6f361 100644 --- a/resources/i18n/pt_PT/cura.po +++ b/resources/i18n/pt_PT/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-06-21 14:30+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Paulo Miranda \n" "Language-Team: Paulo Miranda , Portuguese \n" "Language: pt_PT\n" diff --git a/resources/i18n/pt_PT/fdmextruder.def.json.po b/resources/i18n/pt_PT/fdmextruder.def.json.po index 8486de3f69..1d66fdb2f9 100644 --- a/resources/i18n/pt_PT/fdmextruder.def.json.po +++ b/resources/i18n/pt_PT/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-06-21 14:30+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Paulo Miranda \n" "Language-Team: Paulo Miranda , Portuguese \n" "Language: pt_PT\n" diff --git a/resources/i18n/pt_PT/fdmprinter.def.json.po b/resources/i18n/pt_PT/fdmprinter.def.json.po index 5545d3f2cd..c485d84a89 100644 --- a/resources/i18n/pt_PT/fdmprinter.def.json.po +++ b/resources/i18n/pt_PT/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-06-21 14:30+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Paulo Miranda \n" "Language-Team: Paulo Miranda , Portuguese \n" "Language: pt_PT\n" diff --git a/resources/i18n/ru_RU/cura.po b/resources/i18n/ru_RU/cura.po index 49ed8ab1a2..a01fbf0781 100644 --- a/resources/i18n/ru_RU/cura.po +++ b/resources/i18n/ru_RU/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Ruslan Popov , Russian \n" "Language: ru_RU\n" diff --git a/resources/i18n/ru_RU/fdmextruder.def.json.po b/resources/i18n/ru_RU/fdmextruder.def.json.po index fa8c434d2f..d9cd6287de 100644 --- a/resources/i18n/ru_RU/fdmextruder.def.json.po +++ b/resources/i18n/ru_RU/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Ruslan Popov , Russian \n" "Language: ru_RU\n" diff --git a/resources/i18n/ru_RU/fdmprinter.def.json.po b/resources/i18n/ru_RU/fdmprinter.def.json.po index aa5d716e55..466eea158d 100644 --- a/resources/i18n/ru_RU/fdmprinter.def.json.po +++ b/resources/i18n/ru_RU/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Ruslan Popov , Russian \n" "Language: ru_RU\n" diff --git a/resources/i18n/tr_TR/cura.po b/resources/i18n/tr_TR/cura.po index 057036220b..22a1947c76 100644 --- a/resources/i18n/tr_TR/cura.po +++ b/resources/i18n/tr_TR/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" "Language: tr_TR\n" diff --git a/resources/i18n/tr_TR/fdmextruder.def.json.po b/resources/i18n/tr_TR/fdmextruder.def.json.po index de8f861922..9bb0d492af 100644 --- a/resources/i18n/tr_TR/fdmextruder.def.json.po +++ b/resources/i18n/tr_TR/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" "Language: tr_TR\n" diff --git a/resources/i18n/tr_TR/fdmprinter.def.json.po b/resources/i18n/tr_TR/fdmprinter.def.json.po index 7a6778aeff..ba39d32284 100644 --- a/resources/i18n/tr_TR/fdmprinter.def.json.po +++ b/resources/i18n/tr_TR/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" "Language: tr_TR\n" diff --git a/resources/i18n/zh_CN/cura.po b/resources/i18n/zh_CN/cura.po index 1c32f85fe6..2bbe81cfda 100644 --- a/resources/i18n/zh_CN/cura.po +++ b/resources/i18n/zh_CN/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-06-22 11:32+0800\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" "Language: zh_CN\n" diff --git a/resources/i18n/zh_CN/fdmextruder.def.json.po b/resources/i18n/zh_CN/fdmextruder.def.json.po index a6625a02c6..e72bf45a2b 100644 --- a/resources/i18n/zh_CN/fdmextruder.def.json.po +++ b/resources/i18n/zh_CN/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-11 14:40+0100\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" "Language: zh_CN\n" diff --git a/resources/i18n/zh_CN/fdmprinter.def.json.po b/resources/i18n/zh_CN/fdmprinter.def.json.po index 57ebf225b4..5f16293384 100644 --- a/resources/i18n/zh_CN/fdmprinter.def.json.po +++ b/resources/i18n/zh_CN/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-06-22 11:44+0800\n" +"PO-Revision-Date: 2018-09-28 14:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" "Language: zh_CN\n" From c04c7654c107394be9cadff097c424368fc1aca7 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 28 Sep 2018 14:31:36 +0200 Subject: [PATCH 104/212] Make Backup._application private --- cura/Backups/Backup.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/Backups/Backup.py b/cura/Backups/Backup.py index b9045a59b1..82157a163a 100644 --- a/cura/Backups/Backup.py +++ b/cura/Backups/Backup.py @@ -30,7 +30,7 @@ class Backup: catalog = i18nCatalog("cura") def __init__(self, application: "CuraApplication", zip_file: bytes = None, meta_data: Dict[str, str] = None) -> None: - self.application = application + self._application = application self.zip_file = zip_file # type: Optional[bytes] self.meta_data = meta_data # type: Optional[Dict[str, str]] @@ -42,12 +42,12 @@ class Backup: Logger.log("d", "Creating backup for Cura %s, using folder %s", cura_release, version_data_dir) # Ensure all current settings are saved. - self.application.saveSettings() + self._application.saveSettings() # We copy the preferences file to the user data directory in Linux as it's in a different location there. # When restoring a backup on Linux, we move it back. if Platform.isLinux(): - preferences_file_name = self.application.getApplicationName() + preferences_file_name = self._application.getApplicationName() preferences_file = Resources.getPath(Resources.Preferences, "{}.cfg".format(preferences_file_name)) backup_preferences_file = os.path.join(version_data_dir, "{}.cfg".format(preferences_file_name)) Logger.log("d", "Copying preferences file from %s to %s", preferences_file, backup_preferences_file) @@ -113,7 +113,7 @@ class Backup: "Tried to restore a Cura backup without having proper data or meta data.")) return False - current_version = self.application.getVersion() + current_version = self._application.getVersion() version_to_restore = self.meta_data.get("cura_release", "master") if current_version != version_to_restore: # Cannot restore version older or newer than current because settings might have changed. @@ -129,7 +129,7 @@ class Backup: # Under Linux, preferences are stored elsewhere, so we copy the file to there. if Platform.isLinux(): - preferences_file_name = self.application.getApplicationName() + preferences_file_name = self._application.getApplicationName() preferences_file = Resources.getPath(Resources.Preferences, "{}.cfg".format(preferences_file_name)) backup_preferences_file = os.path.join(version_data_dir, "{}.cfg".format(preferences_file_name)) Logger.log("d", "Moving preferences file from %s to %s", backup_preferences_file, preferences_file) From 72d97a95c21b3dd44caefb341b500442574581d1 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 28 Sep 2018 15:32:04 +0200 Subject: [PATCH 105/212] Fixes for 3.5 translations of DE, ES, FR, IT and JA I don't have time to do them all right now. Contributes to issue CURA-5741. --- resources/i18n/de_DE/cura.po | 102 +++++--- resources/i18n/de_DE/fdmprinter.def.json.po | 41 ++-- resources/i18n/es_ES/cura.po | 126 ++++++---- resources/i18n/es_ES/fdmprinter.def.json.po | 38 +-- resources/i18n/fr_FR/cura.po | 92 +++++--- resources/i18n/fr_FR/fdmprinter.def.json.po | 36 ++- resources/i18n/it_IT/cura.po | 78 ++++-- resources/i18n/it_IT/fdmprinter.def.json.po | 41 ++-- resources/i18n/ja_JP/cura.po | 236 ++++++++++--------- resources/i18n/ja_JP/fdmextruder.def.json.po | 22 +- resources/i18n/ja_JP/fdmprinter.def.json.po | 165 +++++++------ 11 files changed, 599 insertions(+), 378 deletions(-) diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index c3433ac9f1..2b118f942e 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-09-28 14:42+0200\n" "Last-Translator: Bothof \n" "Language-Team: German\n" "Language: de_DE\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.4\n" +"X-Generator: Poedit 2.0.6\n" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22 msgctxt "@action" @@ -64,7 +64,11 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "

Ein oder mehrere 3D-Modelle können möglicherweise aufgrund der Modellgröße und Materialkonfiguration nicht optimal gedruckt werden:

\n

{model_names}

\n

Erfahren Sie, wie Sie die bestmögliche Druckqualität und Zuverlässigkeit sicherstellen.

\n

Leitfaden zu Druckqualität anzeigen

" +msgstr "" +"

Ein oder mehrere 3D-Modelle können möglicherweise aufgrund der Modellgröße und Materialkonfiguration nicht optimal gedruckt werden:

\n" +"

{model_names}

\n" +"

Erfahren Sie, wie Sie die bestmögliche Druckqualität und Zuverlässigkeit sicherstellen.

\n" +"

Leitfaden zu Druckqualität anzeigen

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -437,7 +441,7 @@ msgstr "Die PrintCores und/oder Materialien auf Ihrem Drucker unterscheiden sich #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89 msgctxt "@info:status" msgid "Connected over the network" -msgstr "Über Netzwerk verbunden." +msgstr "Über Netzwerk verbunden" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:310 msgctxt "@info:status" @@ -511,7 +515,7 @@ msgstr "Schichtenansicht" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:102 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Cura zeigt die Schichten nicht akkurat an, wenn Wire Printing aktiviert ist." +msgstr "Cura zeigt die Schichten nicht akkurat an, wenn Wire Printing aktiviert ist" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:title" @@ -884,7 +888,7 @@ msgstr "Export des Profils nach {0} fehlgeschlagen: !" msgid "Failed to export profile to {0}: Writer plugin reported failure." -msgstr "Export des Profils nach {0} fehlgeschlagen: Fehlermeldung von Writer-Plugin" +msgstr "Export des Profils nach {0} fehlgeschlagen: Fehlermeldung von Writer-Plugin." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 #, python-brace-format @@ -1074,7 +1078,12 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "

Hoppla, bei Ultimaker Cura ist ein Problem aufgetreten.

\n

Beim Start ist ein nicht behebbarer Fehler aufgetreten. Er wurde möglicherweise durch einige falsche Konfigurationsdateien verursacht. Wir empfehlen ein Backup und Reset Ihrer Konfiguration.

\n

Backups sind im Konfigurationsordner abgelegt.

\n

Senden Sie uns diesen Absturzbericht bitte, um das Problem zu beheben.

\n " +msgstr "" +"

Hoppla, bei Ultimaker Cura ist ein Problem aufgetreten.

\n" +"

Beim Start ist ein nicht behebbarer Fehler aufgetreten. Er wurde möglicherweise durch einige falsche Konfigurationsdateien verursacht. Wir empfehlen ein Backup und Reset Ihrer Konfiguration.

\n" +"

Backups sind im Konfigurationsordner abgelegt.

\n" +"

Senden Sie uns diesen Absturzbericht bitte, um das Problem zu beheben.

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1107,7 +1116,10 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "

Ein schwerer Fehler ist in Cura aufgetreten. Senden Sie uns diesen Absturzbericht, um das Problem zu beheben

\n

Verwenden Sie bitte die Schaltfläche „Bericht senden“, um den Fehlerbericht automatisch an unsere Server zu senden

\n " +msgstr "" +"

Ein schwerer Fehler ist in Cura aufgetreten. Senden Sie uns diesen Absturzbericht, um das Problem zu beheben

\n" +"

Verwenden Sie bitte die Schaltfläche „Bericht senden“, um den Fehlerbericht automatisch an unsere Server zu senden

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1572,7 +1584,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Dieses Plugin enthält eine Lizenz.\nSie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\nStimmen Sie den nachfolgenden Bedingungen zu?" +msgstr "" +"Dieses Plugin enthält eine Lizenz.\n" +"Sie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\n" +"Stimmen Sie den nachfolgenden Bedingungen zu?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1679,7 +1694,7 @@ msgstr "Vorhandene Verbindung" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:45 msgctxt "@message:text" msgid "This printer/group is already added to Cura. Please select another printer/group." -msgstr "Diese/r Drucker/Gruppe wurde bereits zu Cura hinzugefügt. Wählen Sie bitte eine/n andere/n Drucker/Gruppe" +msgstr "Diese/r Drucker/Gruppe wurde bereits zu Cura hinzugefügt. Wählen Sie bitte eine/n andere/n Drucker/Gruppe." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:62 msgctxt "@title:window" @@ -1692,7 +1707,10 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n\nWählen Sie Ihren Drucker aus der folgenden Liste:" +msgstr "" +"Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n" +"\n" +"Wählen Sie Ihren Drucker aus der folgenden Liste:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1919,7 +1937,7 @@ msgstr "Vorbereitung" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "Wird pausiert..." +msgstr "Wird pausiert" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -1929,7 +1947,7 @@ msgstr "Pausiert" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:679 msgctxt "@label:status" msgid "Resuming" -msgstr "Wird fortgesetzt ..." +msgstr "Wird fortgesetzt" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:681 msgctxt "@label:status" @@ -2069,7 +2087,7 @@ msgstr "Cura sendet anonyme Daten an Ultimaker, um die Druckqualität und Benutz #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101 msgctxt "@text:window" msgid "I don't want to send these data" -msgstr "Ich möchte diese Daten nicht senden." +msgstr "Ich möchte diese Daten nicht senden" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111 msgctxt "@text:window" @@ -2114,7 +2132,7 @@ msgstr "Breite (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 msgctxt "@info:tooltip" msgid "The depth in millimeters on the build plate" -msgstr "Die Tiefe der Druckplatte in Millimetern." +msgstr "Die Tiefe der Druckplatte in Millimetern" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 msgctxt "@action:label" @@ -2484,7 +2502,7 @@ msgstr "Benutzerdefinierte Firmware wählen" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 msgctxt "@label" msgid "Please select any upgrades made to this Ultimaker Original" -msgstr "Wählen Sie bitte alle Upgrades für dieses Ultimaker-Original." +msgstr "Wählen Sie bitte alle Upgrades für dieses Ultimaker-Original" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 msgctxt "@label" @@ -2499,7 +2517,7 @@ msgstr "Drucker prüfen" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 msgctxt "@label" msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional" -msgstr "Sie sollten einige Sanity Checks bei Ihrem Ultimaker durchführen. Sie können diesen Schritt überspringen, wenn Sie wissen, dass Ihr Gerät funktionsfähig ist." +msgstr "Sie sollten einige Sanity Checks bei Ihrem Ultimaker durchführen. Sie können diesen Schritt überspringen, wenn Sie wissen, dass Ihr Gerät funktionsfähig ist" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 msgctxt "@action:button" @@ -2648,7 +2666,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Sie haben einige Profileinstellungen angepasst.\nMöchten Sie diese Einstellungen übernehmen oder verwerfen?" +msgstr "" +"Sie haben einige Profileinstellungen angepasst.\n" +"Möchten Sie diese Einstellungen übernehmen oder verwerfen?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2769,7 +2789,7 @@ msgstr "Kosten pro Meter" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:321 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." -msgstr "Dieses Material ist mit %1 verknüpft und teilt sich damit einige seiner Eigenschaften" +msgstr "Dieses Material ist mit %1 verknüpft und teilt sich damit einige seiner Eigenschaften." #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:328 msgctxt "@label" @@ -3067,7 +3087,7 @@ msgstr "Soll ein Präfix anhand des Druckernamens automatisch zum Namen des Druc #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:527 msgctxt "@option:check" msgid "Add machine prefix to job name" -msgstr "Geräte-Präfix zu Auftragsnamen hinzufügen." +msgstr "Geräte-Präfix zu Auftragsnamen hinzufügen" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@info:tooltip" @@ -3344,7 +3364,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\nCura verwendet mit Stolz die folgenden Open Source-Projekte:" +msgstr "" +"Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\n" +"Cura verwendet mit Stolz die folgenden Open Source-Projekte:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3457,7 +3479,10 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n\nKlicken Sie, um den Profilmanager zu öffnen." +msgstr "" +"Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n" +"\n" +"Klicken Sie, um den Profilmanager zu öffnen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3511,7 +3536,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n\nKlicken Sie, um diese Einstellungen sichtbar zu machen." +msgstr "" +"Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n" +"\n" +"Klicken Sie, um diese Einstellungen sichtbar zu machen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3539,7 +3567,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Diese Einstellung hat einen vom Profil abweichenden Wert.\n\nKlicken Sie, um den Wert des Profils wiederherzustellen." +msgstr "" +"Diese Einstellung hat einen vom Profil abweichenden Wert.\n" +"\n" +"Klicken Sie, um den Wert des Profils wiederherzustellen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3547,7 +3578,10 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n\nKlicken Sie, um den berechneten Wert wiederherzustellen." +msgstr "" +"Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n" +"\n" +"Klicken Sie, um den berechneten Wert wiederherzustellen." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3772,7 +3806,9 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Druckeinrichtung deaktiviert\nG-Code-Dateien können nicht geändert werden" +msgstr "" +"Druckeinrichtung deaktiviert\n" +"G-Code-Dateien können nicht geändert werden" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -3958,7 +3994,7 @@ msgstr "Modelle &zusammenführen" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu" msgid "&Multiply Model..." -msgstr "Modell &multiplizieren" +msgstr "Modell &multiplizieren..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" @@ -4114,7 +4150,7 @@ msgstr "&Datei" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "&Speichern" +msgstr "&Speichern..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" @@ -4292,12 +4328,12 @@ msgstr "Schichtdicke" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:277 msgctxt "@tooltip" msgid "This quality profile is not available for you current material and nozzle configuration. Please change these to enable this quality profile" -msgstr "Dieses Qualitätsprofil ist für Ihr aktuelles Material und Ihre derzeitige Düsenkonfiguration nicht verfügbar. Bitte ändern Sie diese, um dieses Qualitätsprofil zu aktivieren." +msgstr "Dieses Qualitätsprofil ist für Ihr aktuelles Material und Ihre derzeitige Düsenkonfiguration nicht verfügbar. Bitte ändern Sie diese, um dieses Qualitätsprofil zu aktivieren" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:450 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "Ein benutzerdefiniertes Profil ist derzeit aktiv. Wählen Sie ein voreingestelltes Qualitätsprofil aus der Registerkarte „Benutzerdefiniert“, um den Schieberegler für Qualität zu aktivieren." +msgstr "Ein benutzerdefiniertes Profil ist derzeit aktiv. Wählen Sie ein voreingestelltes Qualitätsprofil aus der Registerkarte „Benutzerdefiniert“, um den Schieberegler für Qualität zu aktivieren" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:467 msgctxt "@label" @@ -4357,7 +4393,7 @@ msgstr "Druckplattenhaftung" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:1040 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." -msgstr "Drucken eines Brim- oder Raft-Elements aktivieren. Es wird ein flacher Bereich rund um oder unter Ihrem Objekt hinzugefügt, das im Anschluss leicht abgeschnitten werden kann. " +msgstr "Drucken eines Brim- oder Raft-Elements aktivieren. Es wird ein flacher Bereich rund um oder unter Ihrem Objekt hinzugefügt, das im Anschluss leicht abgeschnitten werden kann." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:1080 msgctxt "@label" @@ -4604,7 +4640,7 @@ msgstr "Ausgabegerät-Plugin für Wechseldatenträger" #: UM3NetworkPrinting/plugin.json msgctxt "description" msgid "Manages network connections to Ultimaker 3 printers." -msgstr "Verwaltet Netzwerkverbindungen zu Ultimaker 3-Druckern" +msgstr "Verwaltet Netzwerkverbindungen zu Ultimaker 3-Druckern." #: UM3NetworkPrinting/plugin.json msgctxt "name" @@ -4664,7 +4700,7 @@ msgstr "Nachbearbeitung" #: SupportEraser/plugin.json msgctxt "description" msgid "Creates an eraser mesh to block the printing of support in certain places" -msgstr "Erstellt ein Radierernetz, um den Druck von Stützstrukturen in bestimmten Positionen zu blockieren." +msgstr "Erstellt ein Radierernetz, um den Druck von Stützstrukturen in bestimmten Positionen zu blockieren" #: SupportEraser/plugin.json msgctxt "name" diff --git a/resources/i18n/de_DE/fdmprinter.def.json.po b/resources/i18n/de_DE/fdmprinter.def.json.po index 223639d3fc..3b3e8b9115 100644 --- a/resources/i18n/de_DE/fdmprinter.def.json.po +++ b/resources/i18n/de_DE/fdmprinter.def.json.po @@ -8,13 +8,14 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-09-28 14:57+0200\n" "Last-Translator: Bothof \n" "Language-Team: German\n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.6\n" #: fdmprinter.def.json msgctxt "machine_settings label" @@ -56,7 +57,9 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "G-Code-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n." +msgstr "" +"G-Code-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +71,9 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "G-Code-Befehle, die am Ende ausgeführt werden sollen – getrennt durch \n." +msgstr "" +"G-Code-Befehle, die am Ende ausgeführt werden sollen – getrennt durch \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -543,7 +548,7 @@ msgstr "Maximale Beschleunigung X" #: fdmprinter.def.json msgctxt "machine_max_acceleration_x description" msgid "Maximum acceleration for the motor of the X-direction" -msgstr "Die maximale Beschleunigung für den Motor der X-Richtung." +msgstr "Die maximale Beschleunigung für den Motor der X-Richtung" #: fdmprinter.def.json msgctxt "machine_max_acceleration_y label" @@ -1243,7 +1248,7 @@ msgstr "Justierung der Z-Naht" #: fdmprinter.def.json msgctxt "z_seam_type description" msgid "Starting point of each path in a layer. When paths in consecutive layers start at the same point a vertical seam may show on the print. When aligning these near a user specified location, the seam is easiest to remove. When placed randomly the inaccuracies at the paths' start will be less noticeable. When taking the shortest path the print will be quicker." -msgstr "Der Startdruckpunkt von jedem Teil einer Schicht. Wenn der Druck der Teile in aufeinanderfolgenden Schichten am gleichen Punkt startet, kann eine vertikale Naht sichtbar werden. Wird dieser neben einer benutzerdefinierten Position ausgerichtet, ist die Naht am einfachsten zu entfernen. Wird er zufällig platziert, fallen die Ungenauigkeiten am Startpunkt weniger auf. Wird der kürzeste Weg eingestellt, ist der Druck schneller. " +msgstr "Der Startdruckpunkt von jedem Teil einer Schicht. Wenn der Druck der Teile in aufeinanderfolgenden Schichten am gleichen Punkt startet, kann eine vertikale Naht sichtbar werden. Wird dieser neben einer benutzerdefinierten Position ausgerichtet, ist die Naht am einfachsten zu entfernen. Wird er zufällig platziert, fallen die Ungenauigkeiten am Startpunkt weniger auf. Wird der kürzeste Weg eingestellt, ist der Druck schneller." #: fdmprinter.def.json msgctxt "z_seam_type option back" @@ -1625,7 +1630,9 @@ msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "Fügen Sie zusätzliche Wände um den Füllbereich hinzu. Derartige Wände können zu einem verringerten Absacken der oberen/unteren Außenhautlinien beitragen, was bedeutet, dass Sie weniger Außenhautschichten oben/unten bei derselben Qualität von Kosten für zusätzliches Material benötigen.\n Diese Funktion ist verknüpfbar mit „Füllungspolygone verbinden“, um alle Füllungen mit einem einzigen Extrusionspfad zu verbinden, ohne dass hierzu Vorwärtsbewegungen oder Rückzüge erforderlich sind, sofern die richtige Konfiguration gewählt wurde." +msgstr "" +"Fügen Sie zusätzliche Wände um den Füllbereich hinzu. Derartige Wände können zu einem verringerten Absacken der oberen/unteren Außenhautlinien beitragen, was bedeutet, dass Sie weniger Außenhautschichten oben/unten bei derselben Qualität von Kosten für zusätzliches Material benötigen.\n" +" Diese Funktion ist verknüpfbar mit „Füllungspolygone verbinden“, um alle Füllungen mit einem einzigen Extrusionspfad zu verbinden, ohne dass hierzu Vorwärtsbewegungen oder Rückzüge erforderlich sind, sofern die richtige Konfiguration gewählt wurde." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1735,7 +1742,7 @@ msgstr "Mindestbereich Füllung" #: fdmprinter.def.json msgctxt "min_infill_area description" msgid "Don't generate areas of infill smaller than this (use skin instead)." -msgstr "Keine Füllungsbereiche generieren, die kleiner als dieser sind (stattdessen Außenhaut verwenden). " +msgstr "Keine Füllungsbereiche generieren, die kleiner als dieser sind (stattdessen Außenhaut verwenden)." #: fdmprinter.def.json msgctxt "infill_support_enabled label" @@ -1855,7 +1862,7 @@ msgstr "Voreingestellte Drucktemperatur" #: fdmprinter.def.json msgctxt "default_material_print_temperature description" msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value" -msgstr "Die für den Druck verwendete Standardtemperatur. Dies sollte die „Basis“-Temperatur eines Materials sein. Alle anderen Drucktemperaturen sollten anhand dieses Wertes einen Versatz verwenden." +msgstr "Die für den Druck verwendete Standardtemperatur. Dies sollte die „Basis“-Temperatur eines Materials sein. Alle anderen Drucktemperaturen sollten anhand dieses Wertes einen Versatz verwenden" #: fdmprinter.def.json msgctxt "material_print_temperature label" @@ -1915,7 +1922,7 @@ msgstr "Standardtemperatur Druckplatte" #: fdmprinter.def.json msgctxt "default_material_bed_temperature description" msgid "The default temperature used for the heated build plate. This should be the \"base\" temperature of a build plate. All other print temperatures should use offsets based on this value" -msgstr "Die für die erhitzte Druckplatte verwendete Standardtemperatur. Dies sollte die „Basis“-Temperatur einer Druckplatte sein. Alle anderen Drucktemperaturen sollten anhand dieses Wertes einen Versatz verwenden." +msgstr "Die für die erhitzte Druckplatte verwendete Standardtemperatur. Dies sollte die „Basis“-Temperatur einer Druckplatte sein. Alle anderen Drucktemperaturen sollten anhand dieses Wertes einen Versatz verwenden" #: fdmprinter.def.json msgctxt "material_bed_temperature label" @@ -1945,7 +1952,7 @@ msgstr "Haftungstendenz" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "Oberflächenhaftungstendenz" +msgstr "Oberflächenhaftungstendenz." #: fdmprinter.def.json msgctxt "material_surface_energy label" @@ -2005,7 +2012,7 @@ msgstr "Einziehen bei Schichtänderung" #: fdmprinter.def.json msgctxt "retract_at_layer_change description" msgid "Retract the filament when the nozzle is moving to the next layer." -msgstr "Ziehen Sie das Filament ein, wenn die Düse zur nächsten Schicht fährt. " +msgstr "Ziehen Sie das Filament ein, wenn die Düse zur nächsten Schicht fährt." #: fdmprinter.def.json msgctxt "retraction_amount label" @@ -2355,7 +2362,7 @@ msgstr "Anzahl der langsamen Schichten" #: fdmprinter.def.json msgctxt "speed_slowdown_layers description" msgid "The first few layers are printed slower than the rest of the model, to get better adhesion to the build plate and improve the overall success rate of prints. The speed is gradually increased over these layers." -msgstr "Die ersten Schichten werden langsamer als der Rest des Modells gedruckt, damit sie besser am Druckbett haften und um die Wahrscheinlichkeit eines erfolgreichen Drucks zu erhöhen. Die Geschwindigkeit wird während des Druckens dieser Schichten schrittweise erhöht. " +msgstr "Die ersten Schichten werden langsamer als der Rest des Modells gedruckt, damit sie besser am Druckbett haften und um die Wahrscheinlichkeit eines erfolgreichen Drucks zu erhöhen. Die Geschwindigkeit wird während des Druckens dieser Schichten schrittweise erhöht." #: fdmprinter.def.json msgctxt "speed_equalize_flow_enabled label" @@ -2735,7 +2742,7 @@ msgstr "Ruckfunktion Druck für die erste Schicht" #: fdmprinter.def.json msgctxt "jerk_print_layer_0 description" msgid "The maximum instantaneous velocity change during the printing of the initial layer." -msgstr "Die maximale unmittelbare Geschwindigkeitsänderung während des Druckens für die erste Schicht" +msgstr "Die maximale unmittelbare Geschwindigkeitsänderung während des Druckens für die erste Schicht." #: fdmprinter.def.json msgctxt "jerk_travel_layer_0 label" @@ -3792,7 +3799,9 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\nEs handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden mehrere Skirt-Linien in äußerer Richtung angebracht." +msgstr "" +"Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\n" +"Es handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden mehrere Skirt-Linien in äußerer Richtung angebracht." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -5229,7 +5238,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\nDies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur." +msgstr "" +"Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\n" +"Dies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index 95385902ca..b53d44d325 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-09-28 14:55+0200\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -64,7 +64,11 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "

Es posible que uno o más modelos 3D no se impriman correctamente debido al tamaño del modelo y la configuración del material:

\n

{model_names}

\n

Obtenga más información sobre cómo garantizar la mejor calidad y fiabilidad de impresión posible.

\n

Ver guía de impresión de calidad

" +msgstr "" +"

Es posible que uno o más modelos 3D no se impriman correctamente debido al tamaño del modelo y la configuración del material:

\n" +"

{model_names}

\n" +"

Obtenga más información sobre cómo garantizar la mejor calidad y fiabilidad de impresión posible.

\n" +"

Ver guía de impresión de calidad

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -158,7 +162,7 @@ msgstr "Guardar en unidad extraíble {0}" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:131 msgctxt "@info:status" msgid "There are no file formats available to write with!" -msgstr "No hay formatos de archivo disponibles con los que escribir." +msgstr "¡No hay formatos de archivo disponibles con los que escribir!" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:94 #, python-brace-format @@ -281,7 +285,7 @@ msgstr "Conectado a través de la red. No hay acceso para controlar la impresora #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" -msgstr "Acceso a la impresora solicitado. Apruebe la solicitud en la impresora." +msgstr "Acceso a la impresora solicitado. Apruebe la solicitud en la impresora" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:101 msgctxt "@info:title" @@ -308,7 +312,7 @@ msgstr "Volver a intentar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:106 msgctxt "@info:tooltip" msgid "Re-send the access request" -msgstr "Reenvía la solicitud de acceso." +msgstr "Reenvía la solicitud de acceso" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:109 msgctxt "@info:status" @@ -332,7 +336,7 @@ msgstr "Solicitar acceso" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:72 msgctxt "@info:tooltip" msgid "Send access request to the printer" -msgstr "Envía la solicitud de acceso a la impresora." +msgstr "Envía la solicitud de acceso a la impresora" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:202 msgctxt "@label" @@ -437,7 +441,7 @@ msgstr "Los PrintCores o los materiales de la impresora difieren de los del proy #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89 msgctxt "@info:status" msgid "Connected over the network" -msgstr "Conectado a través de la red." +msgstr "Conectado a través de la red" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:310 msgctxt "@info:status" @@ -511,7 +515,7 @@ msgstr "Vista de capas" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:102 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Cura no muestra correctamente las capas si la impresión de alambre está habilitada." +msgstr "Cura no muestra correctamente las capas si la impresión de alambre está habilitada" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:title" @@ -909,7 +913,7 @@ msgstr "Error al importar el perfil de {0}: {1} or !" msgid "No custom profile to import in file {0}" -msgstr "No hay ningún perfil personalizado que importar en el archivo {0}." +msgstr "No hay ningún perfil personalizado que importar en el archivo {0}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:218 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:228 @@ -1064,7 +1068,7 @@ msgstr "No se puede encontrar la ubicación" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:87 msgctxt "@title:window" msgid "Cura can't start" -msgstr "Cura no puede iniciarse." +msgstr "Cura no puede iniciarse" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 msgctxt "@label crash message" @@ -1074,7 +1078,12 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "

¡Vaya! Ultimaker Cura ha encontrado un error.

\n

Hemos detectado un error irreversible durante el inicio, posiblemente como consecuencia de varios archivos de configuración erróneos. Le recomendamos que realice una copia de seguridad y que restablezca los ajustes.

\n

Las copias de seguridad se encuentran en la carpeta de configuración.

\n

Envíenos el informe de errores para que podamos solucionar el problema.

\n " +msgstr "" +"

¡Vaya! Ultimaker Cura ha encontrado un error.

\n" +"

Hemos detectado un error irreversible durante el inicio, posiblemente como consecuencia de varios archivos de configuración erróneos. Le recomendamos que realice una copia de seguridad y que restablezca los ajustes.

\n" +"

Las copias de seguridad se encuentran en la carpeta de configuración.

\n" +"

Envíenos el informe de errores para que podamos solucionar el problema.

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1107,7 +1116,10 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "

Se ha producido un error grave en Cura. Envíenos este informe de errores para que podamos solucionar el problema.

\n

Utilice el botón \"Enviar informe\" para publicar automáticamente el informe de errores en nuestros servidores.

\n " +msgstr "" +"

Se ha producido un error grave en Cura. Envíenos este informe de errores para que podamos solucionar el problema.

\n" +"

Utilice el botón \"Enviar informe\" para publicar automáticamente el informe de errores en nuestros servidores.

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1572,7 +1584,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Este complemento incluye una licencia.\nDebe aceptar dicha licencia para instalar el complemento.\n¿Acepta las condiciones que aparecen a continuación?" +msgstr "" +"Este complemento incluye una licencia.\n" +"Debe aceptar dicha licencia para instalar el complemento.\n" +"¿Acepta las condiciones que aparecen a continuación?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1692,7 +1707,10 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n\nSeleccione la impresora de la siguiente lista:" +msgstr "" +"Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n" +"\n" +"Seleccione la impresora de la siguiente lista:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1809,7 +1827,7 @@ msgstr "Esperando: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "mover al principio" +msgstr "Mover al principio" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" @@ -1939,12 +1957,12 @@ msgstr "Acción requerida" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:38 msgctxt "@info:tooltip" msgid "Connect to a printer" -msgstr "Conecta a una impresora." +msgstr "Conecta a una impresora" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:117 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" -msgstr "Carga la configuración de la impresora en Cura." +msgstr "Carga la configuración de la impresora en Cura" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:118 msgctxt "@action:button" @@ -2054,7 +2072,7 @@ msgstr "Ajustes" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:474 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" -msgstr "Cambia las secuencias de comandos de posprocesamiento." +msgstr "Cambia las secuencias de comandos de posprocesamiento" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:16 msgctxt "@title:window" @@ -2484,7 +2502,7 @@ msgstr "Seleccionar firmware personalizado" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 msgctxt "@label" msgid "Please select any upgrades made to this Ultimaker Original" -msgstr "Seleccione cualquier actualización de Ultimaker Original." +msgstr "Seleccione cualquier actualización de Ultimaker Original" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 msgctxt "@label" @@ -2587,23 +2605,23 @@ msgstr "¡Todo correcto! Ha terminado con la comprobación." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" -msgstr "No está conectado a ninguna impresora." +msgstr "No está conectado a ninguna impresora" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:123 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" -msgstr "La impresora no acepta comandos." +msgstr "La impresora no acepta comandos" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:133 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:197 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" -msgstr "En mantenimiento. Compruebe la impresora." +msgstr "En mantenimiento. Compruebe la impresora" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:144 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" -msgstr "Se ha perdido la conexión con la impresora." +msgstr "Se ha perdido la conexión con la impresora" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:146 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:187 @@ -2626,7 +2644,7 @@ msgstr "Preparando..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:154 msgctxt "@label:MonitorStatus" msgid "Please remove the print" -msgstr "Retire la impresión." +msgstr "Retire la impresión" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" @@ -2648,7 +2666,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Ha personalizado parte de los ajustes del perfil.\n¿Desea descartar los cambios o guardarlos?" +msgstr "" +"Ha personalizado parte de los ajustes del perfil.\n" +"¿Desea descartar los cambios o guardarlos?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2840,12 +2860,12 @@ msgstr "Importar material" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:286 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" -msgstr "No se pudo importar el material en %1: %2." +msgstr "No se pudo importar el material en %1: %2" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" -msgstr "El material se ha importado correctamente en %1." +msgstr "El material se ha importado correctamente en %1" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:308 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:316 @@ -2856,12 +2876,12 @@ msgstr "Exportar material" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:320 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" -msgstr "Se ha producido un error al exportar el material a %1: %2." +msgstr "Se ha producido un error al exportar el material a %1: %2" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:326 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" -msgstr "El material se ha exportado correctamente a %1." +msgstr "El material se ha exportado correctamente a %1" #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 msgctxt "@title:tab" @@ -2957,7 +2977,7 @@ msgstr "Mostrar voladizos" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:357 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" -msgstr "Mueve la cámara de manera que el modelo se encuentre en el centro de la vista cuando se selecciona un modelo." +msgstr "Mueve la cámara de manera que el modelo se encuentre en el centro de la vista cuando se selecciona un modelo" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:362 msgctxt "@action:button" @@ -2992,7 +3012,7 @@ msgstr "¿Deben moverse los modelos en la plataforma de modo que no se crucen?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:406 msgctxt "@option:check" msgid "Ensure models are kept apart" -msgstr "Asegúrese de que lo modelos están separados." +msgstr "Asegúrese de que lo modelos están separados" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:415 msgctxt "@info:tooltip" @@ -3210,12 +3230,12 @@ msgstr "Estado:" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:181 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" -msgstr "Esperando un trabajo de impresión..." +msgstr "Esperando un trabajo de impresión" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:193 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" -msgstr "Esperando a que alguien limpie la placa de impresión..." +msgstr "Esperando a que alguien limpie la placa de impresión" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" @@ -3344,7 +3364,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\nCura se enorgullece de utilizar los siguientes proyectos de código abierto:" +msgstr "" +"Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\n" +"Cura se enorgullece de utilizar los siguientes proyectos de código abierto:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3457,7 +3479,10 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n\nHaga clic para abrir el administrador de perfiles." +msgstr "" +"Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n" +"\n" +"Haga clic para abrir el administrador de perfiles." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3511,7 +3536,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n\nHaga clic para mostrar estos ajustes." +msgstr "" +"Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n" +"\n" +"Haga clic para mostrar estos ajustes." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3539,7 +3567,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Este ajuste tiene un valor distinto del perfil.\n\nHaga clic para restaurar el valor del perfil." +msgstr "" +"Este ajuste tiene un valor distinto del perfil.\n" +"\n" +"Haga clic para restaurar el valor del perfil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3547,7 +3578,10 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n\nHaga clic para restaurar el valor calculado." +msgstr "" +"Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n" +"\n" +"Haga clic para restaurar el valor calculado." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3772,7 +3806,9 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Ajustes de impresión deshabilitados\nNo se pueden modificar los archivos GCode" +msgstr "" +"Ajustes de impresión deshabilitados\n" +"No se pueden modificar los archivos GCode" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4053,7 +4089,7 @@ msgstr "Listo para %1" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:43 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" -msgstr "No se puede segmentar." +msgstr "No se puede segmentar" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:45 msgctxt "@label:PrintjobStatus" @@ -4292,12 +4328,12 @@ msgstr "Altura de capa" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:277 msgctxt "@tooltip" msgid "This quality profile is not available for you current material and nozzle configuration. Please change these to enable this quality profile" -msgstr "Este perfil de calidad no está disponible para la configuración de material y de tobera actual. Cámbiela para poder habilitar este perfil de calidad." +msgstr "Este perfil de calidad no está disponible para la configuración de material y de tobera actual. Cámbiela para poder habilitar este perfil de calidad" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:450 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "Hay un perfil personalizado activado en este momento. Para habilitar el control deslizante de calidad, seleccione un perfil de calidad predeterminado en la pestaña Personalizado." +msgstr "Hay un perfil personalizado activado en este momento. Para habilitar el control deslizante de calidad, seleccione un perfil de calidad predeterminado en la pestaña Personalizado" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:467 msgctxt "@label" @@ -4544,7 +4580,7 @@ msgstr "Impresión USB" #: UserAgreement/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license." -msgstr "Preguntar al usuario una vez si acepta la licencia" +msgstr "Preguntar al usuario una vez si acepta la licencia." #: UserAgreement/plugin.json msgctxt "name" @@ -4654,7 +4690,7 @@ msgstr "Lector de GCode comprimido" #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" -msgstr "Extensión que permite el posprocesamiento de las secuencias de comandos creadas por los usuarios." +msgstr "Extensión que permite el posprocesamiento de las secuencias de comandos creadas por los usuarios" #: PostProcessingPlugin/plugin.json msgctxt "name" @@ -4664,7 +4700,7 @@ msgstr "Posprocesamiento" #: SupportEraser/plugin.json msgctxt "description" msgid "Creates an eraser mesh to block the printing of support in certain places" -msgstr "Crea una malla de borrado que impide la impresión de soportes en determinados lugares." +msgstr "Crea una malla de borrado que impide la impresión de soportes en determinados lugares" #: SupportEraser/plugin.json msgctxt "name" diff --git a/resources/i18n/es_ES/fdmprinter.def.json.po b/resources/i18n/es_ES/fdmprinter.def.json.po index 5520a7737b..99135813b2 100644 --- a/resources/i18n/es_ES/fdmprinter.def.json.po +++ b/resources/i18n/es_ES/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-09-28 14:56+0200\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -57,7 +57,9 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "Los comandos de GCode que se ejecutarán justo al inicio separados por - \n." +msgstr "" +"Los comandos de GCode que se ejecutarán justo al inicio separados por - \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -69,7 +71,9 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "Los comandos de GCode que se ejecutarán justo al final separados por -\n." +msgstr "" +"Los comandos de GCode que se ejecutarán justo al final separados por -\n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -239,7 +243,7 @@ msgstr "Número de extrusores habilitados" #: fdmprinter.def.json msgctxt "extruders_enabled_count description" msgid "Number of extruder trains that are enabled; automatically set in software" -msgstr "Número de trenes extrusores habilitados y configurados en el software de forma automática." +msgstr "Número de trenes extrusores habilitados y configurados en el software de forma automática" #: fdmprinter.def.json msgctxt "machine_nozzle_tip_outer_diameter label" @@ -544,7 +548,7 @@ msgstr "Aceleración máxima sobre el eje X" #: fdmprinter.def.json msgctxt "machine_max_acceleration_x description" msgid "Maximum acceleration for the motor of the X-direction" -msgstr "Aceleración máxima del motor de la dirección X." +msgstr "Aceleración máxima del motor de la dirección X" #: fdmprinter.def.json msgctxt "machine_max_acceleration_y label" @@ -1024,7 +1028,7 @@ msgstr "Patrón superior/inferior" #: fdmprinter.def.json msgctxt "top_bottom_pattern description" msgid "The pattern of the top/bottom layers." -msgstr "Patrón de las capas superiores/inferiores" +msgstr "Patrón de las capas superiores/inferiores." #: fdmprinter.def.json msgctxt "top_bottom_pattern option lines" @@ -1394,7 +1398,7 @@ msgstr "Espaciado de líneas del alisado" #: fdmprinter.def.json msgctxt "ironing_line_spacing description" msgid "The distance between the lines of ironing." -msgstr "Distancia entre las líneas del alisado" +msgstr "Distancia entre las líneas del alisado." #: fdmprinter.def.json msgctxt "ironing_flow label" @@ -1626,7 +1630,9 @@ msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "Agregar paredes adicionales alrededor del área de relleno. Estas paredes pueden hacer que las líneas del forro superior/inferior se aflojen menos, lo que significa que necesitaría menos capas de forro superior/inferior para obtener la misma calidad utilizando algo más de material.\nPuede utilizar esta función junto a la de Conectar polígonos de relleno para conectar todo el relleno en una única trayectoria de extrusión sin necesidad de desplazamientos ni retracciones si se configura correctamente." +msgstr "" +"Agregar paredes adicionales alrededor del área de relleno. Estas paredes pueden hacer que las líneas del forro superior/inferior se aflojen menos, lo que significa que necesitaría menos capas de forro superior/inferior para obtener la misma calidad utilizando algo más de material.\n" +"Puede utilizar esta función junto a la de Conectar polígonos de relleno para conectar todo el relleno en una única trayectoria de extrusión sin necesidad de desplazamientos ni retracciones si se configura correctamente." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1856,7 +1862,7 @@ msgstr "Temperatura de impresión predeterminada" #: fdmprinter.def.json msgctxt "default_material_print_temperature description" msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value" -msgstr "La temperatura predeterminada que se utiliza para imprimir. Debería ser la temperatura básica del material. Las demás temperaturas de impresión deberían calcularse a partir de este valor." +msgstr "La temperatura predeterminada que se utiliza para imprimir. Debería ser la temperatura básica del material. Las demás temperaturas de impresión deberían calcularse a partir de este valor" #: fdmprinter.def.json msgctxt "material_print_temperature label" @@ -1916,7 +1922,7 @@ msgstr "Temperatura predeterminada de la placa de impresión" #: fdmprinter.def.json msgctxt "default_material_bed_temperature description" msgid "The default temperature used for the heated build plate. This should be the \"base\" temperature of a build plate. All other print temperatures should use offsets based on this value" -msgstr "La temperatura predeterminada que se utiliza en placa de impresión caliente. Debería ser la temperatura básica de una placa de impresión. Las demás temperaturas de impresión deberían calcularse a partir de este valor." +msgstr "La temperatura predeterminada que se utiliza en placa de impresión caliente. Debería ser la temperatura básica de una placa de impresión. Las demás temperaturas de impresión deberían calcularse a partir de este valor" #: fdmprinter.def.json msgctxt "material_bed_temperature label" @@ -3793,7 +3799,9 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "La distancia horizontal entre la falda y la primera capa de la impresión.\nSe trata de la distancia mínima. Múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia." +msgstr "" +"La distancia horizontal entre la falda y la primera capa de la impresión.\n" +"Se trata de la distancia mínima. Múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4173,7 +4181,7 @@ msgstr "Tamaño de la torre auxiliar" #: fdmprinter.def.json msgctxt "prime_tower_size description" msgid "The width of the prime tower." -msgstr "Anchura de la torre auxiliar" +msgstr "Anchura de la torre auxiliar." #: fdmprinter.def.json msgctxt "prime_tower_min_volume label" @@ -4528,7 +4536,7 @@ msgstr "Experimental" #: fdmprinter.def.json msgctxt "experimental description" msgid "experimental!" -msgstr "Experimental" +msgstr "¡Experimental!" #: fdmprinter.def.json msgctxt "support_tree_enable label" @@ -5230,7 +5238,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "Distancia de un movimiento ascendente que se extrude a media velocidad.\nEsto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre." +msgstr "" +"Distancia de un movimiento ascendente que se extrude a media velocidad.\n" +"Esto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index 87af488e31..b4e68e16bc 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-09-28 14:59+0200\n" "Last-Translator: Bothof \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -64,7 +64,11 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "

Un ou plusieurs modèles 3D peuvent ne pas s'imprimer de manière optimale en raison de la taille du modèle et de la configuration matérielle :

\n

{model_names}

\n

Découvrez comment optimiser la qualité et la fiabilité de l'impression.

\n

Consultez le guide de qualité d'impression

" +msgstr "" +"

Un ou plusieurs modèles 3D peuvent ne pas s'imprimer de manière optimale en raison de la taille du modèle et de la configuration matérielle :

\n" +"

{model_names}

\n" +"

Découvrez comment optimiser la qualité et la fiabilité de l'impression.

\n" +"

Consultez le guide de qualité d'impression

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -169,7 +173,7 @@ msgstr "Enregistrement sur le lecteur amovible {0}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:94 msgctxt "@info:title" msgid "Saving" -msgstr "Enregistrement..." +msgstr "Enregistrement" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:104 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:107 @@ -378,7 +382,7 @@ msgstr "Envoi des données à l'imprimante" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:233 msgctxt "@info:title" msgid "Sending Data" -msgstr "Envoi des données..." +msgstr "Envoi des données" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:262 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:234 @@ -437,7 +441,7 @@ msgstr "Les PrintCores et / ou matériaux sur votre imprimante diffèrent de c #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89 msgctxt "@info:status" msgid "Connected over the network" -msgstr "Connecté sur le réseau." +msgstr "Connecté sur le réseau" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:310 msgctxt "@info:status" @@ -540,7 +544,7 @@ msgstr "Cura recueille des statistiques d'utilisation anonymes." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" msgid "Collecting Data" -msgstr "Collecte des données..." +msgstr "Collecte des données" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" @@ -1034,7 +1038,7 @@ msgstr "Multiplication et placement d'objets" #: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100 msgctxt "@info:title" msgid "Placing Object" -msgstr "Placement de l'objet..." +msgstr "Placement de l'objet" #: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100 #: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:96 @@ -1053,7 +1057,7 @@ msgstr "Recherche d'un nouvel emplacement pour les objets" #: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:71 msgctxt "@info:title" msgid "Finding Location" -msgstr "Recherche d'emplacement..." +msgstr "Recherche d'emplacement" #: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:97 #: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:151 @@ -1074,7 +1078,12 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "

Oups, un problème est survenu dans Ultimaker Cura.

\n

Une erreur irrécupérable est survenue lors du démarrage. Elle peut avoir été causée par des fichiers de configuration incorrects. Nous vous suggérons de sauvegarder et de réinitialiser votre configuration.

\n

Les sauvegardes se trouvent dans le dossier de configuration.

\n

Veuillez nous envoyer ce rapport d'incident pour que nous puissions résoudre le problème.

\n " +msgstr "" +"

Oups, un problème est survenu dans Ultimaker Cura.

\n" +"

Une erreur irrécupérable est survenue lors du démarrage. Elle peut avoir été causée par des fichiers de configuration incorrects. Nous vous suggérons de sauvegarder et de réinitialiser votre configuration.

\n" +"

Les sauvegardes se trouvent dans le dossier de configuration.

\n" +"

Veuillez nous envoyer ce rapport d'incident pour que nous puissions résoudre le problème.

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1107,7 +1116,10 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "

Une erreur fatale est survenue dans Cura. Veuillez nous envoyer ce rapport d'incident pour résoudre le problème

\n

Veuillez utiliser le bouton « Envoyer rapport » pour publier automatiquement un rapport d'erreur sur nos serveurs

\n " +msgstr "" +"

Une erreur fatale est survenue dans Cura. Veuillez nous envoyer ce rapport d'incident pour résoudre le problème

\n" +"

Veuillez utiliser le bouton « Envoyer rapport » pour publier automatiquement un rapport d'erreur sur nos serveurs

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1572,7 +1584,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Ce plug-in contient une licence.\nVous devez approuver cette licence pour installer ce plug-in.\nAcceptez-vous les clauses ci-dessous ?" +msgstr "" +"Ce plug-in contient une licence.\n" +"Vous devez approuver cette licence pour installer ce plug-in.\n" +"Acceptez-vous les clauses ci-dessous ?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1692,7 +1707,10 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n\nSélectionnez votre imprimante dans la liste ci-dessous :" +msgstr "" +"Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n" +"\n" +"Sélectionnez votre imprimante dans la liste ci-dessous :" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -1849,7 +1867,7 @@ msgstr "Mis en file d'attente" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:44 msgctxt "@label" msgid "Printing" -msgstr "Impression..." +msgstr "Impression" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" @@ -1914,7 +1932,7 @@ msgstr "Terminé" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:670 msgctxt "@label:status" msgid "Preparing" -msgstr "Préparation..." +msgstr "Préparation" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" @@ -2648,7 +2666,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Vous avez personnalisé certains paramètres du profil.\nSouhaitez-vous conserver ces changements, ou les annuler ?" +msgstr "" +"Vous avez personnalisé certains paramètres du profil.\n" +"Souhaitez-vous conserver ces changements, ou les annuler ?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2957,7 +2977,7 @@ msgstr "Mettre en surbrillance les porte-à-faux" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:357 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" -msgstr "Déplace la caméra afin que le modèle sélectionné se trouve au centre de la vue." +msgstr "Déplace la caméra afin que le modèle sélectionné se trouve au centre de la vue" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:362 msgctxt "@action:button" @@ -3344,7 +3364,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\nCura est fier d'utiliser les projets open source suivants :" +msgstr "" +"Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\n" +"Cura est fier d'utiliser les projets open source suivants :" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3457,7 +3479,10 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n\nCliquez pour ouvrir le gestionnaire de profils." +msgstr "" +"Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n" +"\n" +"Cliquez pour ouvrir le gestionnaire de profils." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3511,7 +3536,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n\nCliquez pour rendre ces paramètres visibles." +msgstr "" +"Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n" +"\n" +"Cliquez pour rendre ces paramètres visibles." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3539,7 +3567,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Ce paramètre possède une valeur qui est différente du profil.\n\nCliquez pour restaurer la valeur du profil." +msgstr "" +"Ce paramètre possède une valeur qui est différente du profil.\n" +"\n" +"Cliquez pour restaurer la valeur du profil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3547,7 +3578,10 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n\nCliquez pour restaurer la valeur calculée." +msgstr "" +"Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n" +"\n" +"Cliquez pour restaurer la valeur calculée." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3716,7 +3750,7 @@ msgstr "Afficher tous les paramètres" #: /home/ruben/Projects/Cura/resources/qml/Menus/SettingVisibilityPresetsMenu.qml:54 msgctxt "@action:inmenu" msgid "Manage Setting Visibility..." -msgstr "Gérer la visibilité des paramètres" +msgstr "Gérer la visibilité des paramètres..." #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:27 msgctxt "@label" @@ -3740,7 +3774,7 @@ msgstr "Nombre de copies" #: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml:33 msgctxt "@label:header configurations" msgid "Available configurations" -msgstr "Configurations disponibles :" +msgstr "Configurations disponibles" #: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/PrintCoreConfiguration.qml:28 msgctxt "@label:extruder label" @@ -3772,7 +3806,9 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Configuration de l'impression désactivée\nLes fichiers G-Code ne peuvent pas être modifiés" +msgstr "" +"Configuration de l'impression désactivée\n" +"Les fichiers G-Code ne peuvent pas être modifiés" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4292,7 +4328,7 @@ msgstr "Hauteur de la couche" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:277 msgctxt "@tooltip" msgid "This quality profile is not available for you current material and nozzle configuration. Please change these to enable this quality profile" -msgstr "Ce profil de qualité n'est pas disponible pour votre matériau et configuration des buses actuels. Veuillez modifier ces derniers pour activer ce profil de qualité." +msgstr "Ce profil de qualité n'est pas disponible pour votre matériau et configuration des buses actuels. Veuillez modifier ces derniers pour activer ce profil de qualité" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:450 msgctxt "@tooltip" @@ -4544,7 +4580,7 @@ msgstr "Impression par USB" #: UserAgreement/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license." -msgstr "Demander à l'utilisateur une fois s'il appose son accord à notre licence" +msgstr "Demander à l'utilisateur une fois s'il appose son accord à notre licence." #: UserAgreement/plugin.json msgctxt "name" @@ -4604,7 +4640,7 @@ msgstr "Plugin de périphérique de sortie sur disque amovible" #: UM3NetworkPrinting/plugin.json msgctxt "description" msgid "Manages network connections to Ultimaker 3 printers." -msgstr "Gère les connexions réseau vers les imprimantes Ultimaker 3" +msgstr "Gère les connexions réseau vers les imprimantes Ultimaker 3." #: UM3NetworkPrinting/plugin.json msgctxt "name" @@ -4884,7 +4920,7 @@ msgstr "Assistant de profil d'impression" #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." -msgstr "Permet l'écriture de fichiers 3MF" +msgstr "Permet l'écriture de fichiers 3MF." #: 3MFWriter/plugin.json msgctxt "name" diff --git a/resources/i18n/fr_FR/fdmprinter.def.json.po b/resources/i18n/fr_FR/fdmprinter.def.json.po index 60c17b93f8..b76aa532cb 100644 --- a/resources/i18n/fr_FR/fdmprinter.def.json.po +++ b/resources/i18n/fr_FR/fdmprinter.def.json.po @@ -6,9 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.5\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com" -"POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.comPOT-Creation-Date: 2018-09-19 17:07+0000\n" +"PO-Revision-Date: 2018-09-28 15:00+0200\n" "Last-Translator: Bothof \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -16,6 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.6\n" +"POT-Creation-Date: \n" #: fdmprinter.def.json msgctxt "machine_settings label" @@ -57,7 +57,9 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "Commandes G-Code à exécuter au tout début, séparées par \n." +msgstr "" +"Commandes G-Code à exécuter au tout début, séparées par \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -69,7 +71,9 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "Commandes G-Code à exécuter tout à la fin, séparées par \n." +msgstr "" +"Commandes G-Code à exécuter tout à la fin, séparées par \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -544,7 +548,7 @@ msgstr "Accélération maximale X" #: fdmprinter.def.json msgctxt "machine_max_acceleration_x description" msgid "Maximum acceleration for the motor of the X-direction" -msgstr "Accélération maximale pour le moteur du sens X." +msgstr "Accélération maximale pour le moteur du sens X" #: fdmprinter.def.json msgctxt "machine_max_acceleration_y label" @@ -1044,7 +1048,7 @@ msgstr "Zig Zag" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 label" msgid "Bottom Pattern Initial Layer" -msgstr "Couche initiale du motif du dessous." +msgstr "Couche initiale du motif du dessous" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 description" @@ -1474,7 +1478,7 @@ msgstr "Densité du remplissage" #: fdmprinter.def.json msgctxt "infill_sparse_density description" msgid "Adjusts the density of infill of the print." -msgstr "Adapte la densité de remplissage de l'impression" +msgstr "Adapte la densité de remplissage de l'impression." #: fdmprinter.def.json msgctxt "infill_line_distance label" @@ -1626,7 +1630,9 @@ msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "Ajoutez des parois supplémentaires autour de la zone de remplissage. De telles parois peuvent réduire l'affaissement des lignes de couche extérieure supérieure / inférieure, réduisant le nombre de couches extérieures supérieures / inférieures nécessaires pour obtenir la même qualité, au prix d'un peu de matériau supplémentaire.\nConfigurée correctement, cette fonctionnalité peut être combinée avec « Relier les polygones de remplissage » pour relier tous les remplissages en un seul mouvement d'extrusion sans avoir besoin de déplacements ou de rétractions." +msgstr "" +"Ajoutez des parois supplémentaires autour de la zone de remplissage. De telles parois peuvent réduire l'affaissement des lignes de couche extérieure supérieure / inférieure, réduisant le nombre de couches extérieures supérieures / inférieures nécessaires pour obtenir la même qualité, au prix d'un peu de matériau supplémentaire.\n" +"Configurée correctement, cette fonctionnalité peut être combinée avec « Relier les polygones de remplissage » pour relier tous les remplissages en un seul mouvement d'extrusion sans avoir besoin de déplacements ou de rétractions." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1856,7 +1862,7 @@ msgstr "Température d’impression par défaut" #: fdmprinter.def.json msgctxt "default_material_print_temperature description" msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value" -msgstr "La température par défaut utilisée pour l'impression. Il doit s'agir de la température de « base » d'un matériau. Toutes les autres températures d'impression doivent utiliser des décalages basés sur cette valeur." +msgstr "La température par défaut utilisée pour l'impression. Il doit s'agir de la température de « base » d'un matériau. Toutes les autres températures d'impression doivent utiliser des décalages basés sur cette valeur" #: fdmprinter.def.json msgctxt "material_print_temperature label" @@ -1916,7 +1922,7 @@ msgstr "Température du plateau par défaut" #: fdmprinter.def.json msgctxt "default_material_bed_temperature description" msgid "The default temperature used for the heated build plate. This should be the \"base\" temperature of a build plate. All other print temperatures should use offsets based on this value" -msgstr "Température par défaut utilisée pour le plateau chauffant. Il doit s'agir de la température de « base » d'un plateau. Toutes les autres températures d'impression sont définies en fonction de cette valeur." +msgstr "Température par défaut utilisée pour le plateau chauffant. Il doit s'agir de la température de « base » d'un plateau. Toutes les autres températures d'impression sont définies en fonction de cette valeur" #: fdmprinter.def.json msgctxt "material_bed_temperature label" @@ -3793,7 +3799,9 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "La distance horizontale entre la jupe et la première couche de l’impression.\nIl s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur." +msgstr "" +"La distance horizontale entre la jupe et la première couche de l’impression.\n" +"Il s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -5230,7 +5238,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\nCela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire." +msgstr "" +"Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\n" +"Cela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po index 610d113af8..7ce106e07c 100644 --- a/resources/i18n/it_IT/cura.po +++ b/resources/i18n/it_IT/cura.po @@ -8,13 +8,15 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-09-28 15:01+0200\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" "Language: it_IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.6\n" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22 msgctxt "@action" @@ -62,7 +64,11 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "

La stampa di uno o più modelli 3D può non avvenire in modo ottimale a causa della dimensioni modello e della configurazione materiale:

\n

{model_names}

\n

Scopri come garantire la migliore qualità ed affidabilità di stampa.

\n

Visualizza la guida alla qualità di stampa

" +msgstr "" +"

La stampa di uno o più modelli 3D può non avvenire in modo ottimale a causa della dimensioni modello e della configurazione materiale:

\n" +"

{model_names}

\n" +"

Scopri come garantire la migliore qualità ed affidabilità di stampa.

\n" +"

Visualizza la guida alla qualità di stampa

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -435,7 +441,7 @@ msgstr "I PrintCore e/o i materiali sulla stampante differiscono da quelli conte #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89 msgctxt "@info:status" msgid "Connected over the network" -msgstr "Collegato alla rete." +msgstr "Collegato alla rete" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:310 msgctxt "@info:status" @@ -1072,7 +1078,12 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "

Oops, Ultimaker Cura ha rilevato qualcosa che non sembra corretto.

\n

Abbiamo riscontrato un errore irrecuperabile durante l’avvio. È stato probabilmente causato da alcuni file di configurazione errati. Suggeriamo di effettuare il backup e ripristinare la configurazione.

\n

I backup sono contenuti nella cartella configurazione.

\n

Si prega di inviare questo Rapporto su crash per correggere il problema.

\n " +msgstr "" +"

Oops, Ultimaker Cura ha rilevato qualcosa che non sembra corretto.

\n" +"

Abbiamo riscontrato un errore irrecuperabile durante l’avvio. È stato probabilmente causato da alcuni file di configurazione errati. Suggeriamo di effettuare il backup e ripristinare la configurazione.

\n" +"

I backup sono contenuti nella cartella configurazione.

\n" +"

Si prega di inviare questo Rapporto su crash per correggere il problema.

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1105,7 +1116,10 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "

Si è verificato un errore fatale in Cura. Si prega di inviare questo Rapporto su crash per correggere il problema

\n

Usare il pulsante “Invia report\" per inviare automaticamente una segnalazione errore ai nostri server

\n " +msgstr "" +"

Si è verificato un errore fatale in Cura. Si prega di inviare questo Rapporto su crash per correggere il problema

\n" +"

Usare il pulsante “Invia report\" per inviare automaticamente una segnalazione errore ai nostri server

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1570,7 +1584,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Questo plugin contiene una licenza.\nÈ necessario accettare questa licenza per poter installare il plugin.\nAccetti i termini sotto riportati?" +msgstr "" +"Questo plugin contiene una licenza.\n" +"È necessario accettare questa licenza per poter installare il plugin.\n" +"Accetti i termini sotto riportati?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1690,7 +1707,10 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n\nSelezionare la stampante dall’elenco seguente:" +msgstr "" +"Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n" +"\n" +"Selezionare la stampante dall’elenco seguente:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -2646,7 +2666,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Sono state personalizzate alcune impostazioni del profilo.\nMantenere o eliminare tali impostazioni?" +msgstr "" +"Sono state personalizzate alcune impostazioni del profilo.\n" +"Mantenere o eliminare tali impostazioni?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3010,7 +3032,7 @@ msgstr "Visualizza il messaggio di avvertimento sul lettore codice G." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:441 msgctxt "@option:check" msgid "Caution message in g-code reader" -msgstr "Messaggio di avvertimento sul lettore codice G." +msgstr "Messaggio di avvertimento sul lettore codice G" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:449 msgctxt "@info:tooltip" @@ -3342,7 +3364,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura è stato sviluppato da Ultimaker B.V. in cooperazione con la comunità.\nCura è orgogliosa di utilizzare i seguenti progetti open source:" +msgstr "" +"Cura è stato sviluppato da Ultimaker B.V. in cooperazione con la comunità.\n" +"Cura è orgogliosa di utilizzare i seguenti progetti open source:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3455,7 +3479,10 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Alcuni valori di impostazione/esclusione sono diversi dai valori memorizzati nel profilo.\n\nFare clic per aprire la gestione profili." +msgstr "" +"Alcuni valori di impostazione/esclusione sono diversi dai valori memorizzati nel profilo.\n" +"\n" +"Fare clic per aprire la gestione profili." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3509,7 +3536,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Alcune impostazioni nascoste utilizzano valori diversi dal proprio valore normale calcolato.\n\nFare clic per rendere visibili queste impostazioni." +msgstr "" +"Alcune impostazioni nascoste utilizzano valori diversi dal proprio valore normale calcolato.\n" +"\n" +"Fare clic per rendere visibili queste impostazioni." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3537,7 +3567,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Questa impostazione ha un valore diverso dal profilo.\n\nFare clic per ripristinare il valore del profilo." +msgstr "" +"Questa impostazione ha un valore diverso dal profilo.\n" +"\n" +"Fare clic per ripristinare il valore del profilo." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3545,7 +3578,10 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Questa impostazione normalmente viene calcolata, ma attualmente ha impostato un valore assoluto.\n\nFare clic per ripristinare il valore calcolato." +msgstr "" +"Questa impostazione normalmente viene calcolata, ma attualmente ha impostato un valore assoluto.\n" +"\n" +"Fare clic per ripristinare il valore calcolato." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3770,7 +3806,9 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Impostazione di stampa disabilitata\nI file codice G non possono essere modificati" +msgstr "" +"Impostazione di stampa disabilitata\n" +"I file codice G non possono essere modificati" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -3956,7 +3994,7 @@ msgstr "&Unisci modelli" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu" msgid "&Multiply Model..." -msgstr "Mo<iplica modello" +msgstr "Mo<iplica modello..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" @@ -4245,7 +4283,7 @@ msgstr "Apri file" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:871 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." -msgstr "Rilevata la presenza di uno o più file codice G tra i file selezionati. È possibile aprire solo un file codice G alla volta. Se desideri aprire un file codice G, selezionane uno solo. " +msgstr "Rilevata la presenza di uno o più file codice G tra i file selezionati. È possibile aprire solo un file codice G alla volta. Se desideri aprire un file codice G, selezionane uno solo." #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 msgctxt "@title:window" @@ -4290,7 +4328,7 @@ msgstr "Altezza dello strato" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:277 msgctxt "@tooltip" msgid "This quality profile is not available for you current material and nozzle configuration. Please change these to enable this quality profile" -msgstr "Questo profilo di qualità non è disponibile per il materiale e la configurazione ugello corrente. Modificarli per abilitare questo profilo di qualità." +msgstr "Questo profilo di qualità non è disponibile per il materiale e la configurazione ugello corrente. Modificarli per abilitare questo profilo di qualità" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:450 msgctxt "@tooltip" @@ -4542,7 +4580,7 @@ msgstr "Stampa USB" #: UserAgreement/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license." -msgstr "Chiedere una volta all'utente se accetta la nostra licenza" +msgstr "Chiedere una volta all'utente se accetta la nostra licenza." #: UserAgreement/plugin.json msgctxt "name" @@ -4602,7 +4640,7 @@ msgstr "Plugin dispositivo di output unità rimovibile" #: UM3NetworkPrinting/plugin.json msgctxt "description" msgid "Manages network connections to Ultimaker 3 printers." -msgstr "Gestisce le connessioni di rete alle stampanti Ultimaker 3" +msgstr "Gestisce le connessioni di rete alle stampanti Ultimaker 3." #: UM3NetworkPrinting/plugin.json msgctxt "name" diff --git a/resources/i18n/it_IT/fdmprinter.def.json.po b/resources/i18n/it_IT/fdmprinter.def.json.po index b12c404f98..135c07b4ab 100644 --- a/resources/i18n/it_IT/fdmprinter.def.json.po +++ b/resources/i18n/it_IT/fdmprinter.def.json.po @@ -6,15 +6,16 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.5\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com" -"POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.comPOT-Creation-Date: 2018-09-19 17:07+0000\n" +"PO-Revision-Date: 2018-09-28 15:02+0200\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" "Language: it_IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: \n" +"X-Generator: Poedit 2.0.6\n" #: fdmprinter.def.json msgctxt "machine_settings label" @@ -56,7 +57,9 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "I comandi codice G da eseguire all’avvio, separati da \n." +msgstr "" +"I comandi codice G da eseguire all’avvio, separati da \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +71,9 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "I comandi codice G da eseguire alla fine, separati da \n." +msgstr "" +"I comandi codice G da eseguire alla fine, separati da \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -543,7 +548,7 @@ msgstr "Accelerazione massima X" #: fdmprinter.def.json msgctxt "machine_max_acceleration_x description" msgid "Maximum acceleration for the motor of the X-direction" -msgstr "Indica l’accelerazione massima del motore per la direzione X." +msgstr "Indica l’accelerazione massima del motore per la direzione X" #: fdmprinter.def.json msgctxt "machine_max_acceleration_y label" @@ -863,7 +868,7 @@ msgstr "Larghezza linea strato iniziale" #: fdmprinter.def.json msgctxt "initial_layer_line_width_factor description" msgid "Multiplier of the line width on the first layer. Increasing this could improve bed adhesion." -msgstr "Moltiplicatore della larghezza della linea del primo strato Il suo aumento potrebbe migliorare l'adesione al piano" +msgstr "Moltiplicatore della larghezza della linea del primo strato Il suo aumento potrebbe migliorare l'adesione al piano." #: fdmprinter.def.json msgctxt "shell label" @@ -1423,7 +1428,7 @@ msgstr "Velocità di stiratura" #: fdmprinter.def.json msgctxt "speed_ironing description" msgid "The speed at which to pass over the top surface." -msgstr "Velocità alla quale passare sopra la superficie superiore" +msgstr "Velocità alla quale passare sopra la superficie superiore." #: fdmprinter.def.json msgctxt "acceleration_ironing label" @@ -1625,7 +1630,9 @@ msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "Aggiunge pareti supplementari intorno alla zona di riempimento. Queste pareti possono ridurre l’abbassamento delle linee del rivestimento esterno superiore/inferiore, pertanto saranno necessari meno strati di rivestimento esterno superiore/inferiore per ottenere la stessa qualità al costo del materiale supplementare.\nQuesta funzione può essere abbinata a Collega poligoni riempimento per collegare tutto il riempimento in un unico percorso di estrusione senza necessità di avanzamenti o arretramenti, se configurata correttamente." +msgstr "" +"Aggiunge pareti supplementari intorno alla zona di riempimento. Queste pareti possono ridurre l’abbassamento delle linee del rivestimento esterno superiore/inferiore, pertanto saranno necessari meno strati di rivestimento esterno superiore/inferiore per ottenere la stessa qualità al costo del materiale supplementare.\n" +"Questa funzione può essere abbinata a Collega poligoni riempimento per collegare tutto il riempimento in un unico percorso di estrusione senza necessità di avanzamenti o arretramenti, se configurata correttamente." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1855,7 +1862,7 @@ msgstr "Temperatura di stampa preimpostata" #: fdmprinter.def.json msgctxt "default_material_print_temperature description" msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value" -msgstr "La temperatura preimpostata utilizzata per la stampa. Deve essere la temperatura “base” di un materiale. Tutte le altre temperature di stampa devono usare scostamenti basati su questo valore." +msgstr "La temperatura preimpostata utilizzata per la stampa. Deve essere la temperatura “base” di un materiale. Tutte le altre temperature di stampa devono usare scostamenti basati su questo valore" #: fdmprinter.def.json msgctxt "material_print_temperature label" @@ -1915,7 +1922,7 @@ msgstr "Temperatura piano di stampa preimpostata" #: fdmprinter.def.json msgctxt "default_material_bed_temperature description" msgid "The default temperature used for the heated build plate. This should be the \"base\" temperature of a build plate. All other print temperatures should use offsets based on this value" -msgstr "La temperatura preimpostata utilizzata per il piano di stampa. Deve essere la temperatura “base” di un piano di stampa. Tutte le altre temperature di stampa devono usare scostamenti basati su questo valore." +msgstr "La temperatura preimpostata utilizzata per il piano di stampa. Deve essere la temperatura “base” di un piano di stampa. Tutte le altre temperature di stampa devono usare scostamenti basati su questo valore" #: fdmprinter.def.json msgctxt "material_bed_temperature label" @@ -2005,7 +2012,7 @@ msgstr "Retrazione al cambio strato" #: fdmprinter.def.json msgctxt "retract_at_layer_change description" msgid "Retract the filament when the nozzle is moving to the next layer." -msgstr "Ritrae il filamento quando l'ugello si sta muovendo allo strato successivo. " +msgstr "Ritrae il filamento quando l'ugello si sta muovendo allo strato successivo." #: fdmprinter.def.json msgctxt "retraction_amount label" @@ -3792,7 +3799,9 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\nQuesta è la distanza minima. Più linee di skirt aumenteranno tale distanza." +msgstr "" +"Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\n" +"Questa è la distanza minima. Più linee di skirt aumenteranno tale distanza." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4642,7 +4651,7 @@ msgstr "Larghezza linea rivestimento superficie superiore" #: fdmprinter.def.json msgctxt "roofing_line_width description" msgid "Width of a single line of the areas at the top of the print." -msgstr "Larghezza di un singola linea delle aree nella parte superiore della stampa" +msgstr "Larghezza di un singola linea delle aree nella parte superiore della stampa." #: fdmprinter.def.json msgctxt "roofing_pattern label" @@ -5229,7 +5238,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\nCiò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing." +msgstr "" +"Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\n" +"Ciò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index 2ab5bb0e1e..80fefa2b42 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-09-28 15:19+0200\n" "Last-Translator: Bothof \n" "Language-Team: Japanese\n" "Language: ja_JP\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 2.0.4\n" +"X-Generator: Poedit 2.0.6\n" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22 msgctxt "@action" @@ -64,7 +64,11 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "

モデルのサイズまたは材料の設定によっては、適切に印刷しない3Dモデルがあります。:

\n

{model_names}

\n

可能な限り最高の品質および信頼性を得る方法をご覧ください。

\n

印字品質ガイドを見る

" +msgstr "" +"

モデルのサイズまたは材料の設定によっては、適切に印刷しない3Dモデルがあります。:

\n" +"

{model_names}

\n" +"

可能な限り最高の品質および信頼性を得る方法をご覧ください。

\n" +"

印字品質ガイドを見る

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -72,10 +76,9 @@ msgid "Show Changelog" msgstr "Changelogの表示" #: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:23 -#, fuzzy msgctxt "@item:inmenu" msgid "Flatten active settings" -msgstr "アクティブ設定を平らにします。" +msgstr "アクティブ設定を平らにします" #: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:35 #, fuzzy @@ -240,7 +243,7 @@ msgstr "{0}取り出し完了。デバイスを安全に取り外せます。" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:161 msgctxt "@info:title" msgid "Safely Remove Hardware" -msgstr "ハードウェアを安全に取り外します。" +msgstr "ハードウェアを安全に取り外します" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:163 #, python-brace-format @@ -268,7 +271,7 @@ msgstr "ネットワークのプリント" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:88 msgctxt "@info:status" msgid "Connected over the network." -msgstr "ネットワーク上で接続" +msgstr "ネットワーク上で接続。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:91 msgctxt "@info:status" @@ -283,7 +286,7 @@ msgstr "ネットワーク上で接続。プリントを操作するアクセス #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" -msgstr "プリンターへのアクセスが申請されました。プリンタへのリクエストを承認してください。" +msgstr "プリンターへのアクセスが申請されました。プリンタへのリクエストを承認してください" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:101 msgctxt "@info:title" @@ -315,7 +318,7 @@ msgstr "アクセスリクエストを再送信" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:109 msgctxt "@info:status" msgid "Access to the printer accepted" -msgstr "プリンターへのアクセスが承認されました。" +msgstr "プリンターへのアクセスが承認されました" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:113 msgctxt "@info:status" @@ -493,7 +496,7 @@ msgstr "{machine_name} で利用可能な新しい機能があります。プリ #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" -msgstr "新しい利用可能な%sファームウェアのアップデートがあります。" +msgstr "新しい利用可能な%sファームウェアのアップデートがあります" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:75 msgctxt "@action:button" @@ -513,7 +516,7 @@ msgstr "レイヤービュー" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:102 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Curaはワイヤープリンティング設定中には正確にレイヤーを表示しません。" +msgstr "Curaはワイヤープリンティング設定中には正確にレイヤーを表示しません" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:title" @@ -607,7 +610,7 @@ msgstr "選ばれたプリンターまたは選ばれたプリント構成が異 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415 msgctxt "@info:title" msgid "Unable to slice" -msgstr "スライスできません。" +msgstr "スライスできません" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:363 #, python-brace-format @@ -641,7 +644,7 @@ msgstr "モデルのデータがビルトボリュームに入っていないた #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" -msgstr "レイヤーを処理しています。" +msgstr "レイヤーを処理しています" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" @@ -743,12 +746,12 @@ msgstr "3MFファイル" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:34 msgctxt "@item:inlistbox" msgid "Cura Project 3MF file" -msgstr "Curaが3MF fileを算出します。" +msgstr "Curaが3MF fileを算出します" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "3Mf ファイルの書き込みエラー" +msgstr "3Mf ファイルの書き込みエラー。" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -841,7 +844,7 @@ msgstr "スライス前ファイル {0}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 msgctxt "@title:window" msgid "File Already Exists" -msgstr "すでに存在するファイルです。" +msgstr "すでに存在するファイルです" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:187 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122 @@ -886,13 +889,13 @@ msgstr "{0}にプロファイルを書き出すのに失敗 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." -msgstr " {0}にプロファイルを書き出すことに失敗しました。:ライタープラグイン失敗の報告" +msgstr " {0}にプロファイルを書き出すことに失敗しました。:ライタープラグイン失敗の報告。" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" -msgstr "{0}にプロファイルを書き出しました。" +msgstr "{0}にプロファイルを書き出しました" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 msgctxt "@info:title" @@ -905,13 +908,13 @@ msgstr "書き出し完了" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" -msgstr "{0}: {1}からプロファイルを取り込むことに失敗しました。" +msgstr "{0}: {1}からプロファイルを取り込むことに失敗しました" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "No custom profile to import in file {0}" -msgstr "ファイル{0}にはカスタムプロファイルがインポートされていません。" +msgstr "ファイル{0}にはカスタムプロファイルがインポートされていません" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:218 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:228 @@ -1030,7 +1033,7 @@ msgstr "現行バージョンと一致しないCuraバックアップをリス #: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27 msgctxt "@info:status" msgid "Multiplying and placing objects" -msgstr "造形データを増やす、配置する。" +msgstr "造形データを増やす、配置する" #: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:28 #: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:100 @@ -1061,7 +1064,7 @@ msgstr "位置確認" #: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:151 msgctxt "@info:title" msgid "Can't Find Location" -msgstr "位置を確保できません。" +msgstr "位置を確保できません" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:87 msgctxt "@title:window" @@ -1076,7 +1079,12 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "

申し訳ありません。Ultimaker Cura で何らかの不具合が生じています。

\n

開始時に回復不能のエラーが発生しました。不適切なファイル設定が原因の可能性があります。バックアップを実行してからリセットしてください。

\n

バックアップは、設定フォルダに保存されます。

\n

問題解決のために、このクラッシュ報告をお送りください。

\n " +msgstr "" +"

申し訳ありません。Ultimaker Cura で何らかの不具合が生じています。

\n" +"

開始時に回復不能のエラーが発生しました。不適切なファイル設定が原因の可能性があります。バックアップを実行してからリセットしてください。

\n" +"

バックアップは、設定フォルダに保存されます。

\n" +"

問題解決のために、このクラッシュ報告をお送りください。

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1109,7 +1117,10 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "

致命的なエラーが発生しました。問題解決のためこのクラッシュレポートを送信してください

\n

「レポート送信」ボタンを使用してバグレポートが自動的に当社サーバーに送られるようにしてください

\n " +msgstr "" +"

致命的なエラーが発生しました。問題解決のためこのクラッシュレポートを送信してください

\n" +"

「レポート送信」ボタンを使用してバグレポートが自動的に当社サーバーに送られるようにしてください

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1278,7 +1289,7 @@ msgstr "ビルドプレート形" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:151 msgctxt "@option:check" msgid "Origin at center" -msgstr "センターを出します。" +msgstr "センターを出します" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:159 msgctxt "@option:check" @@ -1574,7 +1585,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "このプラグインにはライセンスが含まれています。\nこのプラグインをインストールするにはこのライセンスに同意する必要があります。\n下の利用規約に同意しますか?" +msgstr "" +"このプラグインにはライセンスが含まれています。\n" +"このプラグインをインストールするにはこのライセンスに同意する必要があります。\n" +"下の利用規約に同意しますか?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1641,12 +1655,12 @@ msgstr "ファームウェアアップデート" #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:42 msgctxt "@label" msgid "Updating firmware." -msgstr "ファームウェアアップデート中" +msgstr "ファームウェアアップデート中。" #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:44 msgctxt "@label" msgid "Firmware update completed." -msgstr "ファームウェアアップデート完了" +msgstr "ファームウェアアップデート完了。" #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:46 msgctxt "@label" @@ -1723,7 +1737,7 @@ msgstr "更新" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:204 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" -msgstr "お持ちのプリンターがリストにない場合、ネットワーク・プリンティング・トラブルシューティング・ガイドを読んでください。" +msgstr "お持ちのプリンターがリストにない場合、ネットワーク・プリンティング・トラブルシューティング・ガイドを読んでください" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:231 msgctxt "@label" @@ -1936,7 +1950,7 @@ msgstr "再開" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:681 msgctxt "@label:status" msgid "Action required" -msgstr "アクションが必要です。" +msgstr "アクションが必要です" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:38 msgctxt "@info:tooltip" @@ -1946,7 +1960,7 @@ msgstr "プリンターにつなぐ" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:117 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" -msgstr "プリンターの構成をCuraに取り入れる。" +msgstr "プリンターの構成をCuraに取り入れる" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:118 msgctxt "@action:button" @@ -2086,7 +2100,7 @@ msgstr "画像を変換する…" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:33 msgctxt "@info:tooltip" msgid "The maximum distance of each pixel from \"Base.\"" -msgstr "“ベース”から各ピクセルへの最大距離" +msgstr "“ベース”から各ピクセルへの最大距離。" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:38 msgctxt "@action:label" @@ -2096,7 +2110,7 @@ msgstr "高さ(mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:56 msgctxt "@info:tooltip" msgid "The base height from the build plate in millimeters." -msgstr "ミリメートルでビルドプレートからベースの高さ" +msgstr "ミリメートルでビルドプレートからベースの高さ。" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:61 msgctxt "@action:label" @@ -2106,7 +2120,7 @@ msgstr "ベース(mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:79 msgctxt "@info:tooltip" msgid "The width in millimeters on the build plate." -msgstr "ビルドプレート上の幅ミリメートル" +msgstr "ビルドプレート上の幅ミリメートル。" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 msgctxt "@action:label" @@ -2141,7 +2155,7 @@ msgstr "暗いほうを高く" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149 msgctxt "@info:tooltip" msgid "The amount of smoothing to apply to the image." -msgstr "画像に適応したスムージング量" +msgstr "画像に適応したスムージング量。" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:154 msgctxt "@action:label" @@ -2438,12 +2452,12 @@ msgstr "ビルドプレートのレベリング" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 msgctxt "@label" msgid "To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' the nozzle will move to the different positions that can be adjusted." -msgstr "プリントの成功率を上げるために、ビルドプレートを今調整できます。’次のポジションに移動’をクリックすると" +msgstr "プリントの成功率を上げるために、ビルドプレートを今調整できます。’次のポジションに移動’をクリックすると。" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 msgctxt "@label" msgid "For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build plate height is right when the paper is slightly gripped by the tip of the nozzle." -msgstr "すべてのポジションに;" +msgstr "すべてのポジションに" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 msgctxt "@action:button" @@ -2483,7 +2497,7 @@ msgstr "カスタムファームウェアをアップロードする" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:87 msgctxt "@title:window" msgid "Select custom firmware" -msgstr "カスタムファームウェアを選択する。" +msgstr "カスタムファームウェアを選択する" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 msgctxt "@label" @@ -2503,7 +2517,7 @@ msgstr "プリンターチェック" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 msgctxt "@label" msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional" -msgstr "お持ちのUltimkaerにてサニティーチェックを数回行うことは推奨します。もしプリンター機能に問題ない場合はこの項目をスキップしてください。" +msgstr "お持ちのUltimkaerにてサニティーチェックを数回行うことは推奨します。もしプリンター機能に問題ない場合はこの項目をスキップしてください" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 msgctxt "@action:button" @@ -2513,7 +2527,7 @@ msgstr "プリンターチェックを開始する" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 msgctxt "@label" msgid "Connection: " -msgstr "コネクション:" +msgstr "コネクション: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 msgctxt "@info:status" @@ -2523,12 +2537,12 @@ msgstr "接続済" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 msgctxt "@info:status" msgid "Not connected" -msgstr "プリンターにつながっていません。" +msgstr "プリンターにつながっていません" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 msgctxt "@label" msgid "Min endstop X: " -msgstr "エンドストップ X:" +msgstr "エンドストップ X: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 @@ -2544,22 +2558,22 @@ msgstr "作品" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 msgctxt "@info:status" msgid "Not checked" -msgstr "チェックされていません。" +msgstr "チェックされていません" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 msgctxt "@label" msgid "Min endstop Y: " -msgstr "エンドストップ Y:" +msgstr "エンドストップ Y: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 msgctxt "@label" msgid "Min endstop Z: " -msgstr "エンドストップ Z:" +msgstr "エンドストップ Z: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 msgctxt "@label" msgid "Nozzle temperature check: " -msgstr "ノズル温度チェック:" +msgstr "ノズル温度チェック: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 @@ -2591,23 +2605,23 @@ msgstr "すべてに異常はありません。チェックアップを終了し #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:119 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" -msgstr "プリンターにつながっていません。" +msgstr "プリンターにつながっていません" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:123 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" -msgstr "今プリンタはコマンドを処理できません。" +msgstr "今プリンタはコマンドを処理できません" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:133 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:197 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" -msgstr "メンテナンス。プリンターをチェックしてください。" +msgstr "メンテナンス。プリンターをチェックしてください" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:144 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" -msgstr "プリンターへの接続が切断されました。" +msgstr "プリンターへの接続が切断されました" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:146 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:187 @@ -2630,7 +2644,7 @@ msgstr "準備中" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:154 msgctxt "@label:MonitorStatus" msgid "Please remove the print" -msgstr "造形物を取り出してください。" +msgstr "造形物を取り出してください" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" @@ -2678,12 +2692,12 @@ msgstr "毎回確認する" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" -msgstr "取り消し、再度確認しない。" +msgstr "取り消し、再度確認しない" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" -msgstr "キープし、再度確認しない。" +msgstr "キープし、再度確認しない" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:196 msgctxt "@action:button" @@ -2827,7 +2841,7 @@ msgstr "プリンター" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:239 msgctxt "@title:window" msgid "Confirm Remove" -msgstr "モデルを取り除きました。" +msgstr "モデルを取り除きました" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:263 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:240 @@ -2976,7 +2990,7 @@ msgstr "Curaのデフォルトのズーム機能は変更できるべきか?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:376 msgctxt "@action:button" msgid "Invert the direction of camera zoom." -msgstr "カメラのズーム方向を反転する" +msgstr "カメラのズーム方向を反転する。" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" @@ -3091,7 +3105,7 @@ msgstr "プロジェクトファイルを開く際のデフォルト機能" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:559 msgctxt "@window:text" msgid "Default behavior when opening a project file: " -msgstr "プロジェクトファイル開く際のデフォルト機能:" +msgstr "プロジェクトファイル開く際のデフォルト機能: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" @@ -3156,7 +3170,7 @@ msgstr "プリンターの不明なデータをUltimakerにおくりますか? #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:704 msgctxt "@option:check" msgid "Send (anonymous) print information" -msgstr " (不特定な) プリントインフォメーションを送信" +msgstr "(不特定な) プリントインフォメーションを送信" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:713 msgctxt "@action:button" @@ -3341,7 +3355,7 @@ msgstr "バージョン: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." -msgstr "熱溶解積層型3Dプリンティングのエンドtoエンドソリューション" +msgstr "熱溶解積層型3Dプリンティングのエンドtoエンドソリューション。" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:69 msgctxt "@info:credit" @@ -3461,7 +3475,9 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "いくらかの設定プロファイルにある値とことなる場合無効にします。\nプロファイルマネージャーをクリックして開いてください。" +msgstr "" +"いくらかの設定プロファイルにある値とことなる場合無効にします。\n" +"プロファイルマネージャーをクリックして開いてください。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3515,7 +3531,9 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n表示されるようにクリックしてください。" +msgstr "" +"いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n" +"表示されるようにクリックしてください。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3535,7 +3553,7 @@ msgstr "この設定は常に全てのエクストルーダーに共有されて #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 msgctxt "@label" msgid "The value is resolved from per-extruder values " -msgstr "この値は各エクストルーダーの値から取得します。" +msgstr "この値は各エクストルーダーの値から取得します " #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:188 msgctxt "@label" @@ -3543,7 +3561,9 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "この設定にプロファイルと異なった値があります。\nプロファイルの値を戻すためにクリックしてください。" +msgstr "" +"この設定にプロファイルと異なった値があります。\n" +"プロファイルの値を戻すためにクリックしてください。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3551,7 +3571,9 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "このセッティングは通常計算されます、今は絶対値に固定されています。\n計算された値に変更するためにクリックを押してください。" +msgstr "" +"このセッティングは通常計算されます、今は絶対値に固定されています。\n" +"計算された値に変更するためにクリックを押してください。" #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3629,17 +3651,17 @@ msgstr "プリント開始前にホットエンドを加熱します。加熱中 #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ExtruderBox.qml:401 msgctxt "@tooltip" msgid "The colour of the material in this extruder." -msgstr "エクストルーダーのマテリアルの色" +msgstr "エクストルーダーのマテリアルの色。" #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ExtruderBox.qml:433 msgctxt "@tooltip" msgid "The material in this extruder." -msgstr "エクストルーダー入ったフィラメント" +msgstr "エクストルーダー入ったフィラメント。" #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ExtruderBox.qml:465 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." -msgstr "ノズルが入ったエクストルーダー" +msgstr "ノズルが入ったエクストルーダー。" #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/HeatedBedBox.qml:25 #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:493 @@ -3655,12 +3677,12 @@ msgstr "ヒーティッドベッドの目標温度。ベッドはこの温度に #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/HeatedBedBox.qml:87 msgctxt "@tooltip" msgid "The current temperature of the heated bed." -msgstr "現在のヒーティッドベッドの温度" +msgstr "現在のヒーティッドベッドの温度。" #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/HeatedBedBox.qml:160 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." -msgstr "ベッドのプリヒート温度" +msgstr "ベッドのプリヒート温度。" #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/HeatedBedBox.qml:360 msgctxt "@tooltip of pre-heat" @@ -3776,7 +3798,9 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "プリントセットアップが無効\nG-codeファイルを修正することができません。" +msgstr "" +"プリントセットアップが無効\n" +"G-codeファイルを修正することができません" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -3786,12 +3810,12 @@ msgstr "時間仕様" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:577 msgctxt "@tooltip" msgid "Recommended Print Setup

Print with the recommended settings for the selected printer, material and quality." -msgstr "おすすめプリントセットアップ

選択されたプリンターにておすすめの設定、フィラメント、質にてプリントしてください。 " +msgstr "おすすめプリントセットアップ

選択されたプリンターにておすすめの設定、フィラメント、質にてプリントしてください。" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:582 msgctxt "@tooltip" msgid "Custom Print Setup

Print with finegrained control over every last bit of the slicing process." -msgstr "カスタムプリントセットアップ

スライス処理のきめ細かなコントロールにてプリントする" +msgstr "カスタムプリントセットアップ

スライス処理のきめ細かなコントロールにてプリントする。" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:106 msgctxt "@label" @@ -3836,7 +3860,7 @@ msgstr "&やめる" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:113 msgctxt "@action:inmenu menubar:view" msgid "3D View" -msgstr "3Dビュー " +msgstr "3Dビュー" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:120 msgctxt "@action:inmenu menubar:view" @@ -4037,12 +4061,12 @@ msgstr "サイドバーを展開する/たたむ" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:27 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" -msgstr "3Dモデルをロードしてください。" +msgstr "3Dモデルをロードしてください" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:37 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" -msgstr "スライスの準備ができました。" +msgstr "スライスの準備ができました" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:39 msgctxt "@label:PrintjobStatus" @@ -4057,7 +4081,7 @@ msgstr "%1の準備完了" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:43 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" -msgstr "スライスできません。" +msgstr "スライスできません" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:45 msgctxt "@label:PrintjobStatus" @@ -4296,7 +4320,7 @@ msgstr "レイヤーの高さ" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:277 msgctxt "@tooltip" msgid "This quality profile is not available for you current material and nozzle configuration. Please change these to enable this quality profile" -msgstr "この品質プロファイルは現在の材料およびノズル構成では使用できません。この品質プロファイルを使用できるように変更してください。" +msgstr "この品質プロファイルは現在の材料およびノズル構成では使用できません。この品質プロファイルを使用できるように変更してください" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:450 msgctxt "@tooltip" @@ -4341,7 +4365,7 @@ msgstr "グラデュアルを有効にする" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:856 msgctxt "@label" msgid "Generate Support" -msgstr "サポートを生成します。" +msgstr "サポートを生成します" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:890 msgctxt "@label" @@ -4366,7 +4390,7 @@ msgstr "ブリムまたはラフトのプリントの有効化。それぞれ、 #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:1080 msgctxt "@label" msgid "Need help improving your prints?
Read the Ultimaker Troubleshooting Guides" -msgstr "プリントにヘルプが必要ですか?
Ultimakerトラブルシューティングガイドを読んでください。" +msgstr "プリントにヘルプが必要ですか?
Ultimakerトラブルシューティングガイドを読んでください" # can’t enter japanese #: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 @@ -4428,7 +4452,7 @@ msgstr "互換性の確認" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:593 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." -msgstr "Ultimaker.comにてマテリアルのコンパティビリティを調べるためにクリック" +msgstr "Ultimaker.comにてマテリアルのコンパティビリティを調べるためにクリック。" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 msgctxt "@option:check" @@ -4468,7 +4492,7 @@ msgstr "ツールボックス" #: XRayView/plugin.json msgctxt "description" msgid "Provides the X-Ray view." -msgstr "透視ビューイング" +msgstr "透視ビューイング。" #: XRayView/plugin.json msgctxt "name" @@ -4478,7 +4502,7 @@ msgstr "透視ビュー" #: X3DReader/plugin.json msgctxt "description" msgid "Provides support for reading X3D files." -msgstr "X3Dファイルを読むこむためのサポートを供給する" +msgstr "X3Dファイルを読むこむためのサポートを供給する。" #: X3DReader/plugin.json msgctxt "name" @@ -4508,7 +4532,7 @@ msgstr "モデルチェッカー" #: cura-god-mode-plugin/src/GodMode/plugin.json msgctxt "description" msgid "Dump the contents of all settings to a HTML file." -msgstr "HTMLファイルに設定内容を放置する" +msgstr "HTMLファイルに設定内容を放置する。" #: cura-god-mode-plugin/src/GodMode/plugin.json msgctxt "name" @@ -4518,7 +4542,7 @@ msgstr "Godモード" #: ChangeLogPlugin/plugin.json msgctxt "description" msgid "Shows changes since latest checked version." -msgstr "最新の更新バージョンの変更点を表示する" +msgstr "最新の更新バージョンの変更点を表示する。" #: ChangeLogPlugin/plugin.json msgctxt "name" @@ -4528,7 +4552,7 @@ msgstr "Changelog" #: ProfileFlattener/plugin.json msgctxt "description" msgid "Create a flattend quality changes profile." -msgstr "プロファイルを変更するフラットエンドクオリティーを作成する" +msgstr "プロファイルを変更するフラットエンドクオリティーを作成する。" #: ProfileFlattener/plugin.json msgctxt "name" @@ -4548,7 +4572,7 @@ msgstr "USBプリンティング" #: UserAgreement/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license." -msgstr "ライセンスに同意するかどうかユーザーに1回だけ確認する" +msgstr "ライセンスに同意するかどうかユーザーに1回だけ確認する。" #: UserAgreement/plugin.json msgctxt "name" @@ -4598,7 +4622,7 @@ msgstr "ステージの準備" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." -msgstr "取り外し可能なドライブホットプラギング及びサポートの書き出しの供給" +msgstr "取り外し可能なドライブホットプラギング及びサポートの書き出しの供給。" #: RemovableDriveOutputDevice/plugin.json msgctxt "name" @@ -4628,7 +4652,7 @@ msgstr "モニターステージ" #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." -msgstr "ファームウェアアップデートをチェックする" +msgstr "ファームウェアアップデートをチェックする。" #: FirmwareUpdateChecker/plugin.json msgctxt "name" @@ -4698,7 +4722,7 @@ msgstr "フィラメントプロファイル" #: LegacyProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from legacy Cura versions." -msgstr "レガシーCura Versionsからプロファイルを取り込むためのサポートを供給する" +msgstr "レガシーCura Versionsからプロファイルを取り込むためのサポートを供給する。" #: LegacyProfileReader/plugin.json msgctxt "name" @@ -4718,7 +4742,7 @@ msgstr "G-codeプロファイルリーダー" #: VersionUpgrade/VersionUpgrade32to33/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.2 to Cura 3.3." -msgstr "Cura 3.2からCura 3.3のコンフィグレーションアップグレート" +msgstr "Cura 3.2からCura 3.3のコンフィグレーションアップグレート。" #: VersionUpgrade/VersionUpgrade32to33/plugin.json msgctxt "name" @@ -4728,7 +4752,7 @@ msgstr "3.2から3.3にバージョンアップグレート" #: VersionUpgrade/VersionUpgrade33to34/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.3 to Cura 3.4." -msgstr "Cura 3.3からCura 3.4のコンフィグレーションアップグレート" +msgstr "Cura 3.3からCura 3.4のコンフィグレーションアップグレート。" #: VersionUpgrade/VersionUpgrade33to34/plugin.json msgctxt "name" @@ -4738,7 +4762,7 @@ msgstr "3.3から3.4にバージョンアップグレート" #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." -msgstr "Cura 2.5 からCura 2.6のコンフィグレーションアップグレート" +msgstr "Cura 2.5 からCura 2.6のコンフィグレーションアップグレート。" #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "name" @@ -4748,7 +4772,7 @@ msgstr "2.5から2.6にバージョンアップグレート" #: VersionUpgrade/VersionUpgrade27to30/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." -msgstr "Cura 2.7からCura 3.0のコンフィグレーションアップグレート" +msgstr "Cura 2.7からCura 3.0のコンフィグレーションアップグレート。" #: VersionUpgrade/VersionUpgrade27to30/plugin.json msgctxt "name" @@ -4758,7 +4782,7 @@ msgstr "2.7から3.0にバージョンアップグレート" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "Cura 3.4 から Cura 3.5 のコンフィグレーションアップグレート" +msgstr "Cura 3.4 から Cura 3.5 のコンフィグレーションアップグレート。" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" @@ -4768,7 +4792,7 @@ msgstr "3.4 から 3.5 にバージョンアップグレート" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "Cura 3.0からCura 3.1のコンフィグレーションアップグレート" +msgstr "Cura 3.0からCura 3.1のコンフィグレーションアップグレート。" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" @@ -4778,7 +4802,7 @@ msgstr "3.0から3.1にバージョンアップグレート" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." -msgstr "Cura 2.6 からCura 2.7のコンフィグレーションアップグレート" +msgstr "Cura 2.6 からCura 2.7のコンフィグレーションアップグレート。" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "name" @@ -4788,7 +4812,7 @@ msgstr "2.6から2.7にバージョンアップグレート" #: VersionUpgrade/VersionUpgrade21to22/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.1 to Cura 2.2." -msgstr "Cura 2.1 からCura 2.2のコンフィグレーションアップグレート" +msgstr "Cura 2.1 からCura 2.2のコンフィグレーションアップグレート。" #: VersionUpgrade/VersionUpgrade21to22/plugin.json msgctxt "name" @@ -4798,7 +4822,7 @@ msgstr "2.1 から2.2にバージョンアップグレート" #: VersionUpgrade/VersionUpgrade22to24/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." -msgstr "Cura 2.2 からCura 2.4のコンフィグレーションアップグレート" +msgstr "Cura 2.2 からCura 2.4のコンフィグレーションアップグレート。" #: VersionUpgrade/VersionUpgrade22to24/plugin.json msgctxt "name" @@ -4808,7 +4832,7 @@ msgstr "2.2 から2.4にバージョンアップグレート" #: ImageReader/plugin.json msgctxt "description" msgid "Enables ability to generate printable geometry from 2D image files." -msgstr "2Dの画像ファイルからプリント可能なジオメトリーを生成を可能にする" +msgstr "2Dの画像ファイルからプリント可能なジオメトリーを生成を可能にする。" #: ImageReader/plugin.json msgctxt "name" @@ -4818,7 +4842,7 @@ msgstr "画像リーダー" #: CuraEngineBackend/plugin.json msgctxt "description" msgid "Provides the link to the CuraEngine slicing backend." -msgstr "CuraEngineスライシングバックエンドにリンクを供給する" +msgstr "CuraEngineスライシングバックエンドにリンクを供給する。" #: CuraEngineBackend/plugin.json msgctxt "name" @@ -4828,7 +4852,7 @@ msgstr "Curaエンジンバックエンド" #: PerObjectSettingsTool/plugin.json msgctxt "description" msgid "Provides the Per Model Settings." -msgstr "各モデル設定を与える" +msgstr "各モデル設定を与える。" #: PerObjectSettingsTool/plugin.json msgctxt "name" @@ -4838,7 +4862,7 @@ msgstr "各モデル設定ツール" #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." -msgstr "3MFファイルを読むこむためのサポートを供給する" +msgstr "3MFファイルを読むこむためのサポートを供給する。" #: 3MFReader/plugin.json msgctxt "name" @@ -4848,7 +4872,7 @@ msgstr "3MFリーダー" #: SolidView/plugin.json msgctxt "description" msgid "Provides a normal solid mesh view." -msgstr "ノーマルなソリットメッシュビューを供給する" +msgstr "ノーマルなソリットメッシュビューを供給する。" #: SolidView/plugin.json msgctxt "name" @@ -4858,7 +4882,7 @@ msgstr "ソリッドビュー" #: GCodeReader/plugin.json msgctxt "description" msgid "Allows loading and displaying G-code files." -msgstr "G-codeファイルの読み込み、表示を許可する" +msgstr "G-codeファイルの読み込み、表示を許可する。" #: GCodeReader/plugin.json msgctxt "name" @@ -4868,7 +4892,7 @@ msgstr "G-codeリーダー" #: CuraProfileWriter/plugin.json msgctxt "description" msgid "Provides support for exporting Cura profiles." -msgstr "Curaプロファイルを書き出すためのサポートを供給する" +msgstr "Curaプロファイルを書き出すためのサポートを供給する。" #: CuraProfileWriter/plugin.json msgctxt "name" @@ -4888,7 +4912,7 @@ msgstr "プリントプロファイルアシスタント" #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." -msgstr "3MFファイルを読むこむためのサポートを供給する" +msgstr "3MFファイルを読むこむためのサポートを供給する。" #: 3MFWriter/plugin.json msgctxt "name" @@ -4908,7 +4932,7 @@ msgstr "Ultimkerプリンターのアクション" #: CuraProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing Cura profiles." -msgstr "Curaプロファイルを取り込むためのサポートを供給する" +msgstr "Curaプロファイルを取り込むためのサポートを供給する。" #: CuraProfileReader/plugin.json msgctxt "name" diff --git a/resources/i18n/ja_JP/fdmextruder.def.json.po b/resources/i18n/ja_JP/fdmextruder.def.json.po index cfa3fe4dee..c18a660997 100644 --- a/resources/i18n/ja_JP/fdmextruder.def.json.po +++ b/resources/i18n/ja_JP/fdmextruder.def.json.po @@ -6,16 +6,16 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.5\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com" -"POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.comPOT-Creation-Date: 2018-09-19 17:07+0000\n" +"PO-Revision-Date: 2018-09-28 15:24+0200\n" "Last-Translator: Bothof \n" "Language-Team: Japanese\n" "Language: ja_JP\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.4\n" +"X-Generator: Poedit 2.0.6\n" +"POT-Creation-Date: \n" #: fdmextruder.def.json msgctxt "machine_settings label" @@ -45,7 +45,7 @@ msgstr "ノズルID" #: fdmextruder.def.json msgctxt "machine_nozzle_id description" msgid "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\"." -msgstr "\"AA 0.4\"や\"BB 0.8\"などのノズルID" +msgstr "\"AA 0.4\"や\"BB 0.8\"などのノズルID。" #: fdmextruder.def.json msgctxt "machine_nozzle_size label" @@ -65,7 +65,7 @@ msgstr "Xノズルオフセット" #: fdmextruder.def.json msgctxt "machine_nozzle_offset_x description" msgid "The x-coordinate of the offset of the nozzle." -msgstr "ノズルのX軸のオフセット" +msgstr "ノズルのX軸のオフセット。" #: fdmextruder.def.json msgctxt "machine_nozzle_offset_y label" @@ -75,7 +75,7 @@ msgstr "Yノズルオフセット" #: fdmextruder.def.json msgctxt "machine_nozzle_offset_y description" msgid "The y-coordinate of the offset of the nozzle." -msgstr "ノズルのY軸のオフセット" +msgstr "ノズルのY軸のオフセット。" #: fdmextruder.def.json msgctxt "machine_extruder_start_code label" @@ -105,7 +105,7 @@ msgstr "エクストルーダー スタート位置X" #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_x description" msgid "The x-coordinate of the starting position when turning the extruder on." -msgstr "エクストルーダーのX座標のスタート位置" +msgstr "エクストルーダーのX座標のスタート位置。" #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_y label" @@ -115,7 +115,7 @@ msgstr "エクストルーダースタート位置Y" #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_y description" msgid "The y-coordinate of the starting position when turning the extruder on." -msgstr "エクストルーダーのY座標のスタート位置" +msgstr "エクストルーダーのY座標のスタート位置。" #: fdmextruder.def.json msgctxt "machine_extruder_end_code label" @@ -145,7 +145,7 @@ msgstr "エクストルーダーエンド位置X" #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_x description" msgid "The x-coordinate of the ending position when turning the extruder off." -msgstr "エクストルーダーを切った際のX座標の最終位置" +msgstr "エクストルーダーを切った際のX座標の最終位置。" #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_y label" @@ -155,7 +155,7 @@ msgstr "エクストルーダーエンド位置Y" #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_y description" msgid "The y-coordinate of the ending position when turning the extruder off." -msgstr "エクストルーダーを切った際のY座標の最終位置" +msgstr "エクストルーダーを切った際のY座標の最終位置。" #: fdmextruder.def.json msgctxt "extruder_prime_pos_z label" diff --git a/resources/i18n/ja_JP/fdmprinter.def.json.po b/resources/i18n/ja_JP/fdmprinter.def.json.po index 23497053a7..c584466616 100644 --- a/resources/i18n/ja_JP/fdmprinter.def.json.po +++ b/resources/i18n/ja_JP/fdmprinter.def.json.po @@ -6,9 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.5\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com" -"POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.comPOT-Creation-Date: 2018-09-19 17:07+0000\n" +"PO-Revision-Date: 2018-09-28 15:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Japanese\n" "Language: ja_JP\n" @@ -16,7 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 2.0.4\n" +"X-Generator: Poedit 2.0.6\n" +"POT-Creation-Date: \n" #: fdmprinter.def.json msgctxt "machine_settings label" @@ -38,7 +38,7 @@ msgstr "プリンターのタイプ" #: fdmprinter.def.json msgctxt "machine_name description" msgid "The name of your 3D printer model." -msgstr "3Dプリンターの機種名" +msgstr "3Dプリンターの機種名。" #: fdmprinter.def.json msgctxt "machine_show_variants label" @@ -61,7 +61,9 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "最初に実行するG-codeコマンドは、\nで区切ります。" +msgstr "" +"最初に実行するG-codeコマンドは、\n" +"で区切ります。" #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -73,7 +75,9 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "最後に実行するG-codeコマンドは、\nで区切ります。" +msgstr "" +"最後に実行するG-codeコマンドは、\n" +"で区切ります。" #: fdmprinter.def.json msgctxt "material_guid label" @@ -84,7 +88,7 @@ msgstr "マテリアルGUID" #: fdmprinter.def.json msgctxt "material_guid description" msgid "GUID of the material. This is set automatically. " -msgstr "マテリアルのGUID。これは自動的に設定されます。" +msgstr "マテリアルのGUID。これは自動的に設定されます。 " #: fdmprinter.def.json msgctxt "material_diameter label" @@ -485,7 +489,7 @@ msgstr "ノズルID" #: fdmprinter.def.json msgctxt "machine_nozzle_id description" msgid "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\"." -msgstr "\"AA 0.4\"や\"BB 0.8\"などのノズルID" +msgstr "\"AA 0.4\"や\"BB 0.8\"などのノズルID。" #: fdmprinter.def.json msgctxt "machine_nozzle_size label" @@ -575,7 +579,7 @@ msgstr "最大加速度X" #: fdmprinter.def.json msgctxt "machine_max_acceleration_x description" msgid "Maximum acceleration for the motor of the X-direction" -msgstr "X方向のモーターの最大速度。" +msgstr "X方向のモーターの最大速度" #: fdmprinter.def.json msgctxt "machine_max_acceleration_y label" @@ -857,7 +861,7 @@ msgstr "サポート面のライン幅" #: fdmprinter.def.json msgctxt "support_interface_line_width description" msgid "Width of a single line of support roof or floor." -msgstr "サポートのルーフ、フロアのライン幅" +msgstr "サポートのルーフ、フロアのライン幅。" #: fdmprinter.def.json msgctxt "support_roof_line_width label" @@ -953,7 +957,7 @@ msgstr "壁の厚さ" #: fdmprinter.def.json msgctxt "wall_thickness description" msgid "The thickness of the walls in the horizontal direction. This value divided by the wall line width defines the number of walls." -msgstr "壁の厚さ。この値をラインの幅で割ることで壁の数が決まります" +msgstr "壁の厚さ。この値をラインの幅で割ることで壁の数が決まります。" #: fdmprinter.def.json msgctxt "wall_line_count label" @@ -986,7 +990,7 @@ msgstr "上部表面用エクストルーダー" #: fdmprinter.def.json msgctxt "roofing_extruder_nr description" msgid "The extruder train used for printing the top most skin. This is used in multi-extrusion." -msgstr "上部の表面印刷用のエクストルーダー。デュアルノズル印刷時に使用" +msgstr "上部の表面印刷用のエクストルーダー。デュアルノズル印刷時に使用。" #: fdmprinter.def.json msgctxt "roofing_layer_count label" @@ -997,7 +1001,7 @@ msgstr "上部表面レイヤー" #: fdmprinter.def.json msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." -msgstr "上部表面のレイヤー数。通常一層で綺麗に出来上がります" +msgstr "上部表面のレイヤー数。通常一層で綺麗に出来上がります。" #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" @@ -1008,7 +1012,7 @@ msgstr "上部/底面エクストルーダー" #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr description" msgid "The extruder train used for printing the top and bottom skin. This is used in multi-extrusion." -msgstr "上部と下部の表面を印刷する時に使われるエクストルーダー。デュアルノズル印刷時に使用" +msgstr "上部と下部の表面を印刷する時に使われるエクストルーダー。デュアルノズル印刷時に使用。" #: fdmprinter.def.json msgctxt "top_bottom_thickness label" @@ -1260,7 +1264,7 @@ msgstr "薄壁印刷" #: fdmprinter.def.json msgctxt "fill_outline_gaps description" msgid "Print pieces of the model which are horizontally thinner than the nozzle size." -msgstr "ノズルサイズよりも細い壁を作ります" +msgstr "ノズルサイズよりも細い壁を作ります。" #: fdmprinter.def.json msgctxt "xy_offset label" @@ -1281,7 +1285,7 @@ msgstr "初期層水平展開" #: fdmprinter.def.json msgctxt "xy_offset_layer_0 description" msgid "Amount of offset applied to all polygons in the first layer. A negative value can compensate for squishing of the first layer known as \"elephant's foot\"." -msgstr "最初のレイヤーのポリゴンに適用されるオフセットの値。マイナスの値はelephant's footと呼ばれる第一層が潰れるを現象を軽減させます" +msgstr "最初のレイヤーのポリゴンに適用されるオフセットの値。マイナスの値はelephant's footと呼ばれる第一層が潰れるを現象を軽減させます。" #: fdmprinter.def.json msgctxt "z_seam_type label" @@ -1322,7 +1326,9 @@ msgstr "ZシームX" #: fdmprinter.def.json msgctxt "z_seam_x description" msgid "The X coordinate of the position near where to start printing each part in a layer." -msgstr "レイヤー内の各印刷を開始するX座\n標の位置。" +msgstr "" +"レイヤー内の各印刷を開始するX座\n" +"標の位置。" #: fdmprinter.def.json msgctxt "z_seam_y label" @@ -1433,7 +1439,7 @@ msgstr "アイロンパターン" #: fdmprinter.def.json msgctxt "ironing_pattern description" msgid "The pattern to use for ironing top surfaces." -msgstr "アイロンのパターン" +msgstr "アイロンのパターン。" #: fdmprinter.def.json msgctxt "ironing_pattern option concentric" @@ -1456,7 +1462,7 @@ msgstr "アイロン線のスペース" #: fdmprinter.def.json msgctxt "ironing_line_spacing description" msgid "The distance between the lines of ironing." -msgstr "アイロンライン同士の距離" +msgstr "アイロンライン同士の距離。" #: fdmprinter.def.json msgctxt "ironing_flow label" @@ -1489,7 +1495,7 @@ msgstr "アイロン速度" #: fdmprinter.def.json msgctxt "speed_ironing description" msgid "The speed at which to pass over the top surface." -msgstr "上部表面通過時の速度" +msgstr "上部表面通過時の速度。" #: fdmprinter.def.json msgctxt "acceleration_ironing label" @@ -1500,7 +1506,7 @@ msgstr "アイロン加速度" #: fdmprinter.def.json msgctxt "acceleration_ironing description" msgid "The acceleration with which ironing is performed." -msgstr "アイロン時の加速度" +msgstr "アイロン時の加速度。" #: fdmprinter.def.json msgctxt "jerk_ironing label" @@ -1511,7 +1517,7 @@ msgstr "アイロンジャーク" #: fdmprinter.def.json msgctxt "jerk_ironing description" msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "アイロン時の最大加速度" +msgstr "アイロン時の最大加速度。" #: fdmprinter.def.json msgctxt "infill label" @@ -1533,7 +1539,7 @@ msgstr "インフィルエクストルーダー" #: fdmprinter.def.json msgctxt "infill_extruder_nr description" msgid "The extruder train used for printing infill. This is used in multi-extrusion." -msgstr "インフィル造形時に使われるExtruder。デュアルノズルの場合に利用します" +msgstr "インフィル造形時に使われるExtruder。デュアルノズルの場合に利用します。" #: fdmprinter.def.json msgctxt "infill_sparse_density label" @@ -1700,7 +1706,9 @@ msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "インフィルエリア周辺に外壁を追加します。このような壁は、上層/底層ラインにたるみを作ります。つまり、一部の外壁材料の費用で同じ品質を実現するためには、必要な上層/底層スキンが少ないことを意味します。\nこの機能は、インフィルポリゴン接合と組み合わせて、構成が正しい場合、移動または引き戻しが必要なく、すべてのインフィルを1つの押出経路に接続することができます。" +msgstr "" +"インフィルエリア周辺に外壁を追加します。このような壁は、上層/底層ラインにたるみを作ります。つまり、一部の外壁材料の費用で同じ品質を実現するためには、必要な上層/底層スキンが少ないことを意味します。\n" +"この機能は、インフィルポリゴン接合と組み合わせて、構成が正しい場合、移動または引き戻しが必要なく、すべてのインフィルを1つの押出経路に接続することができます。" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1803,7 +1811,9 @@ msgstr "インフィル優先" #: fdmprinter.def.json msgctxt "infill_before_walls description" msgid "Print the infill before printing the walls. Printing the walls first may lead to more accurate walls, but overhangs print worse. Printing the infill first leads to sturdier walls, but the infill pattern might sometimes show through the surface." -msgstr "壁より前にインフィルをプリントします はじめに壁をプリントするとより精密な壁になりますが、オーバーハングのプリントは悪化します\nはじめにインフィルをプリントすると丈夫な壁になりますが、インフィルの模様が時折表面から透けて表れます" +msgstr "" +"壁より前にインフィルをプリントします はじめに壁をプリントするとより精密な壁になりますが、オーバーハングのプリントは悪化します\n" +"はじめにインフィルをプリントすると丈夫な壁になりますが、インフィルの模様が時折表面から透けて表れます。" #: fdmprinter.def.json msgctxt "min_infill_area label" @@ -1938,7 +1948,7 @@ msgstr "デフォルト印刷温度" #: fdmprinter.def.json msgctxt "default_material_print_temperature description" msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value" -msgstr "印刷中のデフォルトの温度。これはマテリアルの基本温度となります。他のすべての造形温度はこの値に基づいてオフセットする必要があります。" +msgstr "印刷中のデフォルトの温度。これはマテリアルの基本温度となります。他のすべての造形温度はこの値に基づいてオフセットする必要があります" #: fdmprinter.def.json msgctxt "material_print_temperature label" @@ -1998,7 +2008,7 @@ msgstr "ビルドプレートのデフォルト温度" #: fdmprinter.def.json msgctxt "default_material_bed_temperature description" msgid "The default temperature used for the heated build plate. This should be the \"base\" temperature of a build plate. All other print temperatures should use offsets based on this value" -msgstr "加熱式ビルドプレートのデフォルト温度。これはビルドプレートの「基本」温度でます。他のすべての印刷温度はこの値に基づいてオフセットする必要があります。" +msgstr "加熱式ビルドプレートのデフォルト温度。これはビルドプレートの「基本」温度でます。他のすべての印刷温度はこの値に基づいてオフセットする必要があります" #: fdmprinter.def.json msgctxt "material_bed_temperature label" @@ -2078,7 +2088,7 @@ msgstr "引き戻し有効" #: fdmprinter.def.json msgctxt "retraction_enable description" msgid "Retract the filament when the nozzle is moving over a non-printed area. " -msgstr "ノズルが印刷しないで良い領域を移動する際にフィラメントを引き戻す。" +msgstr "ノズルが印刷しないで良い領域を移動する際にフィラメントを引き戻す。 " #: fdmprinter.def.json msgctxt "retract_at_layer_change label" @@ -2098,7 +2108,7 @@ msgstr "引き戻し距離" #: fdmprinter.def.json msgctxt "retraction_amount description" msgid "The length of material retracted during a retraction move." -msgstr "引き戻されるマテリアルの長さ" +msgstr "引き戻されるマテリアルの長さ。" #: fdmprinter.def.json msgctxt "retraction_speed label" @@ -2106,10 +2116,9 @@ msgid "Retraction Speed" msgstr "引き戻し速度" #: fdmprinter.def.json -#, fuzzy msgctxt "retraction_speed description" msgid "The speed at which the filament is retracted and primed during a retraction move." -msgstr "フィラメントが引き戻される時のスピード" +msgstr "フィラメントが引き戻される時のスピード。" #: fdmprinter.def.json msgctxt "retraction_retract_speed label" @@ -2117,10 +2126,9 @@ msgid "Retraction Retract Speed" msgstr "引き戻し速度の取り消し" #: fdmprinter.def.json -#, fuzzy msgctxt "retraction_retract_speed description" msgid "The speed at which the filament is retracted during a retraction move." -msgstr "フィラメントが引き戻される時のスピード" +msgstr "フィラメントが引き戻される時のスピード。" #: fdmprinter.def.json msgctxt "retraction_prime_speed label" @@ -2128,10 +2136,9 @@ msgid "Retraction Prime Speed" msgstr "押し戻し速度の取り消し" #: fdmprinter.def.json -#, fuzzy msgctxt "retraction_prime_speed description" msgid "The speed at which the filament is primed during a retraction move." -msgstr "フィラメントが引き戻される時のスピード" +msgstr "フィラメントが引き戻される時のスピード。" #: fdmprinter.def.json msgctxt "retraction_extra_prime_amount label" @@ -2251,7 +2258,7 @@ msgstr "印刷速度" #: fdmprinter.def.json msgctxt "speed_print description" msgid "The speed at which printing happens." -msgstr "印刷スピード" +msgstr "印刷スピード。" #: fdmprinter.def.json msgctxt "speed_infill label" @@ -2261,7 +2268,7 @@ msgstr "インフィル速度" #: fdmprinter.def.json msgctxt "speed_infill description" msgid "The speed at which infill is printed." -msgstr "インフィルを印刷する速度" +msgstr "インフィルを印刷する速度。" #: fdmprinter.def.json msgctxt "speed_wall label" @@ -2271,7 +2278,7 @@ msgstr "ウォール速度" #: fdmprinter.def.json msgctxt "speed_wall description" msgid "The speed at which the walls are printed." -msgstr "ウォールを印刷する速度" +msgstr "ウォールを印刷する速度。" #: fdmprinter.def.json msgctxt "speed_wall_0 label" @@ -2302,7 +2309,7 @@ msgstr "最上面速度" #: fdmprinter.def.json msgctxt "speed_roofing description" msgid "The speed at which top surface skin layers are printed." -msgstr "上部表面プリント時の速度" +msgstr "上部表面プリント時の速度。" #: fdmprinter.def.json msgctxt "speed_topbottom label" @@ -2312,7 +2319,7 @@ msgstr "上面/底面速度" #: fdmprinter.def.json msgctxt "speed_topbottom description" msgid "The speed at which top/bottom layers are printed." -msgstr "トップ/ボトムのレイヤーのプリント速度" +msgstr "トップ/ボトムのレイヤーのプリント速度。" #: fdmprinter.def.json msgctxt "speed_support label" @@ -2353,7 +2360,7 @@ msgstr "サポートルーフ速度" #: fdmprinter.def.json msgctxt "speed_support_roof description" msgid "The speed at which the roofs of support are printed. Printing them at lower speeds can improve overhang quality." -msgstr "ルーフとフロアのサポート材をプリントする速度 これらを低速でプリントするとオーバーハングの品質を向上できます" +msgstr "ルーフとフロアのサポート材をプリントする速度 これらを低速でプリントするとオーバーハングの品質を向上できます。" #: fdmprinter.def.json msgctxt "speed_support_bottom label" @@ -2384,7 +2391,7 @@ msgstr "移動速度" #: fdmprinter.def.json msgctxt "speed_travel description" msgid "The speed at which travel moves are made." -msgstr "移動中のスピード" +msgstr "移動中のスピード。" #: fdmprinter.def.json msgctxt "speed_layer_0 label" @@ -2394,7 +2401,7 @@ msgstr "初期レイヤー速度" #: fdmprinter.def.json msgctxt "speed_layer_0 description" msgid "The speed for the initial layer. A lower value is advised to improve adhesion to the build plate." -msgstr "一層目での速度。ビルトプレートへの接着を向上するため低速を推奨します" +msgstr "一層目での速度。ビルトプレートへの接着を向上するため低速を推奨します。" #: fdmprinter.def.json msgctxt "speed_print_layer_0 label" @@ -2404,7 +2411,7 @@ msgstr "初期レイヤー印刷速度" #: fdmprinter.def.json msgctxt "speed_print_layer_0 description" msgid "The speed of printing for the initial layer. A lower value is advised to improve adhesion to the build plate." -msgstr "一層目をプリントする速度 ビルトプレートへの接着を向上するため低速を推奨します" +msgstr "一層目をプリントする速度 ビルトプレートへの接着を向上するため低速を推奨します。" #: fdmprinter.def.json msgctxt "speed_travel_layer_0 label" @@ -2464,7 +2471,7 @@ msgstr "均一フローの最大速度" #: fdmprinter.def.json msgctxt "speed_equalize_flow_max description" msgid "Maximum print speed when adjusting the print speed in order to equalize flow." -msgstr "吐出を均一にするための調整時の最高スピード" +msgstr "吐出を均一にするための調整時の最高スピード。" #: fdmprinter.def.json msgctxt "acceleration_enabled label" @@ -2514,7 +2521,7 @@ msgstr "外壁加速度" #: fdmprinter.def.json msgctxt "acceleration_wall_0 description" msgid "The acceleration with which the outermost walls are printed." -msgstr "最も外側の壁をプリントする際の加速度" +msgstr "最も外側の壁をプリントする際の加速度。" #: fdmprinter.def.json msgctxt "acceleration_wall_x label" @@ -2535,7 +2542,7 @@ msgstr "最上面加速度" #: fdmprinter.def.json msgctxt "acceleration_roofing description" msgid "The acceleration with which top surface skin layers are printed." -msgstr "上部表面プリント時の加速度" +msgstr "上部表面プリント時の加速度。" #: fdmprinter.def.json msgctxt "acceleration_topbottom label" @@ -2555,7 +2562,7 @@ msgstr "サポート加速度" #: fdmprinter.def.json msgctxt "acceleration_support description" msgid "The acceleration with which the support structure is printed." -msgstr "サポート材プリント時の加速スピード" +msgstr "サポート材プリント時の加速スピード。" #: fdmprinter.def.json msgctxt "acceleration_support_infill label" @@ -2575,7 +2582,7 @@ msgstr "サポートインタフェース加速度" #: fdmprinter.def.json msgctxt "acceleration_support_interface description" msgid "The acceleration with which the roofs and floors of support are printed. Printing them at lower acceleration can improve overhang quality." -msgstr "サポートの上面と下面が印刷される加速度。低加速度で印刷するとオーバーハングの品質が向上します" +msgstr "サポートの上面と下面が印刷される加速度。低加速度で印刷するとオーバーハングの品質が向上します。" #: fdmprinter.def.json msgctxt "acceleration_support_roof label" @@ -2647,7 +2654,7 @@ msgstr "初期レイヤー移動加速度" #: fdmprinter.def.json msgctxt "acceleration_travel_layer_0 description" msgid "The acceleration for travel moves in the initial layer." -msgstr "最初のレイヤー時の加速度" +msgstr "最初のレイヤー時の加速度。" #: fdmprinter.def.json msgctxt "acceleration_skirt_brim label" @@ -2728,7 +2735,7 @@ msgstr "最上面ジャーク" #: fdmprinter.def.json msgctxt "jerk_roofing description" msgid "The maximum instantaneous velocity change with which top surface skin layers are printed." -msgstr "上部表面プリント時の最大加速度" +msgstr "上部表面プリント時の最大加速度。" #: fdmprinter.def.json msgctxt "jerk_topbottom label" @@ -2940,7 +2947,7 @@ msgstr "移動回避距離" #: fdmprinter.def.json msgctxt "travel_avoid_distance description" msgid "The distance between the nozzle and already printed parts when avoiding during travel moves." -msgstr "ノズルが既に印刷された部分を移動する際の間隔" +msgstr "ノズルが既に印刷された部分を移動する際の間隔。" #: fdmprinter.def.json msgctxt "start_layers_at_same_position label" @@ -3133,7 +3140,7 @@ msgstr "ヘッド持ち上げ" #: fdmprinter.def.json msgctxt "cool_lift_head description" msgid "When the minimum speed is hit because of minimum layer time, lift the head away from the print and wait the extra time until the minimum layer time is reached." -msgstr "レイヤーの最小プリント時間より早く印刷が終わった場合、ヘッド部分を持ち上げてレイヤーの最小プリント時間に到達するまで待機します" +msgstr "レイヤーの最小プリント時間より早く印刷が終わった場合、ヘッド部分を持ち上げてレイヤーの最小プリント時間に到達するまで待機します。" #: fdmprinter.def.json msgctxt "support label" @@ -3397,7 +3404,7 @@ msgstr "サポートX/Y距離" #: fdmprinter.def.json msgctxt "support_xy_distance description" msgid "Distance of the support structure from the print in the X/Y directions." -msgstr "印刷物からX/Y方向へのサポート材との距離" +msgstr "印刷物からX/Y方向へのサポート材との距離。" #: fdmprinter.def.json msgctxt "support_xy_overrides_z label" @@ -3427,7 +3434,7 @@ msgstr "最小サポートX/Y距離" #: fdmprinter.def.json msgctxt "support_xy_distance_overhang description" msgid "Distance of the support structure from the overhang in the X/Y directions. " -msgstr "X/Y方向におけるオーバーハングからサポートまでの距離" +msgstr "X/Y方向におけるオーバーハングからサポートまでの距離。 " #: fdmprinter.def.json msgctxt "support_bottom_stair_step_height label" @@ -3490,7 +3497,7 @@ msgstr "サポートインフィル半減回数" #: fdmprinter.def.json msgctxt "gradual_support_infill_steps description" msgid "Number of times to reduce the support infill density by half when getting further below top surfaces. Areas which are closer to top surfaces get a higher density, up to the Support Infill Density." -msgstr "天井面より下に遠ざかる際にサポートのインフィル密度が半減する回数 天井面に近い領域ほど高い密度となり、サポートのインフィル密度になります" +msgstr "天井面より下に遠ざかる際にサポートのインフィル密度が半減する回数 天井面に近い領域ほど高い密度となり、サポートのインフィル密度になります。" #: fdmprinter.def.json msgctxt "gradual_support_infill_step_height label" @@ -3584,7 +3591,7 @@ msgstr "サポートインタフェース密度" #: fdmprinter.def.json msgctxt "support_interface_density description" msgid "Adjusts the density of the roofs and floors of the support structure. A higher value results in better overhangs, but the supports are harder to remove." -msgstr "サポート材のルーフとフロアの密度を調整します 大きな値ではオーバーハングでの成功率があがりますが、サポート材が除去しにくくなります" +msgstr "サポート材のルーフとフロアの密度を調整します 大きな値ではオーバーハングでの成功率があがりますが、サポート材が除去しにくくなります。" #: fdmprinter.def.json msgctxt "support_roof_density label" @@ -3673,7 +3680,7 @@ msgstr "サポートルーフパターン" #: fdmprinter.def.json msgctxt "support_roof_pattern description" msgid "The pattern with which the roofs of the support are printed." -msgstr "サポートのルーフが印刷されるパターン" +msgstr "サポートのルーフが印刷されるパターン。" #: fdmprinter.def.json msgctxt "support_roof_pattern option lines" @@ -3922,7 +3929,9 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "スカートと印刷の最初の層の間の水平距離。\nこれは最小距離です。複数のスカートラインがこの距離から外側に展開されます。" +msgstr "" +"スカートと印刷の最初の層の間の水平距離。\n" +"これは最小距離です。複数のスカートラインがこの距離から外側に展開されます。" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4162,7 +4171,7 @@ msgstr "ラフト上層層印刷加速度" #: fdmprinter.def.json msgctxt "raft_surface_acceleration description" msgid "The acceleration with which the top raft layers are printed." -msgstr "ラフトのトップ印刷時の加速度" +msgstr "ラフトのトップ印刷時の加速度。" #: fdmprinter.def.json msgctxt "raft_interface_acceleration label" @@ -4172,7 +4181,7 @@ msgstr "ラフト中間層印刷加速度" #: fdmprinter.def.json msgctxt "raft_interface_acceleration description" msgid "The acceleration with which the middle raft layer is printed." -msgstr "ラフトの中間層印刷時の加速度" +msgstr "ラフトの中間層印刷時の加速度。" #: fdmprinter.def.json msgctxt "raft_base_acceleration label" @@ -4182,7 +4191,7 @@ msgstr "ラフトベース印刷加速度" #: fdmprinter.def.json msgctxt "raft_base_acceleration description" msgid "The acceleration with which the base raft layer is printed." -msgstr "ラフトの底面印刷時の加速度" +msgstr "ラフトの底面印刷時の加速度。" #: fdmprinter.def.json msgctxt "raft_jerk label" @@ -4202,7 +4211,7 @@ msgstr "ラフト上層印刷ジャーク" #: fdmprinter.def.json msgctxt "raft_surface_jerk description" msgid "The jerk with which the top raft layers are printed." -msgstr "トップラフト層印刷時のジャーク" +msgstr "トップラフト層印刷時のジャーク。" #: fdmprinter.def.json msgctxt "raft_interface_jerk label" @@ -4212,7 +4221,7 @@ msgstr "ラフト中間層印刷ジャーク" #: fdmprinter.def.json msgctxt "raft_interface_jerk description" msgid "The jerk with which the middle raft layer is printed." -msgstr "ミドルラフト層印刷時のジャーク" +msgstr "ミドルラフト層印刷時のジャーク。" #: fdmprinter.def.json msgctxt "raft_base_jerk label" @@ -4222,7 +4231,7 @@ msgstr "ラフトベース印刷ジャーク" #: fdmprinter.def.json msgctxt "raft_base_jerk description" msgid "The jerk with which the base raft layer is printed." -msgstr "ベースラフト層印刷時のジャーク" +msgstr "ベースラフト層印刷時のジャーク。" #: fdmprinter.def.json msgctxt "raft_fan_speed label" @@ -4262,7 +4271,7 @@ msgstr "ラフトベースファン速度" #: fdmprinter.def.json msgctxt "raft_base_fan_speed description" msgid "The fan speed for the base raft layer." -msgstr "ベースラフト層印刷時のファン速度" +msgstr "ベースラフト層印刷時のファン速度。" #: fdmprinter.def.json msgctxt "dual label" @@ -4272,7 +4281,7 @@ msgstr "デュアルエクストルーダー" #: fdmprinter.def.json msgctxt "dual description" msgid "Settings used for printing with multiple extruders." -msgstr "デュアルエクストルーダーで印刷するための設定" +msgstr "デュアルエクストルーダーで印刷するための設定。" #: fdmprinter.def.json msgctxt "prime_tower_enable label" @@ -4282,7 +4291,7 @@ msgstr "プライムタワーを有効にする" #: fdmprinter.def.json msgctxt "prime_tower_enable description" msgid "Print a tower next to the print which serves to prime the material after each nozzle switch." -msgstr "印刷物の横にタワーを造形して、ノズル交換後にフィラメントの調整をします" +msgstr "印刷物の横にタワーを造形して、ノズル交換後にフィラメントの調整をします。" #: fdmprinter.def.json msgctxt "prime_tower_circular label" @@ -4312,7 +4321,7 @@ msgstr "プライムタワー最小容積" #: fdmprinter.def.json msgctxt "prime_tower_min_volume description" msgid "The minimum volume for each layer of the prime tower in order to purge enough material." -msgstr "プライムタワーの各層の最小容積" +msgstr "プライムタワーの各層の最小容積。" #: fdmprinter.def.json msgctxt "prime_tower_position_x label" @@ -4342,7 +4351,7 @@ msgstr "プライムタワーのフロー" #: fdmprinter.def.json msgctxt "prime_tower_flow description" msgid "Flow compensation: the amount of material extruded is multiplied by this value." -msgstr "吐出量: マテリアルの吐出量はこの値の乗算で計算されます" +msgstr "吐出量: マテリアルの吐出量はこの値の乗算で計算されます。" #: fdmprinter.def.json msgctxt "prime_tower_wipe_enabled label" @@ -4382,7 +4391,7 @@ msgstr "Ooze Shield距離" #: fdmprinter.def.json msgctxt "ooze_shield_dist description" msgid "Distance of the ooze shield from the print, in the X/Y directions." -msgstr "壁(ooze shield)の造形物からの距離" +msgstr "壁(ooze shield)の造形物からの距離。" #: fdmprinter.def.json msgctxt "meshfix label" @@ -4522,7 +4531,7 @@ msgstr "インフィルメッシュの順序" #: fdmprinter.def.json msgctxt "infill_mesh_order description" msgid "Determines which infill mesh is inside the infill of another infill mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes." -msgstr "他のインフィルメッシュのインフィル内にあるインフィルメッシュを決定します。優先度の高いのインフィルメッシュは、低いメッシュと通常のメッシュのインフィルを変更します" +msgstr "他のインフィルメッシュのインフィル内にあるインフィルメッシュを決定します。優先度の高いのインフィルメッシュは、低いメッシュと通常のメッシュのインフィルを変更します。" #: fdmprinter.def.json msgctxt "cutting_mesh label" @@ -4790,7 +4799,7 @@ msgstr "上部表面パターン" #: fdmprinter.def.json msgctxt "roofing_pattern description" msgid "The pattern of the top most layers." -msgstr "上層のパターン" +msgstr "上層のパターン。" #: fdmprinter.def.json msgctxt "roofing_pattern option lines" @@ -4932,7 +4941,7 @@ msgstr "ドラフトシールドとX/Yの距離" #: fdmprinter.def.json msgctxt "draft_shield_dist description" msgid "Distance of the draft shield from the print, in the X/Y directions." -msgstr "ドラフトシールドと造形物のX / Y方向の距離" +msgstr "ドラフトシールドと造形物のX / Y方向の距離。" #: fdmprinter.def.json msgctxt "draft_shield_height_limitation label" @@ -5085,7 +5094,7 @@ msgstr "スパゲッティインフィルの手順" #: fdmprinter.def.json msgctxt "spaghetti_infill_stepped description" msgid "Whether to print spaghetti infill in steps or extrude all the infill filament at the end of the print." -msgstr "スパゲッティインフィルをプリントするか印刷の最後に全てのインフィルフィラメントを押し出すか" +msgstr "スパゲッティインフィルをプリントするか印刷の最後に全てのインフィルフィラメントを押し出すか。" #: fdmprinter.def.json msgctxt "spaghetti_max_infill_angle label" @@ -5107,7 +5116,7 @@ msgstr "スパゲッティインフィル最大高さ" #: fdmprinter.def.json msgctxt "spaghetti_max_height description" msgid "The maximum height of inside space which can be combined and filled from the top." -msgstr "内部空間の上から結合して埋め込むことができる最大の高さ" +msgstr "内部空間の上から結合して埋め込むことができる最大の高さ。" #: fdmprinter.def.json msgctxt "spaghetti_inset label" @@ -5140,7 +5149,7 @@ msgstr "スパゲッティインフィル余剰調整" #: fdmprinter.def.json msgctxt "spaghetti_infill_extra_volume description" msgid "A correction term to adjust the total volume being extruded each time when filling spaghetti." -msgstr "スパゲッティをプリントする際に毎回行なう吐出量の調整" +msgstr "スパゲッティをプリントする際に毎回行なう吐出量の調整。" #: fdmprinter.def.json msgctxt "support_conical_enabled label" From d61dd4987b4260044dce4b41e3c6900fa8a738be Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 28 Sep 2018 16:17:35 +0200 Subject: [PATCH 106/212] [translate] Some small corrections for 3.5 Dutch (nl_NL). --- resources/i18n/nl_NL/cura.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index 23bcf17c19..ac498a9236 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -72,12 +72,12 @@ msgstr "Wijzigingenlogboek Weergeven" #: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:23 msgctxt "@item:inmenu" msgid "Flatten active settings" -msgstr "Actieve instellingen vlakken" +msgstr "Actieve instellingen platmaken" #: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:35 msgctxt "@info:status" msgid "Profile has been flattened & activated." -msgstr "Profiel is gevlakt en geactiveerd." +msgstr "Profiel is platgemaakt en geactiveerd." #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:40 msgctxt "@item:inmenu" @@ -129,7 +129,7 @@ msgstr "Gecomprimeerd G-code-bestand" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "GCodeWriter ondersteunt geen tekstmodus." +msgstr "GCodeGzWriter ondersteunt geen tekstmodus." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -144,7 +144,7 @@ msgstr "Voorbereiden" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" -msgstr "Opslaan op verwisselbaar station" +msgstr "Op te slaan op verwisselbaar station" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 #, python-brace-format @@ -1492,7 +1492,7 @@ msgstr "Terug" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "De-installeren bevestigen " +msgstr "Bevestig de-installeren " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" @@ -1797,7 +1797,7 @@ msgstr "Wachten op: Niet-beschikbare printer" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "Wachten op: Eerst beschikbaar" +msgstr "Wachten op: Eerst beschikbare" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" @@ -1807,12 +1807,12 @@ msgstr "Wachten op: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "Naar boven verplaatsen" +msgstr "Plaats bovenaan" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "Printtaak naar boven verplaatsen" +msgstr "Plaats printtaak bovenaan" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." @@ -2667,7 +2667,7 @@ msgstr "Aangepast" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:639 msgctxt "@option:discardOrKeep" msgid "Always ask me this" -msgstr "Altijd vragen" +msgstr "Dit altijd vragen" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 msgctxt "@option:discardOrKeep" From 8aa2e0193c913bf80e605778f5c68d0cc9e9fefd Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 28 Sep 2018 16:33:42 +0200 Subject: [PATCH 107/212] [translate] Even smaller corrections for 3.5 Dutch (nl_NL). --- resources/i18n/nl_NL/fdmprinter.def.json.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/i18n/nl_NL/fdmprinter.def.json.po b/resources/i18n/nl_NL/fdmprinter.def.json.po index 85d7a6e949..bbcef2b8c7 100644 --- a/resources/i18n/nl_NL/fdmprinter.def.json.po +++ b/resources/i18n/nl_NL/fdmprinter.def.json.po @@ -1158,12 +1158,12 @@ msgstr "Hiermee wordt de doorvoer gecompenseerd voor delen van binnenwanden die #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "Minimale Wanddoorvoer" +msgstr "Minimale Wand-doorvoer" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "Minimaal toegestane doorvoerpercentage voor een wandlijn. Compensatie van de overlapping van wanden zorgt voor een kortere doorvoer van een wand als deze dicht bij een bestaande wand ligt. Wanden waarbij de doorvoerwaarde lager is dan deze waarde, worden vervangen door een beweging. Wanneer u deze instelling gebruikt, moet u compensatie van overlapping van wanden inschakelen en de buitenwand printen voordat u de binnenwanden print." +msgstr "Minimaal toegestane doorvoerpercentage voor een wandlijn. Compensatie van de overlapping van wanden zorgt voor een kleinere doorvoer tijdens het printen van een wand als deze dicht bij een bestaande wand ligt. Wanden waarbij de doorvoerwaarde lager is dan deze waarde, worden vervangen door een beweging. Wanneer u deze instelling gebruikt, moet u compensatie van overlapping van wanden inschakelen en de buitenwand printen voordat u de binnenwanden print." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" From 046fca5d0faa8af26bf886fb1a765be20a37d22d Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 27 Sep 2018 19:31:45 +0200 Subject: [PATCH 108/212] Align the "Enable Gradual" text with the corresponding checkbox. --- resources/qml/SidebarSimple.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index e962d7fc8f..ec673f2823 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -784,8 +784,10 @@ Item Label { id: gradualInfillLabel + height: parent.height anchors.left: enableGradualInfillCheckBox.right anchors.leftMargin: Math.round(UM.Theme.getSize("sidebar_margin").width / 2) + verticalAlignment: Text.AlignVCenter; text: catalog.i18nc("@label", "Enable gradual") font: UM.Theme.getFont("default") color: UM.Theme.getColor("text") From a320720f8613e9bbbc7fab4bf1c3e49d7a2074c9 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 1 Oct 2018 10:57:33 +0200 Subject: [PATCH 109/212] Remove duplicate shortcut in French, so the CI won't fail on it. Contributes to CURA-5741. --- resources/i18n/fr_FR/cura.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index b4e68e16bc..ae6de50d16 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -3735,7 +3735,7 @@ msgstr "Position de la &caméra" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:54 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "&Plateau" +msgstr "Plateau" #: /home/ruben/Projects/Cura/resources/qml/Menus/SettingVisibilityPresetsMenu.qml:13 msgctxt "@action:inmenu" From 91e6897bc737a8e5fd95a631d9a4d7f746f575e7 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 1 Oct 2018 11:13:10 +0200 Subject: [PATCH 110/212] Fix conficts in French with a couple of keyboard shortcuts. Contributes to CURA-5741. --- resources/i18n/fr_FR/cura.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index ae6de50d16..eb7aa05b2b 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -3735,7 +3735,7 @@ msgstr "Position de la &caméra" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:54 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "Plateau" +msgstr "&Plateau" #: /home/ruben/Projects/Cura/resources/qml/Menus/SettingVisibilityPresetsMenu.qml:13 msgctxt "@action:inmenu" @@ -4150,7 +4150,7 @@ msgstr "&Fichier" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "&Enregistrer..." +msgstr "Enregi&strer..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" @@ -4207,7 +4207,7 @@ msgstr "Désactiver l'extrudeuse" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 msgctxt "@title:menu" msgid "&Build plate" -msgstr "&Plateau" +msgstr "Plateau" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:236 msgctxt "@title:settings" From f69005fef989a9c9af7834ce931fa343d2989cd6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 1 Oct 2018 11:24:31 +0200 Subject: [PATCH 111/212] Rename to CuraFormulaFunctions to avoid confusion with "SettingFunction" in Uranium. --- cura/CuraApplication.py | 18 +++++++++--------- ...ingFunctions.py => CuraFormulaFunctions.py} | 6 +++--- cura/Settings/ExtruderManager.py | 2 +- cura/Settings/UserChangesModel.py | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) rename cura/Settings/{CustomSettingFunctions.py => CuraFormulaFunctions.py} (95%) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 857aafb567..b40b65358b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -107,7 +107,7 @@ from cura.Settings.MaterialSettingsVisibilityHandler import MaterialSettingsVisi from cura.Settings.ContainerManager import ContainerManager from cura.Settings.SidebarCustomMenuItemsModel import SidebarCustomMenuItemsModel import cura.Settings.cura_empty_instance_containers -from cura.Settings.CustomSettingFunctions import CustomSettingFunctions +from cura.Settings.CuraFormulaFunctions import CuraFormulaFunctions from cura.ObjectsModel import ObjectsModel @@ -175,7 +175,7 @@ class CuraApplication(QtApplication): self._single_instance = None - self._custom_setting_functions = None + self._cura_formula_functions = None self._cura_package_manager = None @@ -320,7 +320,7 @@ class CuraApplication(QtApplication): # Adds custom property types, settings types, and extra operators (functions) that need to be registered in # SettingDefinition and SettingFunction. def __initializeSettingDefinitionsAndFunctions(self): - self._custom_setting_functions = CustomSettingFunctions(self) + self._cura_formula_functions = CuraFormulaFunctions(self) # Need to do this before ContainerRegistry tries to load the machines SettingDefinition.addSupportedProperty("settable_per_mesh", DefinitionPropertyType.Any, default = True, read_only = True) @@ -342,10 +342,10 @@ class CuraApplication(QtApplication): SettingDefinition.addSettingType("optional_extruder", None, str, None) SettingDefinition.addSettingType("[int]", None, str, None) - SettingFunction.registerOperator("extruderValue", self._custom_setting_functions.getValueInExtruder) - SettingFunction.registerOperator("extruderValues", self._custom_setting_functions.getValuesInAllExtruders) - SettingFunction.registerOperator("resolveOrValue", self._custom_setting_functions.getResolveOrValue) - SettingFunction.registerOperator("defaultExtruderPosition", self._custom_setting_functions.getDefaultExtruderPosition) + SettingFunction.registerOperator("extruderValue", self._cura_formula_functions.getValueInExtruder) + SettingFunction.registerOperator("extruderValues", self._cura_formula_functions.getValuesInAllExtruders) + SettingFunction.registerOperator("resolveOrValue", self._cura_formula_functions.getResolveOrValue) + SettingFunction.registerOperator("defaultExtruderPosition", self._cura_formula_functions.getDefaultExtruderPosition) # Adds all resources and container related resources. def __addAllResourcesAndContainerResources(self) -> None: @@ -809,8 +809,8 @@ class CuraApplication(QtApplication): def getSettingVisibilityPresetsModel(self, *args) -> SettingVisibilityPresetsModel: return self._setting_visibility_presets_model - def getCustomSettingFunctions(self, *args) -> CustomSettingFunctions: - return self._custom_setting_functions + def getCuraFormulaFunctions(self, *args) -> "CuraFormulaFunctions": + return self._cura_formula_functions def getMachineErrorChecker(self, *args) -> MachineErrorChecker: return self._machine_error_checker diff --git a/cura/Settings/CustomSettingFunctions.py b/cura/Settings/CuraFormulaFunctions.py similarity index 95% rename from cura/Settings/CustomSettingFunctions.py rename to cura/Settings/CuraFormulaFunctions.py index 5951ac1e73..1db01857f8 100644 --- a/cura/Settings/CustomSettingFunctions.py +++ b/cura/Settings/CuraFormulaFunctions.py @@ -12,10 +12,10 @@ if TYPE_CHECKING: # -# This class contains all Cura-related custom setting functions. Some functions requires information such as the -# currently active machine, so this is made into a class instead of standalone functions. +# This class contains all Cura-related custom functions that can be used in formulas. Some functions requires +# information such as the currently active machine, so this is made into a class instead of standalone functions. # -class CustomSettingFunctions: +class CuraFormulaFunctions: def __init__(self, application: "CuraApplication") -> None: self._application = application diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 86ee546240..ee5cf93fab 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -373,7 +373,7 @@ class ExtruderManager(QObject): # \return String representing the extruder values @pyqtSlot(str, result="QVariant") def getInstanceExtruderValues(self, key: str) -> List: - return self._application.getCustomSettingFunctions().getValuesInAllExtruders(key) + return self._application.getCuraFormulaFunctions().getValuesInAllExtruders(key) ## Get the resolve value or value for a given key # diff --git a/cura/Settings/UserChangesModel.py b/cura/Settings/UserChangesModel.py index d2ea84f79d..9a26e5607e 100644 --- a/cura/Settings/UserChangesModel.py +++ b/cura/Settings/UserChangesModel.py @@ -42,7 +42,7 @@ class UserChangesModel(ListModel): def _update(self): application = Application.getInstance() machine_manager = application.getMachineManager() - custom_setting_functions = application.getCustomSettingFunctions() + cura_formula_functions = application.getCuraFormulaFunctions() item_dict = OrderedDict() item_list = [] @@ -77,7 +77,7 @@ class UserChangesModel(ListModel): # Override "getExtruderValue" with "getDefaultExtruderValue" so we can get the default values user_changes = containers.pop(0) - default_value_resolve_context = custom_setting_functions.createContextForDefaultValueEvaluation(stack) + default_value_resolve_context = cura_formula_functions.createContextForDefaultValueEvaluation(stack) for setting_key in user_changes.getAllKeys(): original_value = None From c2e69dc7b25c7b15ff93c8358f1e2d1d9cac9967 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 1 Oct 2018 11:28:37 +0200 Subject: [PATCH 112/212] Fix Korean translations. Contributes to CURA-5741. --- resources/i18n/ko_KR/cura.po | 82 ++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 23 deletions(-) diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index 18a54715c1..a97c5cf05b 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -64,7 +64,11 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "

하나 이상의 3D 모델이 모델 크기 및 재료 구성으로 인해 최적의 상태로 인쇄되지 않을 수 있습니다.

\n

{model_names}

\n

인쇄 품질 및 안정성을 최고로 높이는 방법을 알아보십시오.

\n

인쇄 품질 가이드 보기

" +msgstr "" +"

하나 이상의 3D 모델이 모델 크기 및 재료 구성으로 인해 최적의 상태로 인쇄되지 않을 수 있습니다.

\n" +"

{model_names}

\n" +"

인쇄 품질 및 안정성을 최고로 높이는 방법을 알아보십시오.

\n" +"

인쇄 품질 가이드 보기

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -746,7 +750,7 @@ msgstr "Cura 프로젝트 3MF 파일" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "3MF 파일 작성 중 오류" +msgstr "3MF 파일 작성 중 오류." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1074,7 +1078,12 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "

죄송합니다, Ultimaker Cura가 정상적이지 않습니다. \n                    

시작할 때 복구 할 수없는 오류가 발생했습니다. 이 오류는 잘못된 구성 파일로 인해 발생할 수 있습니다. 설정을 백업하고 재설정하는 것이 좋습니다. \n                    

백업은 설정 폴더에서 찾을 수 있습니다. \n                    

문제를 해결하기 위해이 오류 보고서를 보내주십시오. \n " +msgstr "" +"

죄송합니다, Ultimaker Cura가 정상적이지 않습니다. \n" +"                    

시작할 때 복구 할 수없는 오류가 발생했습니다. 이 오류는 잘못된 구성 파일로 인해 발생할 수 있습니다. 설정을 백업하고 재설정하는 것이 좋습니다. \n" +"                    

백업은 설정 폴더에서 찾을 수 있습니다. \n" +"                    

문제를 해결하기 위해이 오류 보고서를 보내주십시오. \n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1107,7 +1116,10 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "

치명적인 오류가 발생했습니다. 문제를 해결할 수 있도록 이 충돌 보고서를 보내주십시오

\n

\"보고서 전송\" 버튼을 사용하면 버그 보고서가 서버에 자동으로 전달됩니다

\n " +msgstr "" +"

치명적인 오류가 발생했습니다. 문제를 해결할 수 있도록 이 충돌 보고서를 보내주십시오

\n" +"

\"보고서 전송\" 버튼을 사용하면 버그 보고서가 서버에 자동으로 전달됩니다

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1572,7 +1584,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "이 플러그인에는 라이선스가 포함되어 있습니다.\n이 플러그인을 설치하려면 이 라이선스를 수락해야 합니다.\n아래의 약관에 동의하시겠습니까?" +msgstr "" +"이 플러그인에는 라이선스가 포함되어 있습니다.\n" +"이 플러그인을 설치하려면 이 라이선스를 수락해야 합니다.\n" +"아래의 약관에 동의하시겠습니까?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1692,7 +1707,10 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "네트워크를 통해 프린터로 직접 프린팅하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n\n아래 목록에서 프린터를 선택하십시오:" +msgstr "" +"네트워크를 통해 프린터로 직접 프린팅하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n" +"\n" +"아래 목록에서 프린터를 선택하십시오:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -2646,7 +2664,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "일부 프로파일 설정을 수정했습니다.\n이러한 설정을 유지하거나 삭제 하시겠습니까?" +msgstr "" +"일부 프로파일 설정을 수정했습니다.\n" +"이러한 설정을 유지하거나 삭제 하시겠습니까?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3342,7 +3362,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura는 커뮤니티와 공동으로 Ultimaker B.V.에 의해 개발되었습니다.\nCura는 다음의 오픈 소스 프로젝트를 사용합니다:" +msgstr "" +"Cura는 커뮤니티와 공동으로 Ultimaker B.V.에 의해 개발되었습니다.\n" +"Cura는 다음의 오픈 소스 프로젝트를 사용합니다:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3455,7 +3477,10 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "일부 설정/대체 값은 프로파일에 저장된 값과 다릅니다.\n\n프로파일 매니저를 열려면 클릭하십시오." +msgstr "" +"일부 설정/대체 값은 프로파일에 저장된 값과 다릅니다.\n" +"\n" +"프로파일 매니저를 열려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3509,7 +3534,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "일부 숨겨진 설정은 일반적인 계산 값과 다른 값을 사용합니다.\n\n이 설정을 표시하려면 클릭하십시오." +msgstr "" +"일부 숨겨진 설정은 일반적인 계산 값과 다른 값을 사용합니다.\n" +"\n" +"이 설정을 표시하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3537,7 +3565,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "이 설정에는 프로파일과 다른 값이 있습니다.\n\n프로파일 값을 복원하려면 클릭하십시오." +msgstr "" +"이 설정에는 프로파일과 다른 값이 있습니다.\n" +"\n" +"프로파일 값을 복원하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3545,7 +3576,10 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "이 설정은 일반적으로 계산되지만 현재는 절대 값이 설정되어 있습니다.\n\n계산 된 값을 복원하려면 클릭하십시오." +msgstr "" +"이 설정은 일반적으로 계산되지만 현재는 절대 값이 설정되어 있습니다.\n" +"\n" +"계산 된 값을 복원하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3768,7 +3802,9 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "프린팅 설정 사용 안 함\nG-코드 파일은 수정할 수 없습니다" +msgstr "" +"프린팅 설정 사용 안 함\n" +"G-코드 파일은 수정할 수 없습니다" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" @@ -4122,27 +4158,27 @@ msgstr "내보내기 선택..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" -msgstr "편집" +msgstr "편집(&E)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:185 msgctxt "@title:menu" msgid "&View" -msgstr "보기" +msgstr "보기(&V)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:190 msgctxt "@title:menu" msgid "&Settings" -msgstr "설정" +msgstr "설정(&S)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 msgctxt "@title:menu menubar:settings" msgid "&Printer" -msgstr "프린터" +msgstr "프린터(&P)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@title:menu" msgid "&Material" -msgstr "재료" +msgstr "재료(&M)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:210 msgctxt "@action:inmenu" @@ -4169,27 +4205,27 @@ msgstr "빌드 플레이트(&B)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:236 msgctxt "@title:settings" msgid "&Profile" -msgstr "프로파일" +msgstr "프로파일(&P)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:246 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" -msgstr "확장 프로그램" +msgstr "확장 프로그램(&X)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:280 msgctxt "@title:menu menubar:toplevel" msgid "&Toolbox" -msgstr "도구 상자" +msgstr "도구 상자(&T)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:287 msgctxt "@title:menu menubar:toplevel" msgid "P&references" -msgstr "환경설정" +msgstr "환경설정(&R)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:295 msgctxt "@title:menu menubar:toplevel" msgid "&Help" -msgstr "도움말" +msgstr "도움말(&H)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:341 msgctxt "@label" From 3f8b7fb6aff9b0e3afa1fe0598becf639c2e604a Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 1 Oct 2018 11:30:21 +0200 Subject: [PATCH 113/212] Fix: Switches to 'Prepare' always go through 'Recomended' mode CURA-5731 --- resources/qml/PrepareSidebar.qml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/resources/qml/PrepareSidebar.qml b/resources/qml/PrepareSidebar.qml index 78b6a22ef9..fe0fb033f7 100644 --- a/resources/qml/PrepareSidebar.qml +++ b/resources/qml/PrepareSidebar.qml @@ -14,7 +14,7 @@ Rectangle { id: base - property int currentModeIndex + property int currentModeIndex: -1 property bool hideSettings: PrintInformation.preSliced property bool hideView: Cura.MachineManager.activeMachineName == "" @@ -262,7 +262,6 @@ Rectangle ListView { id: modesList - property var index: 0 model: modesListModel delegate: wizardDelegate anchors.top: parent.top @@ -582,13 +581,17 @@ Rectangle tooltipText: catalog.i18nc("@tooltip", "Custom Print Setup

Print with finegrained control over every last bit of the slicing process."), item: sidebarAdvanced }) - sidebarContents.replace(modesListModel.get(base.currentModeIndex).item, { "immediate": true }) var index = Math.round(UM.Preferences.getValue("cura/active_mode")) - if(index) + + if(index != null && !isNaN(index)) { currentModeIndex = index; } + else + { + currentModeIndex = 0; + } } UM.SettingPropertyProvider From f785f888aec62003c3769555ffb4f158b70f20b7 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 1 Oct 2018 11:55:27 +0200 Subject: [PATCH 114/212] Translate the per-model-setting options in Spanish to better explain what each item does. Contributes to CURA-5741. --- resources/i18n/es_ES/cura.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index b53d44d325..1c4d985f97 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -2177,22 +2177,22 @@ msgstr "Modelo normal" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:75 msgctxt "@label" msgid "Print as support" -msgstr "Imprimir según compatibilidad" +msgstr "Imprimir como soporte" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:83 msgctxt "@label" msgid "Don't support overlap with other models" -msgstr "No es compatible la superposición con otros modelos" +msgstr "No crear soporte en otros modelos (por superposición)" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:91 msgctxt "@label" msgid "Modify settings for overlap with other models" -msgstr "Modificar ajustes para superponer con otros modelos" +msgstr "Modificar ajustes de otros modelos (por superposición)" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:99 msgctxt "@label" msgid "Modify settings for infill of other models" -msgstr "Modificar ajustes para rellenar con otros modelos" +msgstr "Modificar ajustes del relleno de otros modelos" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:341 msgctxt "@action:button" From d5ea92059a7bca1c69017289282da7a03633a7fd Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 1 Oct 2018 13:03:00 +0200 Subject: [PATCH 115/212] Fix Dutch translations. Contributes to CURA-5741. --- resources/i18n/nl_NL/cura.po | 70 +++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 17 deletions(-) diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index ac498a9236..c26da0d505 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-10-01 11:30+0100\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" "Language: nl_NL\n" @@ -62,7 +62,11 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "

Een of meer 3D-modellen worden mogelijk niet optimaal geprint vanwege het modelformaat en de materiaalconfiguratie:

\n

{model_names}

\n

Ontdek hoe u de best mogelijke printkwaliteit en betrouwbaarheid verkrijgt.

\n

Handleiding printkwaliteit bekijken

" +msgstr "" +"

Een of meer 3D-modellen worden mogelijk niet optimaal geprint vanwege het modelformaat en de materiaalconfiguratie:

\n" +"

{model_names}

\n" +"

Ontdek hoe u de best mogelijke printkwaliteit en betrouwbaarheid verkrijgt.

\n" +"

Handleiding printkwaliteit bekijken

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -144,7 +148,7 @@ msgstr "Voorbereiden" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" -msgstr "Op te slaan op verwisselbaar station" +msgstr "Opslaan op verwisselbaar station" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 #, python-brace-format @@ -1072,7 +1076,12 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "

Oeps, Ultimaker Cura heeft een probleem gedetecteerd.

\n

Tijdens het opstarten is een onherstelbare fout opgetreden. Deze fout is mogelijk veroorzaakt door enkele onjuiste configuratiebestanden. Het wordt aanbevolen een back-up te maken en de standaardinstelling van uw configuratie te herstellen.

\n

Back-ups bevinden zich in de configuratiemap.

\n

Stuur ons dit crashrapport om het probleem op te lossen.

\n " +msgstr "" +"

Oeps, Ultimaker Cura heeft een probleem gedetecteerd.

\n" +"

Tijdens het opstarten is een onherstelbare fout opgetreden. Deze fout is mogelijk veroorzaakt door enkele onjuiste configuratiebestanden. Het wordt aanbevolen een back-up te maken en de standaardinstelling van uw configuratie te herstellen.

\n" +"

Back-ups bevinden zich in de configuratiemap.

\n" +"

Stuur ons dit crashrapport om het probleem op te lossen.

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1105,7 +1114,10 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "

Er is een fatale fout opgetreden in Cura. Stuur ons het crashrapport om het probleem op te lossen

\n

Druk op de knop \"Rapport verzenden\" om het foutenrapport automatisch naar onze servers te verzenden

\n " +msgstr "" +"

Er is een fatale fout opgetreden in Cura. Stuur ons het crashrapport om het probleem op te lossen

\n" +"

Druk op de knop \"Rapport verzenden\" om het foutenrapport automatisch naar onze servers te verzenden

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1570,7 +1582,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Deze invoegtoepassing bevat een licentie.\nU moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\nGaat u akkoord met de onderstaande voorwaarden?" +msgstr "" +"Deze invoegtoepassing bevat een licentie.\n" +"U moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\n" +"Gaat u akkoord met de onderstaande voorwaarden?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1690,7 +1705,10 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n\nSelecteer uw printer in de onderstaande lijst:" +msgstr "" +"Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n" +"\n" +"Selecteer uw printer in de onderstaande lijst:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -2352,7 +2370,7 @@ msgstr "Volgende" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "Punt" +msgstr "Tip" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2401,7 +2419,7 @@ msgstr "%1 m / ~ %2 g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "Proefprint" +msgstr "Print experiment" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" @@ -2646,7 +2664,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "U hebt enkele profielinstellingen aangepast.\nWilt u deze instellingen behouden of verwijderen?" +msgstr "" +"U hebt enkele profielinstellingen aangepast.\n" +"Wilt u deze instellingen behouden of verwijderen?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2667,7 +2687,7 @@ msgstr "Aangepast" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:639 msgctxt "@option:discardOrKeep" msgid "Always ask me this" -msgstr "Dit altijd vragen" +msgstr "Altijd vragen" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 msgctxt "@option:discardOrKeep" @@ -3342,7 +3362,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\nCura maakt met trots gebruik van de volgende opensourceprojecten:" +msgstr "" +"Cura is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\n" +"Cura maakt met trots gebruik van de volgende opensourceprojecten:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3455,7 +3477,10 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n\nKlik om het profielbeheer te openen." +msgstr "" +"Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n" +"\n" +"Klik om het profielbeheer te openen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3509,7 +3534,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n\nKlik om deze instellingen zichtbaar te maken." +msgstr "" +"Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n" +"\n" +"Klik om deze instellingen zichtbaar te maken." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3537,7 +3565,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Deze instelling heeft een andere waarde dan in het profiel.\n\nKlik om de waarde van het profiel te herstellen." +msgstr "" +"Deze instelling heeft een andere waarde dan in het profiel.\n" +"\n" +"Klik om de waarde van het profiel te herstellen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3545,7 +3576,10 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n\nKlik om de berekende waarde te herstellen." +msgstr "" +"Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n" +"\n" +"Klik om de berekende waarde te herstellen." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3770,7 +3804,9 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Instelling voor printen uitgeschakeld\nG-code-bestanden kunnen niet worden aangepast" +msgstr "" +"Instelling voor printen uitgeschakeld\n" +"G-code-bestanden kunnen niet worden aangepast" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" From 638c6facc797b69511fd8f18f13e3b84790383f0 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 1 Oct 2018 13:23:43 +0200 Subject: [PATCH 116/212] Review portuguese translations. Contributes to CURA-5741. --- resources/i18n/pt_PT/cura.po | 64 ++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po index 90bde6f361..5c5abfe44f 100644 --- a/resources/i18n/pt_PT/cura.po +++ b/resources/i18n/pt_PT/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-10-01 13:15+0100\n" "Last-Translator: Paulo Miranda \n" "Language-Team: Paulo Miranda , Portuguese \n" "Language: pt_PT\n" @@ -65,7 +65,11 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "

Um, ou mais, dos modelos 3D podem ter menos qualidade de impressão devido à dimensão do modelo 3D e definição de material:

\n

{model_names}

\n

Descubra como assegurar a melhor qualidade e fiabilidade possível da impressão.

\n

Ver o guia de qualidade da impressão

" +msgstr "" +"

Um, ou mais, dos modelos 3D podem ter menos qualidade de impressão devido à dimensão do modelo 3D e definição de material:

\n" +"

{model_names}

\n" +"

Descubra como assegurar a melhor qualidade e fiabilidade possível da impressão.

\n" +"

Ver o guia de qualidade da impressão

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -1101,7 +1105,12 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "

Ups, o Ultimaker Cura encontrou um possível problema.

\n

Foi encontrado um erro irrecuperável durante o arranque da aplicação. Este pode ter sido causado por alguns ficheiros de configuração incorrectos. Sugerimos que faça um backup e reponha a sua configuração.

\n

Os backups estão localizados na pasta de configuração.

\n

Por favor envie-nos este Relatório de Falhas para podermos resolver o problema.

\n " +msgstr "" +"

Ups, o Ultimaker Cura encontrou um possível problema.

\n" +"

Foi encontrado um erro irrecuperável durante o arranque da aplicação. Este pode ter sido causado por alguns ficheiros de configuração incorrectos. Sugerimos que faça um backup e reponha a sua configuração.

\n" +"

Os backups estão localizados na pasta de configuração.

\n" +"

Por favor envie-nos este Relatório de Falhas para podermos resolver o problema.

\n" +" " # rever! # button size? @@ -1136,7 +1145,10 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "

Ocorreu um erro fatal no Cura. Por favor envie-nos este Relatório de Falhas para podermos resolver o problema

\n

Por favor utilize o botão \"Enviar relatório\" para publicar um relatório de erros automaticamente nos nossos servidores

\n " +msgstr "" +"

Ocorreu um erro fatal no Cura. Por favor envie-nos este Relatório de Falhas para podermos resolver o problema

\n" +"

Por favor utilize o botão \"Enviar relatório\" para publicar um relatório de erros automaticamente nos nossos servidores

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1603,7 +1615,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Este plug-in contém uma licença.\nÉ necessário aceitar esta licença para instalar o plug-in.\nConcorda com os termos abaixo?" +msgstr "" +"Este plug-in contém uma licença.\n" +"É necessário aceitar esta licença para instalar o plug-in.\n" +"Concorda com os termos abaixo?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1723,7 +1738,10 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Para imprimir diretamente para a sua impressora através da rede, certifique-se de que a sua impressora está ligada à rede por meio de um cabo de rede ou através de ligação à rede Wi-Fi. Se não ligar o Cura por rede à impressora, poderá ainda assim utilizar uma unidade USB para transferir ficheiros g-code para a impressora.\n\nSelecione a sua impressora na lista em baixo:" +msgstr "" +"Para imprimir diretamente para a sua impressora através da rede, certifique-se de que a sua impressora está ligada à rede por meio de um cabo de rede ou através de ligação à rede Wi-Fi. Se não ligar o Cura por rede à impressora, poderá ainda assim utilizar uma unidade USB para transferir ficheiros g-code para a impressora.\n" +"\n" +"Selecione a sua impressora na lista em baixo:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -2445,7 +2463,7 @@ msgstr "%1 m / ~ %2 g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "Imprimir teste" +msgstr "Experimento de impressão" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" @@ -2698,7 +2716,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Alterou algumas das definições do perfil.\nGostaria de manter ou descartar essas alterações?" +msgstr "" +"Alterou algumas das definições do perfil.\n" +"Gostaria de manter ou descartar essas alterações?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3398,7 +3418,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "O Cura foi desenvolvido pela Ultimaker B.V. em colaboração com a comunidade.\nO Cura tem o prazer de utilizar os seguintes projetos open source:" +msgstr "" +"O Cura foi desenvolvido pela Ultimaker B.V. em colaboração com a comunidade.\n" +"O Cura tem o prazer de utilizar os seguintes projetos open source:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3514,7 +3536,10 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Alguns valores de definição/substituição são diferentes dos valores armazenados no perfil.\n\nClique para abrir o gestor de perfis." +msgstr "" +"Alguns valores de definição/substituição são diferentes dos valores armazenados no perfil.\n" +"\n" +"Clique para abrir o gestor de perfis." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3572,7 +3597,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Algumas das definições invisíveis têm valores diferentes dos valores normais calculados automaticamente.\n\nClique para tornar estas definições visíveis." +msgstr "" +"Algumas das definições invisíveis têm valores diferentes dos valores normais calculados automaticamente.\n" +"\n" +"Clique para tornar estas definições visíveis." # rever! # Afeta? @@ -3609,7 +3637,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Esta definição tem um valor que é diferente do perfil.\n\nClique para restaurar o valor do perfil." +msgstr "" +"Esta definição tem um valor que é diferente do perfil.\n" +"\n" +"Clique para restaurar o valor do perfil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3617,7 +3648,10 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Normalmente, o valor desta definição é calculado, mas atualmente tem definido um valor diferente.\n\nClique para restaurar o valor calculado." +msgstr "" +"Normalmente, o valor desta definição é calculado, mas atualmente tem definido um valor diferente.\n" +"\n" +"Clique para restaurar o valor calculado." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3850,7 +3884,9 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Configuração da Impressão desativada\nOs ficheiros G-code não podem ser modificados" +msgstr "" +"Configuração da Impressão desativada\n" +"Os ficheiros G-code não podem ser modificados" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" From c474ceff8f13a5d96d52467fb4758617fbb90a7d Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 1 Oct 2018 13:37:26 +0200 Subject: [PATCH 117/212] Review Russian translations. Contributes to CURA-5741. --- resources/i18n/ru_RU/cura.po | 62 ++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/resources/i18n/ru_RU/cura.po b/resources/i18n/ru_RU/cura.po index a01fbf0781..c343202511 100644 --- a/resources/i18n/ru_RU/cura.po +++ b/resources/i18n/ru_RU/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-10-01 13:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Ruslan Popov , Russian \n" "Language: ru_RU\n" @@ -64,7 +64,11 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "

Одна или несколько 3D-моделей могут не напечататься оптимальным образом из-за размера модели и конфигурации материала:

\n

{model_names}

\n

Узнайте, как обеспечить максимально возможное качество и высокую надежность печати.

\n

Ознакомиться с руководством по качеству печати

" +msgstr "" +"

Одна или несколько 3D-моделей могут не напечататься оптимальным образом из-за размера модели и конфигурации материала:

\n" +"

{model_names}

\n" +"

Узнайте, как обеспечить максимально возможное качество и высокую надежность печати.

\n" +"

Ознакомиться с руководством по качеству печати

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -1074,7 +1078,12 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "

В ПО Ultimaker Cura обнаружена ошибка.

\n

Во время запуска обнаружена неустранимая ошибка. Возможно, она вызвана некоторыми файлами конфигурации с неправильными данными. Рекомендуется создать резервную копию конфигурации и сбросить ее.

\n

Резервные копии хранятся в папке конфигурации.

\n

Отправьте нам этот отчет о сбое для устранения проблемы.

\n " +msgstr "" +"

В ПО Ultimaker Cura обнаружена ошибка.

\n" +"

Во время запуска обнаружена неустранимая ошибка. Возможно, она вызвана некоторыми файлами конфигурации с неправильными данными. Рекомендуется создать резервную копию конфигурации и сбросить ее.

\n" +"

Резервные копии хранятся в папке конфигурации.

\n" +"

Отправьте нам этот отчет о сбое для устранения проблемы.

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1107,7 +1116,10 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "

В Cura возникла критическая ошибка. Отправьте нам этот отчет о сбое для устранения проблемы

\n

Нажмите кнопку «Отправить отчет», чтобы автоматически опубликовать отчет об ошибке на наших серверах

\n " +msgstr "" +"

В Cura возникла критическая ошибка. Отправьте нам этот отчет о сбое для устранения проблемы

\n" +"

Нажмите кнопку «Отправить отчет», чтобы автоматически опубликовать отчет об ошибке на наших серверах

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1572,7 +1584,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Этот плагин содержит лицензию.\nЧтобы установить этот плагин, необходимо принять условия лицензии.\nПринять приведенные ниже условия?" +msgstr "" +"Этот плагин содержит лицензию.\n" +"Чтобы установить этот плагин, необходимо принять условия лицензии.\n" +"Принять приведенные ниже условия?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1692,7 +1707,10 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Для печати на вашем принтере через сеть, пожалуйста, удостоверьтесь, что ваш принтер подключен к сети с помощью кабеля или через WiFi. Если вы не подключили Cura к вашему принтеру, вы по-прежнему можете использовать USB флешку для переноса G-Code файлов на ваш принтер.\n\nУкажите ваш принтер в списке ниже:" +msgstr "" +"Для печати на вашем принтере через сеть, пожалуйста, удостоверьтесь, что ваш принтер подключен к сети с помощью кабеля или через WiFi. Если вы не подключили Cura к вашему принтеру, вы по-прежнему можете использовать USB флешку для переноса G-Code файлов на ваш принтер.\n" +"\n" +"Укажите ваш принтер в списке ниже:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -2650,7 +2668,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Вы изменили некоторые параметры профиля.\nЖелаете сохранить их или вернуть к прежним значениям?" +msgstr "" +"Вы изменили некоторые параметры профиля.\n" +"Желаете сохранить их или вернуть к прежним значениям?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3346,7 +3366,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura разработана компанией Ultimaker B.V. совместно с сообществом.\nCura использует следующие проекты с открытым исходным кодом:" +msgstr "" +"Cura разработана компанией Ultimaker B.V. совместно с сообществом.\n" +"Cura использует следующие проекты с открытым исходным кодом:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3459,7 +3481,10 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Значения некоторых параметров отличаются от значений профиля.\n\nНажмите для открытия менеджера профилей." +msgstr "" +"Значения некоторых параметров отличаются от значений профиля.\n" +"\n" +"Нажмите для открытия менеджера профилей." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3513,7 +3538,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Некоторые из скрытых параметров используют значения, отличающиеся от их вычисленных значений.\n\nЩёлкните, чтобы сделать эти параметры видимыми." +msgstr "" +"Некоторые из скрытых параметров используют значения, отличающиеся от их вычисленных значений.\n" +"\n" +"Щёлкните, чтобы сделать эти параметры видимыми." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3541,7 +3569,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Значение этого параметра отличается от значения в профиле.\n\nЩёлкните для восстановления значения из профиля." +msgstr "" +"Значение этого параметра отличается от значения в профиле.\n" +"\n" +"Щёлкните для восстановления значения из профиля." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3549,7 +3580,10 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Обычно это значение вычисляется, но в настоящий момент было установлено явно.\n\nЩёлкните для восстановления вычисленного значения." +msgstr "" +"Обычно это значение вычисляется, но в настоящий момент было установлено явно.\n" +"\n" +"Щёлкните для восстановления вычисленного значения." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3776,7 +3810,9 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Настройка принтера отключена\nG-code файлы нельзя изменять" +msgstr "" +"Настройка принтера отключена\n" +"G-code файлы нельзя изменять" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" From 00f1f69e4db6971952629aa20ee1972de18293f3 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 1 Oct 2018 13:45:55 +0200 Subject: [PATCH 118/212] Review Turkish translations. Contributes to CURA-5741. --- resources/i18n/tr_TR/cura.po | 62 ++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/resources/i18n/tr_TR/cura.po b/resources/i18n/tr_TR/cura.po index 22a1947c76..30368056cf 100644 --- a/resources/i18n/tr_TR/cura.po +++ b/resources/i18n/tr_TR/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-10-01 13:40+0100\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" "Language: tr_TR\n" @@ -62,7 +62,11 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "

Model boyutu ve model yapılandırması nedeniyle bir veya daha fazla 3D model optimum yazdırılamayabilir:

\n

{model_names}

\n

En iyi kalite ve güvenilirliği nasıl elde edeceğinizi öğrenin.

\n

Yazdırma kalitesi kılavuzunu görüntüleyin

" +msgstr "" +"

Model boyutu ve model yapılandırması nedeniyle bir veya daha fazla 3D model optimum yazdırılamayabilir:

\n" +"

{model_names}

\n" +"

En iyi kalite ve güvenilirliği nasıl elde edeceğinizi öğrenin.

\n" +"

Yazdırma kalitesi kılavuzunu görüntüleyin

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -1072,7 +1076,12 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "

Ultimaker Cura doğru görünmeyen bir şeyle karşılaştı.

\n

Başlatma esnasında kurtarılamaz bir hata ile karşılaştık. Muhtemelen bazı hatalı yapılandırma dosyalarından kaynaklanıyordu. Yapılandırmanızı yedekleyip sıfırlamanızı öneriyoruz.

\n

Yedekler yapılandırma klasöründe bulunabilir.

\n

Sorunu düzeltmek için lütfen bu Çökme Raporunu bize gönderin.

\n " +msgstr "" +"

Ultimaker Cura doğru görünmeyen bir şeyle karşılaştı.

\n" +"

Başlatma esnasında kurtarılamaz bir hata ile karşılaştık. Muhtemelen bazı hatalı yapılandırma dosyalarından kaynaklanıyordu. Yapılandırmanızı yedekleyip sıfırlamanızı öneriyoruz.

\n" +"

Yedekler yapılandırma klasöründe bulunabilir.

\n" +"

Sorunu düzeltmek için lütfen bu Çökme Raporunu bize gönderin.

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1105,7 +1114,10 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "

Cura’da onarılamaz bir hata oluştu. Lütfen sorunu çözmek için bize Çökme Raporunu gönderin

\n

Sunucularımıza otomatik olarak bir hata raporu yüklemek için lütfen \"Rapor gönder\" düğmesini kullanın

\n " +msgstr "" +"

Cura’da onarılamaz bir hata oluştu. Lütfen sorunu çözmek için bize Çökme Raporunu gönderin

\n" +"

Sunucularımıza otomatik olarak bir hata raporu yüklemek için lütfen \"Rapor gönder\" düğmesini kullanın

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1570,7 +1582,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Bu eklenti bir lisans içerir.\nBu eklentiyi yüklemek için bu lisansı kabul etmeniz gerekir.\nAşağıdaki koşulları kabul ediyor musunuz?" +msgstr "" +"Bu eklenti bir lisans içerir.\n" +"Bu eklentiyi yüklemek için bu lisansı kabul etmeniz gerekir.\n" +"Aşağıdaki koşulları kabul ediyor musunuz?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1690,7 +1705,10 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n\nAşağıdaki listeden yazıcınızı seçin:" +msgstr "" +"Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n" +"\n" +"Aşağıdaki listeden yazıcınızı seçin:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -2646,7 +2664,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Bazı profil ayarlarını özelleştirdiniz.\nBu ayarları kaydetmek veya iptal etmek ister misiniz?" +msgstr "" +"Bazı profil ayarlarını özelleştirdiniz.\n" +"Bu ayarları kaydetmek veya iptal etmek ister misiniz?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3342,7 +3362,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura, topluluk iş birliği ile Ultimaker B.V. tarafından geliştirilmiştir.\nCura aşağıdaki açık kaynak projelerini gururla kullanmaktadır:" +msgstr "" +"Cura, topluluk iş birliği ile Ultimaker B.V. tarafından geliştirilmiştir.\n" +"Cura aşağıdaki açık kaynak projelerini gururla kullanmaktadır:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3455,7 +3477,10 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Bazı ayar/geçersiz kılma değerleri profilinizde saklanan değerlerden farklıdır.\n\nProfil yöneticisini açmak için tıklayın." +msgstr "" +"Bazı ayar/geçersiz kılma değerleri profilinizde saklanan değerlerden farklıdır.\n" +"\n" +"Profil yöneticisini açmak için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3509,7 +3534,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Gizlenen bazı ayarlar normal hesaplanan değerden farklı değerler kullanır.\n\nBu ayarları görmek için tıklayın." +msgstr "" +"Gizlenen bazı ayarlar normal hesaplanan değerden farklı değerler kullanır.\n" +"\n" +"Bu ayarları görmek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3537,7 +3565,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Bu ayarın değeri profilden farklıdır.\n\nProfil değerini yenilemek için tıklayın." +msgstr "" +"Bu ayarın değeri profilden farklıdır.\n" +"\n" +"Profil değerini yenilemek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3545,7 +3576,10 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Bu ayar normal olarak yapılır ama şu anda mutlak değer ayarı var.\n\nHesaplanan değeri yenilemek için tıklayın." +msgstr "" +"Bu ayar normal olarak yapılır ama şu anda mutlak değer ayarı var.\n" +"\n" +"Hesaplanan değeri yenilemek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3770,7 +3804,9 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Yazdırma Ayarı devre dışı\nG-code dosyaları üzerinde değişiklik yapılamaz" +msgstr "" +"Yazdırma Ayarı devre dışı\n" +"G-code dosyaları üzerinde değişiklik yapılamaz" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" From 5da1b71e94fe16de49c333618c422f19c2b1c25c Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 1 Oct 2018 13:54:02 +0200 Subject: [PATCH 119/212] Review Simplified Chinese translations. Contributes to CURA-5741. --- resources/i18n/zh_CN/cura.po | 62 ++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/resources/i18n/zh_CN/cura.po b/resources/i18n/zh_CN/cura.po index 2bbe81cfda..3c8f4b35a8 100644 --- a/resources/i18n/zh_CN/cura.po +++ b/resources/i18n/zh_CN/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-10-01 13:45+0100\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" "Language: zh_CN\n" @@ -64,7 +64,11 @@ msgid "" "

{model_names}

\n" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" -msgstr "

由于模型的大小和材质的配置,一个或多个3D模型可能无法最优地打印:

\n

{model_names}

\n

找出如何确保最好的打印质量和可靠性.

\n

查看打印质量指南

" +msgstr "" +"

由于模型的大小和材质的配置,一个或多个3D模型可能无法最优地打印:

\n" +"

{model_names}

\n" +"

找出如何确保最好的打印质量和可靠性.

\n" +"

查看打印质量指南

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -1074,7 +1078,12 @@ msgid "" "

Backups can be found in the configuration folder.

\n" "

Please send us this Crash Report to fix the problem.

\n" " " -msgstr "

糟糕,Ultimaker Cura 似乎遇到了问题。

\n

在启动时发生了不可修复的错误。这可能是因某些配置文件出错导致的。建议您备份并重置配置。

\n

您可在配置文件夹中找到备份。

\n

请向我们发送此错误报告,以便解决问题。

\n " +msgstr "" +"

糟糕,Ultimaker Cura 似乎遇到了问题。

\n" +"

在启动时发生了不可修复的错误。这可能是因某些配置文件出错导致的。建议您备份并重置配置。

\n" +"

您可在配置文件夹中找到备份。

\n" +"

请向我们发送此错误报告,以便解决问题。

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@action:button" @@ -1107,7 +1116,10 @@ msgid "" "

A fatal error has occurred in Cura. Please send us this Crash Report to fix the problem

\n" "

Please use the \"Send report\" button to post a bug report automatically to our servers

\n" " " -msgstr "

Cura 发生了严重错误。请将这份错误报告发送给我们以便修复问题

\n

请使用“发送报告”按钮将错误报告自动发布到我们的服务器

\n " +msgstr "" +"

Cura 发生了严重错误。请将这份错误报告发送给我们以便修复问题

\n" +"

请使用“发送报告”按钮将错误报告自动发布到我们的服务器

\n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:177 msgctxt "@title:groupbox" @@ -1572,7 +1584,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "该插件包含一个许可。\n您需要接受此许可才能安装此插件。\n是否同意下列条款?" +msgstr "" +"该插件包含一个许可。\n" +"您需要接受此许可才能安装此插件。\n" +"是否同意下列条款?" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:54 msgctxt "@action:button" @@ -1692,7 +1707,10 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "要通过网络向打印机发送打印请求,请确保您的打印机已通过网线或 WIFI 连接到网络。若您不能连接 Cura 与打印机,您仍然可以使用 USB 设备将 G-code 文件传输到打印机。\n\n从以下列表中选择您的打印机:" +msgstr "" +"要通过网络向打印机发送打印请求,请确保您的打印机已通过网线或 WIFI 连接到网络。若您不能连接 Cura 与打印机,您仍然可以使用 USB 设备将 G-code 文件传输到打印机。\n" +"\n" +"从以下列表中选择您的打印机:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:82 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:42 @@ -2646,7 +2664,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "您已自定义某些配置文件设置。\n您想保留或舍弃这些设置吗?" +msgstr "" +"您已自定义某些配置文件设置。\n" +"您想保留或舍弃这些设置吗?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3342,7 +3362,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura 由 Ultimaker B.V. 与社区合作开发。\nCura 使用以下开源项目:" +msgstr "" +"Cura 由 Ultimaker B.V. 与社区合作开发。\n" +"Cura 使用以下开源项目:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3455,7 +3477,10 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "某些设置/重写值与存储在配置文件中的值不同。\n\n点击打开配置文件管理器。" +msgstr "" +"某些设置/重写值与存储在配置文件中的值不同。\n" +"\n" +"点击打开配置文件管理器。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:199 msgctxt "@label:textbox" @@ -3509,7 +3534,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "一些隐藏设置正在使用有别于一般设置的计算值。\n\n单击以使这些设置可见。" +msgstr "" +"一些隐藏设置正在使用有别于一般设置的计算值。\n" +"\n" +"单击以使这些设置可见。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3537,7 +3565,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "此设置的值与配置文件不同。\n\n单击以恢复配置文件的值。" +msgstr "" +"此设置的值与配置文件不同。\n" +"\n" +"单击以恢复配置文件的值。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:286 msgctxt "@label" @@ -3545,7 +3576,10 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "此设置通常可被自动计算,但其当前已被绝对定义。\n\n单击以恢复自动计算的值。" +msgstr "" +"此设置通常可被自动计算,但其当前已被绝对定义。\n" +"\n" +"单击以恢复自动计算的值。" #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:129 msgctxt "@label" @@ -3768,7 +3802,9 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "打印设置已禁用\nG-code 文件无法被修改" +msgstr "" +"打印设置已禁用\n" +"G-code 文件无法被修改" #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:359 msgctxt "@tooltip" From ee5d647b6da72e71c37ed102a40fc67f2ff856a8 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 1 Oct 2018 14:42:25 +0200 Subject: [PATCH 120/212] Review the fdmprinter.def.json for Korean, Dutch, Portuguese, Russian, Turkish and Simplified Chinese. Contributes to CURA-5741. --- resources/i18n/ko_KR/fdmprinter.def.json.po | 18 +++++++++++++----- resources/i18n/nl_NL/fdmprinter.def.json.po | 18 +++++++++++++----- resources/i18n/pt_PT/fdmprinter.def.json.po | 18 +++++++++++++----- resources/i18n/ru_RU/fdmprinter.def.json.po | 18 +++++++++++++----- resources/i18n/tr_TR/fdmprinter.def.json.po | 18 +++++++++++++----- resources/i18n/zh_CN/fdmprinter.def.json.po | 18 +++++++++++++----- 6 files changed, 78 insertions(+), 30 deletions(-) diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 232e7185e4..adddd9e5c1 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-10-01 14:10+0100\n" "Last-Translator: Jinbuhm Kim \n" "Language-Team: Jinbum Kim , Korean \n" "Language: ko_KR\n" @@ -58,7 +58,9 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "시작과 동시에형실행될 G 코드 명령어 \n." +msgstr "" +"시작과 동시에형실행될 G 코드 명령어 \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,7 +72,9 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "맨 마지막에 실행될 G 코드 명령 \n." +msgstr "" +"맨 마지막에 실행될 G 코드 명령 \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -1627,7 +1631,9 @@ msgctxt "infill_wall_line_count description" msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." -msgstr "내부채움 영역 주변에 여분의 벽을 추가합니다. 이러한 벽은 상단/하단 스킨 라인이 늘어지는 것을 줄여줄 수 있습니다. 일부 여분 재료를 사용해도 같은 품질을 유지하는 데 필요한 필요한 상단/하단 스킨 층이 감소한다는 의미입니다.\n이 기능을 올바르게 구성하는 경우 내부채움 다각형 연결과 함께 사용해 이동 또는 리트랙션없이 모든 내부채움을 단일 돌출 경로에 연결할 수 있습니다." +msgstr "" +"내부채움 영역 주변에 여분의 벽을 추가합니다. 이러한 벽은 상단/하단 스킨 라인이 늘어지는 것을 줄여줄 수 있습니다. 일부 여분 재료를 사용해도 같은 품질을 유지하는 데 필요한 필요한 상단/하단 스킨 층이 감소한다는 의미입니다.\n" +"이 기능을 올바르게 구성하는 경우 내부채움 다각형 연결과 함께 사용해 이동 또는 리트랙션없이 모든 내부채움을 단일 돌출 경로에 연결할 수 있습니다." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -3794,7 +3800,9 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "프린트의 스커트와 첫 번째 레이어 사이의 수평 거리입니다.\n이것은 최소 거리입니다. 여러 개의 스커트 선이 이 거리에서 바깥쪽으로 연장됩니다." +msgstr "" +"프린트의 스커트와 첫 번째 레이어 사이의 수평 거리입니다.\n" +"이것은 최소 거리입니다. 여러 개의 스커트 선이 이 거리에서 바깥쪽으로 연장됩니다." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" diff --git a/resources/i18n/nl_NL/fdmprinter.def.json.po b/resources/i18n/nl_NL/fdmprinter.def.json.po index bbcef2b8c7..5853829744 100644 --- a/resources/i18n/nl_NL/fdmprinter.def.json.po +++ b/resources/i18n/nl_NL/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-10-01 14:10+0100\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" "Language: nl_NL\n" @@ -56,7 +56,9 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "G-code-opdrachten die aan het begin worden uitgevoerd, gescheiden door \n." +msgstr "" +"G-code-opdrachten die aan het begin worden uitgevoerd, gescheiden door \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +70,9 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "G-code-opdrachten die aan het eind worden uitgevoerd, gescheiden door \n." +msgstr "" +"G-code-opdrachten die aan het eind worden uitgevoerd, gescheiden door \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -3792,7 +3796,9 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "De horizontale afstand tussen de skirt en de eerste laag van de print.\nDit is de minimumafstand. Als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint." +msgstr "" +"De horizontale afstand tussen de skirt en de eerste laag van de print.\n" +"Dit is de minimumafstand. Als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -5229,7 +5235,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\nHierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten." +msgstr "" +"De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\n" +"Hierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/pt_PT/fdmprinter.def.json.po b/resources/i18n/pt_PT/fdmprinter.def.json.po index c485d84a89..b3f44a22fd 100644 --- a/resources/i18n/pt_PT/fdmprinter.def.json.po +++ b/resources/i18n/pt_PT/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-10-01 14:15+0100\n" "Last-Translator: Paulo Miranda \n" "Language-Team: Paulo Miranda , Portuguese \n" "Language: pt_PT\n" @@ -58,7 +58,9 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "Comandos G-code a serem executados no início – separados por \n." +msgstr "" +"Comandos G-code a serem executados no início – separados por \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,7 +72,9 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "Comandos G-code a serem executados no fim – separados por \n." +msgstr "" +"Comandos G-code a serem executados no fim – separados por \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -3938,7 +3942,9 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "A distância horizontal entre o contorno e o perímetro exterior da primeira camada da impressão.\nEsta é a distância mínima. Linhas múltiplas de contorno serão impressas para o exterior." +msgstr "" +"A distância horizontal entre o contorno e o perímetro exterior da primeira camada da impressão.\n" +"Esta é a distância mínima. Linhas múltiplas de contorno serão impressas para o exterior." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -5417,7 +5423,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "A distância de um movimento ascendente que é extrudido a metade da velocidade.\nIsto pode causar melhor aderência às camadas anteriores, sendo que o material nessas camadas não é demasiado aquecido. Aplica-se apenas à impressão de fios." +msgstr "" +"A distância de um movimento ascendente que é extrudido a metade da velocidade.\n" +"Isto pode causar melhor aderência às camadas anteriores, sendo que o material nessas camadas não é demasiado aquecido. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/ru_RU/fdmprinter.def.json.po b/resources/i18n/ru_RU/fdmprinter.def.json.po index 466eea158d..36904625d8 100644 --- a/resources/i18n/ru_RU/fdmprinter.def.json.po +++ b/resources/i18n/ru_RU/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-10-01 14:15+0100\n" "Last-Translator: Bothof \n" "Language-Team: Ruslan Popov , Russian \n" "Language: ru_RU\n" @@ -58,7 +58,9 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "Команды в G-коде, которые будут выполнены в самом начале, разделенные с помощью \n." +msgstr "" +"Команды в G-коде, которые будут выполнены в самом начале, разделенные с помощью \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,7 +72,9 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "Команды в G-коде, которые будут выполнены в самом конце, разделенные с помощью \n." +msgstr "" +"Команды в G-коде, которые будут выполнены в самом конце, разделенные с помощью \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -3794,7 +3798,9 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "Горизонтальное расстояние между юбкой и первым слоем печати.\nМинимальное расстояние. Несколько линий юбки будут расширяться от этого расстояния." +msgstr "" +"Горизонтальное расстояние между юбкой и первым слоем печати.\n" +"Минимальное расстояние. Несколько линий юбки будут расширяться от этого расстояния." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -5231,7 +5237,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\nЭто может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при каркасной печати." +msgstr "" +"Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\n" +"Это может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при каркасной печати." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/tr_TR/fdmprinter.def.json.po b/resources/i18n/tr_TR/fdmprinter.def.json.po index ba39d32284..6c70eb70e9 100644 --- a/resources/i18n/tr_TR/fdmprinter.def.json.po +++ b/resources/i18n/tr_TR/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-10-01 14:20+0100\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" "Language: tr_TR\n" @@ -56,7 +56,9 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr " \n ile ayrılan, başlangıçta yürütülecek G-code komutları." +msgstr "" +" \n" +" ile ayrılan, başlangıçta yürütülecek G-code komutları." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +70,9 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr " \n ile ayrılan, bitişte yürütülecek G-code komutları." +msgstr "" +" \n" +" ile ayrılan, bitişte yürütülecek G-code komutları." #: fdmprinter.def.json msgctxt "material_guid label" @@ -3792,7 +3796,9 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "Baskının eteği ve ilk katmanı arasındaki yatay mesafe.\nMinimum mesafedir. Bu mesafeden çok sayıda etek hattı dışarı doğru uzanır." +msgstr "" +"Baskının eteği ve ilk katmanı arasındaki yatay mesafe.\n" +"Minimum mesafedir. Bu mesafeden çok sayıda etek hattı dışarı doğru uzanır." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -5229,7 +5235,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "Yarı hızda sıkıştırılmış yukarı doğru hareket mesafesi.\nBu katmanlarda malzemeyi çok fazla ısıtmayarak önceki katmanlarda daha iyi yapışma sağlayabilir. Sadece kablo yazdırmaya uygulanır." +msgstr "" +"Yarı hızda sıkıştırılmış yukarı doğru hareket mesafesi.\n" +"Bu katmanlarda malzemeyi çok fazla ısıtmayarak önceki katmanlarda daha iyi yapışma sağlayabilir. Sadece kablo yazdırmaya uygulanır." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/zh_CN/fdmprinter.def.json.po b/resources/i18n/zh_CN/fdmprinter.def.json.po index 5f16293384..41b2b736de 100644 --- a/resources/i18n/zh_CN/fdmprinter.def.json.po +++ b/resources/i18n/zh_CN/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-09-28 14:25+0100\n" +"PO-Revision-Date: 2018-10-01 14:20+0100\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" "Language: zh_CN\n" @@ -58,7 +58,9 @@ msgctxt "machine_start_gcode description" msgid "" "G-code commands to be executed at the very start - separated by \n" "." -msgstr "在开始时执行的 G-code 命令 - 以 \n 分行。" +msgstr "" +"在开始时执行的 G-code 命令 - 以 \n" +" 分行。" #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,7 +72,9 @@ msgctxt "machine_end_gcode description" msgid "" "G-code commands to be executed at the very end - separated by \n" "." -msgstr "在结束前执行的 G-code 命令 - 以 \n 分行。" +msgstr "" +"在结束前执行的 G-code 命令 - 以 \n" +" 分行。" #: fdmprinter.def.json msgctxt "material_guid label" @@ -3794,7 +3798,9 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "skirt 和打印第一层之间的水平距离。\n这是最小距离。多个 skirt 走线将从此距离向外延伸。" +msgstr "" +"skirt 和打印第一层之间的水平距离。\n" +"这是最小距离。多个 skirt 走线将从此距离向外延伸。" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -5231,7 +5237,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "以半速挤出的上行移动的距离。\n这会与之前的层产生更好的附着,而不会将这些层中的材料过度加热。 仅应用于单线打印。" +msgstr "" +"以半速挤出的上行移动的距离。\n" +"这会与之前的层产生更好的附着,而不会将这些层中的材料过度加热。 仅应用于单线打印。" #: fdmprinter.def.json msgctxt "wireframe_top_jump label" From cc7d64b4f147f542cb21578adb6170fb3936042d Mon Sep 17 00:00:00 2001 From: drzejkopf <41212609+drzejkopf@users.noreply.github.com> Date: Sun, 23 Sep 2018 15:21:14 +0200 Subject: [PATCH 121/212] Complete Polish translation for version 3.5 --- resources/i18n/pl_PL/cura.po | 256 ++++++++++++++++++----------------- 1 file changed, 130 insertions(+), 126 deletions(-) diff --git a/resources/i18n/pl_PL/cura.po b/resources/i18n/pl_PL/cura.po index bab972db8c..5003eee692 100644 --- a/resources/i18n/pl_PL/cura.po +++ b/resources/i18n/pl_PL/cura.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-04-14 14:35+0200\n" -"Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" +"PO-Revision-Date: 2018-09-21 20:52+0200\n" +"Last-Translator: 'Jaguś' Paweł Jagusiak, Andrzej 'anraf1001' Rafalski and Jakub 'drzejkopf' Świeciński\n" "Language-Team: reprapy.pl\n" "Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 2.1.1\n" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22 msgctxt "@action" @@ -43,18 +43,18 @@ msgstr "Pliki G-code" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "Zapisywacz G-code nie obsługuje trybu nietekstowego." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "Wygeneruj G-code przed zapisem." #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" msgid "3D Model Assistant" -msgstr "" +msgstr "Asystent Modelu 3D" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:80 #, python-brace-format @@ -65,6 +65,10 @@ msgid "" "

Find out how to ensure the best possible print quality and reliability.

\n" "

View print quality guide

" msgstr "" +"

Jeden lub więcej modeli 3D może nie zostać wydrukowanych optymalnie ze względu na wymiary modelu oraz konfigurację materiału:

\n" +"

{model_names}

\n" +"

Dowiedz się, jak zapewnić najlepszą możliwą jakość oraz niezawodnośc wydruku.

\n" +"

Zobacz przewodnik po jakości wydruku (strona w języku angielskim)

" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32 msgctxt "@item:inmenu" @@ -104,7 +108,7 @@ msgstr "Połączono przez USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "Trwa drukowanie przez USB, zamknięcie Cura spowoduje jego zatrzymanie. Jesteś pewien?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -115,12 +119,12 @@ msgstr "Plik X3G" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16 msgctxt "X3g Writer Plugin Description" msgid "Writes X3g to files" -msgstr "" +msgstr "Zapisuje do plików X3g" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:21 msgctxt "X3g Writer File Description" msgid "X3g File" -msgstr "" +msgstr "Plik X3g" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/__init__.py:17 #: /home/ruben/Projects/Cura/plugins/GCodeGzReader/__init__.py:17 @@ -131,7 +135,7 @@ msgstr "Skompresowany Plik G-code" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "Zapisywacz skompresowanego G-code nie obsługuje trybu tekstowego." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -501,7 +505,7 @@ msgstr "Jak zaktualizować" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:91 msgctxt "@info" msgid "Could not access update information." -msgstr "Nie można uzyskać dostępu do informacji o aktualizacji" +msgstr "Nie można uzyskać dostępu do informacji o aktualizacji." #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" @@ -545,12 +549,12 @@ msgstr "Zbieranie Danych" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "More info" -msgstr "" +msgstr "Więcej informacji" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "See more information on what data Cura sends." -msgstr "" +msgstr "Zobacz więcej informacji o tym, jakie dane przesyła Cura." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:button" @@ -565,7 +569,7 @@ msgstr "Zezwól Cura na wysyłanie anonimowych danych statystycznych, aby pomóc #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" -msgstr "Profile Cura 15.04 " +msgstr "Profile Cura 15.04" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -628,7 +632,7 @@ msgstr "Nie można pociąć, ponieważ wieża czyszcząca lub jej pozycja(e) są #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "Nie można pociąć, ponieważ obecne są obiekty powiązane z wyłączonym ekstruderem %s." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -684,12 +688,12 @@ msgstr "Dysza" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "Plik projektu {0} zawiera nieznany typ maszyny {1}. Nie można zaimportować maszyny. Zostaną zaimportowane modele." #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "Otwórz Plik Projektu" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -746,7 +750,7 @@ msgstr "Plik Cura Project 3MF" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "Błąd zapisu pliku 3mf." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -802,7 +806,7 @@ msgstr "Łączenie podpory" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" -msgstr "Podpory " +msgstr "Podpory" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" @@ -1008,22 +1012,22 @@ msgstr "Obszar Roboczy" #: /home/ruben/Projects/Cura/cura/Backups/Backup.py:97 msgctxt "@info:backup_failed" msgid "Could not create archive from user data directory: {}" -msgstr "" +msgstr "Nie można utworzyć archiwum z folderu danych użytkownika: {}" #: /home/ruben/Projects/Cura/cura/Backups/Backup.py:102 msgctxt "@info:title" msgid "Backup" -msgstr "" +msgstr "Kopia zapasowa" #: /home/ruben/Projects/Cura/cura/Backups/Backup.py:112 msgctxt "@info:backup_failed" msgid "Tried to restore a Cura backup without having proper data or meta data." -msgstr "" +msgstr "Podjęto próbę przywrócenia kopii zapasowej Cura na podstawie niepoprawnych danych lub metadanych." #: /home/ruben/Projects/Cura/cura/Backups/Backup.py:122 msgctxt "@info:backup_failed" msgid "Tried to restore a Cura backup that does not match your current version." -msgstr "" +msgstr "Podjęto próbę przywrócenia kopii zapasowej Cura, która nie odpowiada obecnej wersji programu." #: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27 msgctxt "@info:status" @@ -1429,7 +1433,7 @@ msgstr "Zainstalowane" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxErrorPage.qml:16 msgctxt "@info" msgid "Could not connect to the Cura Package database. Please check your connection." -msgstr "" +msgstr "Nie można połączyć się z bazą danych pakietów Cura. Sprawdź swoje połączenie z internetem." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:26 @@ -1447,22 +1451,22 @@ msgstr "Materiał" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:80 msgctxt "@label" msgid "Version" -msgstr "" +msgstr "Wersja" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:86 msgctxt "@label" msgid "Last updated" -msgstr "" +msgstr "Ostatnia aktualizacja" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:92 msgctxt "@label" msgid "Author" -msgstr "" +msgstr "Autor" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "Pobrań" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1481,93 +1485,93 @@ msgstr "Aktualizuj" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:31 msgctxt "@action:button" msgid "Updating" -msgstr "" +msgstr "Aktualizowanie" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:46 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:32 msgctxt "@action:button" msgid "Updated" -msgstr "" +msgstr "Zaktualizowano" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:13 msgctxt "@title" msgid "Toolbox" -msgstr "" +msgstr "Narzędzia" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml:25 msgctxt "@action:button" msgid "Back" -msgstr "" +msgstr "Powrót" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "Potwierdź odinstalowanie " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "Odinstalowujesz materiały i/lub profile, które są aktualnie używane. Zatwierdzenie spowoduje przywrócenie bieżących ustawień materiału/profilu do ustawień domyślnych." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "Materiały" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "Profile" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "Potwierdź" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" msgid "You will need to restart Cura before changes in packages have effect." -msgstr "" +msgstr "Należy uruchomić ponownie Cura, aby zmiany w pakietach przyniosły efekt." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:34 msgctxt "@info:button" msgid "Quit Cura" -msgstr "" +msgstr "Zakończ Cura" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "Udział Społeczności" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "Wtyczki Społeczności" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "Materiały Podstawowe" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" msgid "Installed" -msgstr "" +msgstr "Zainstalowano" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:19 msgctxt "@label" msgid "Will install upon restarting" -msgstr "" +msgstr "Zostanie zainstalowane po ponownym uruchomieniu" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:51 msgctxt "@action:button" msgid "Downgrade" -msgstr "" +msgstr "Zainstaluj poprzednią wersję" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:51 msgctxt "@action:button" msgid "Uninstall" -msgstr "" +msgstr "Odinstaluj" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:16 msgctxt "@title:window" @@ -1598,27 +1602,27 @@ msgstr "Odrzuć" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcase.qml:23 msgctxt "@label" msgid "Featured" -msgstr "" +msgstr "Polecane" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:31 msgctxt "@label" msgid "Compatibility" -msgstr "" +msgstr "Zgodność" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLoadingPage.qml:16 msgctxt "@info" msgid "Fetching packages..." -msgstr "" +msgstr "Uzyskiwanie pakietów..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "Strona internetowa" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "E-mail" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1755,12 +1759,12 @@ msgstr "Adres" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "Ta drukarka nie jest skonfigurowana jako host dla grupy drukarek." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "Ta drukarka jest hostem grupy %1 drukarek." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1808,52 +1812,52 @@ msgstr "Drukuj" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "Oczekiwanie na: Niedostępną drukarkę" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "Oczekiwanie na: Pierwszą dostępną" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "Oczekiwanie na: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "Przesuń na początek" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "Przesuń zadanie drukowania na początek" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "Czy jesteś pewien, że chcesz przesunąć %1 na początek kolejki?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "Usuń" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "Usuń zadanie drukowania" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "Czy jesteś pewien, że chcesz usunąć %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "Zarządzaj kolejką" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1868,57 +1872,57 @@ msgstr "Drukowanie" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "Zarządzaj drukarkami" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "Niedostępny" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "Nieosiągalny" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "Dostępny" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "Ponów" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "Wstrzymaj" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "Anuluj" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 msgctxt "@window:title" msgid "Abort print" -msgstr "Przerwij wydruk" +msgstr "Anuluj wydruk" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "Czy jesteś pewien, że chcesz anulować %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "Anulowano" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1933,7 +1937,7 @@ msgstr "Przygotowywanie" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "Wstrzymywanie" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2073,22 +2077,22 @@ msgstr "Zmień aktywne skrypty post-processingu" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:16 msgctxt "@title:window" msgid "More information on anonymous data collection" -msgstr "" +msgstr "Wiećej informacji o zbieraniu anonimowych danych" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:66 msgctxt "@text:window" msgid "Cura sends anonymous data to Ultimaker in order to improve the print quality and user experience. Below is an example of all the data that is sent." -msgstr "" +msgstr "Cura wysyła anonimowe dane do Ultimaker w celu polepszenia jakości wydruków oraz interakcji z użytkownikiem. Poniżej podano przykład wszystkich danych, jakie mogą być przesyłane." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101 msgctxt "@text:window" msgid "I don't want to send these data" -msgstr "" +msgstr "Nie chcę przesyłać tych danych" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111 msgctxt "@text:window" msgid "Allow sending these data to Ultimaker and help us improve Cura" -msgstr "" +msgstr "Zezwól na przesyłanie tych danych do Ultimaker i pomóż nam ulepszać Cura" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" @@ -2351,7 +2355,7 @@ msgstr "Otwórz" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "Poprzedni" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2363,12 +2367,12 @@ msgstr "Eksportuj" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "Następny" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "Końcówka" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2417,12 +2421,12 @@ msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "Próbny wydruk" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "Lista kontrolna" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2645,7 +2649,7 @@ msgstr "Usuń wydruk" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "Anuluj Wydruk" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -2725,7 +2729,7 @@ msgstr "Potwierdź Zmianę Średnicy" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:101 msgctxt "@label (%1 is a number)" msgid "The new filament diameter is set to %1 mm, which is not compatible with the current extruder. Do you wish to continue?" -msgstr "" +msgstr "Średnica nowego filamentu została ustawiona na %1mm, i nie jest kompatybilna z bieżącym ekstruderem. Czy chcesz kontynuować?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:133 msgctxt "@label" @@ -3068,12 +3072,12 @@ msgstr "Skaluj bardzo małe modele" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:507 msgctxt "@info:tooltip" msgid "Should models be selected after they are loaded?" -msgstr "" +msgstr "Czy modele powinny zostać zaznaczone po załadowaniu?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 msgctxt "@option:check" msgid "Select models when loaded" -msgstr "" +msgstr "Zaznaczaj modele po załadowaniu" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@info:tooltip" @@ -3108,7 +3112,7 @@ msgstr "Domyślne zachowanie podczas otwierania pliku projektu: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "Zawsze pytaj" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3128,22 +3132,22 @@ msgstr "Kiedy dokonasz zmian w profilu i przełączysz się na inny, zostanie wy #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "Profile" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "Domyślne zachowanie dla zmienionych ustawień podczas zmiany profilu na inny: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "Zawsze odrzucaj wprowadzone zmiany" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "Zawsze przenoś wprowadzone zmiany do nowego profilu" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3173,7 +3177,7 @@ msgstr "Wyślij (anonimowe) informacje o drukowaniu" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:713 msgctxt "@action:button" msgid "More information" -msgstr "" +msgstr "Więcej informacji" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:731 msgctxt "@label" @@ -3338,7 +3342,7 @@ msgstr "Dodaj drukarkę" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "Bez tytułu" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3519,12 +3523,12 @@ msgstr "Skonfiguruj widoczność ustawień ..." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:643 msgctxt "@action:inmenu" msgid "Collapse All" -msgstr "" +msgstr "Schowaj wszystkie" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:648 msgctxt "@action:inmenu" msgid "Expand All" -msgstr "" +msgstr "Rozwiń wszystkie" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:249 msgctxt "@label" @@ -3696,17 +3700,17 @@ msgstr "Przed drukowaniem podgrzej stół. W dalszym ciągu można dostosowywać #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "Materiał" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "Ulubione" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "Podstawowe" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3780,12 +3784,12 @@ msgstr "Ekstruder" #: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/SyncButton.qml:16 msgctxt "@label:extruder label" msgid "Yes" -msgstr "" +msgstr "Tak" #: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/SyncButton.qml:16 msgctxt "@label:extruder label" msgid "No" -msgstr "" +msgstr "Nie" #: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 msgctxt "@title:menu menubar:file" @@ -3980,7 +3984,7 @@ msgstr "&Grupuj modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" -msgstr "Rozgrupuj modele " +msgstr "Rozgrupuj modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:304 msgctxt "@action:inmenu menubar:edit" @@ -4010,7 +4014,7 @@ msgstr "Przeładuj wszystkie modele" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "Rozłóż Wszystkie Modele na Wszystkie Platformy Robocze." +msgstr "Rozłóż Wszystkie Modele na Wszystkie Platformy Robocze" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:357 msgctxt "@action:inmenu menubar:edit" @@ -4055,7 +4059,7 @@ msgstr "Pokaż folder konfiguracji" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:423 msgctxt "@action:menu" msgid "Browse packages..." -msgstr "" +msgstr "Przeglądaj pakiety..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:430 msgctxt "@action:inmenu menubar:view" @@ -4146,17 +4150,17 @@ msgstr "&Plik" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "&Zapisz..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "&Eksportuj..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "Eksportuj Zaznaczenie..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4218,7 +4222,7 @@ msgstr "&Rozszerzenia" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:280 msgctxt "@title:menu menubar:toplevel" msgid "&Toolbox" -msgstr "" +msgstr "&Narzędzia" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:287 msgctxt "@title:menu menubar:toplevel" @@ -4233,7 +4237,7 @@ msgstr "P&omoc" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:341 msgctxt "@label" msgid "This package will be installed after restarting." -msgstr "" +msgstr "Ten pakiet zostanie zainstalowany po ponownym uruchomieniu." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:370 msgctxt "@action:button" @@ -4258,18 +4262,18 @@ msgstr "Czy na pewno chcesz rozpocząć nowy projekt? Spowoduje to wyczyszczenie #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Zamykanie Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "Czy jesteś pewien, że chcesz zakończyć Cura?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" msgid "Install Package" -msgstr "" +msgstr "Instaluj pakiety" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:868 msgctxt "@title:window" @@ -4446,7 +4450,7 @@ msgstr "Materiał" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "Użyj kleju z tą kombinacją materiałów" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4476,7 +4480,7 @@ msgstr "Rozłóż na obecnej platformie roboczej" #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)." -msgstr "" +msgstr "Zapewnia możliwość zmiany ustawień maszyny (takich jak objętość robocza, rozmiar dyszy itp.)." #: MachineSettingsAction/plugin.json msgctxt "name" @@ -4486,12 +4490,12 @@ msgstr "Ustawienia Maszyny" #: Toolbox/plugin.json msgctxt "description" msgid "Find, manage and install new Cura packages." -msgstr "" +msgstr "Znajdź, zarządzaj i instaluj nowe pakiety Cura." #: Toolbox/plugin.json msgctxt "name" msgid "Toolbox" -msgstr "" +msgstr "Narzędzia" #: XRayView/plugin.json msgctxt "description" @@ -4521,7 +4525,7 @@ msgstr "Zapisuje g-code do pliku." #: GCodeWriter/plugin.json msgctxt "name" msgid "G-code Writer" -msgstr "Pisarz G-code" +msgstr "Zapisywacz G-code" #: ModelChecker/plugin.json msgctxt "description" @@ -4576,7 +4580,7 @@ msgstr "Drukowanie USB" #: UserAgreement/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license." -msgstr "" +msgstr "Zapytaj użytkownika jednokrotnie, czy zgadza się z warunkami naszej licencji." #: UserAgreement/plugin.json msgctxt "name" @@ -4586,12 +4590,12 @@ msgstr "ZgodaUżytkownika" #: X3GWriter/plugin.json msgctxt "description" msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)." -msgstr "" +msgstr "Umożliwia zapisanie wyników cięcia jako plik X3G, aby wspierać drukarki obsługujące ten format (Malyan, Makerbot oraz inne oparte o oprogramowanie Sailfish)." #: X3GWriter/plugin.json msgctxt "name" msgid "X3GWriter" -msgstr "" +msgstr "Zapisywacz X3G" #: GCodeGzWriter/plugin.json msgctxt "description" @@ -4636,7 +4640,7 @@ msgstr "Wtyczka Urządzenia Wyjścia Dysku Zewn." #: UM3NetworkPrinting/plugin.json msgctxt "description" msgid "Manages network connections to Ultimaker 3 printers." -msgstr "" +msgstr "Zarządza ustawieniami połączenia sieciowego z drukarkami Ultimaker 3." #: UM3NetworkPrinting/plugin.json msgctxt "name" @@ -4756,12 +4760,12 @@ msgstr "Ulepszenie Wersji z 3.2 do 3.3" #: VersionUpgrade/VersionUpgrade33to34/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.3 to Cura 3.4." -msgstr "" +msgstr "Ulepsza konfigurację z Cura 3.3 do Cura 3.4." #: VersionUpgrade/VersionUpgrade33to34/plugin.json msgctxt "name" msgid "Version Upgrade 3.3 to 3.4" -msgstr "" +msgstr "Ulepszenie Wersji z 3.3 do 3.4" #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" @@ -4786,12 +4790,12 @@ msgstr "Ulepszenie Wersji 2.7 do 3.0" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Ulepsza konfigurację z Cura 3.4 do Cura 3.5." #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "Ulepszenie Wersji z 3.4 do 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" @@ -4926,7 +4930,7 @@ msgstr "3MF Writer" #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)." -msgstr "" +msgstr "Zapewnia czynności maszyny dla urządzeń Ultimaker (na przykład kreator poziomowania stołu, wybór ulepszeń itp.)." #: UltimakerMachineActions/plugin.json msgctxt "name" From 8fa73fc1fb4f48d1c7936c583402fba46219dda1 Mon Sep 17 00:00:00 2001 From: drzejkopf <41212609+drzejkopf@users.noreply.github.com> Date: Sun, 23 Sep 2018 15:28:14 +0200 Subject: [PATCH 122/212] Update fdmprinter.def.json.po --- resources/i18n/pl_PL/fdmprinter.def.json.po | 127 ++++++++++---------- 1 file changed, 66 insertions(+), 61 deletions(-) diff --git a/resources/i18n/pl_PL/fdmprinter.def.json.po b/resources/i18n/pl_PL/fdmprinter.def.json.po index caff3d9438..53aa32009e 100644 --- a/resources/i18n/pl_PL/fdmprinter.def.json.po +++ b/resources/i18n/pl_PL/fdmprinter.def.json.po @@ -6,16 +6,17 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.5\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-17 16:45+0200\n" -"Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" +"PO-Revision-Date: 2018-09-21 21:52+0200\n" +"Last-Translator: 'Jaguś' Paweł Jagusiak, Andrzej 'anraf1001' Rafalski and Jakub 'drzejkopf' Świeciński\n" "Language-Team: reprapy.pl\n" "Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 2.1.1\n" +"POT-Creation-Date: \n" #: fdmprinter.def.json msgctxt "machine_settings label" @@ -1073,12 +1074,12 @@ msgstr "Zygzak" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "Połącz Górne/Dolne Wieloboki" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "Łączy górne/dolne ścieżki powłoki, gdy są one prowadzone obok siebie. Przy wzorze koncentrycznym, załączenie tego ustawienia znacznie zredukuje czas ruchów jałowych, ale ze względu na to, że połączenie może nastąpić w połowie drogi ponad wypełnieniem, ta fukncja może pogorszyć jakość górnej powierzchni." #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1108,7 +1109,7 @@ msgstr "Optymalizuj Kolejność Drukowania Ścian" #: fdmprinter.def.json msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization. First layer is not optimized when choosing brim as build plate adhesion type." -msgstr "" +msgstr "Optymalizuje kolejność, w jakiej będą drukowane ścianki w celu zredukowania ilości retrakcji oraz dystansu ruchów jałowych. Większość części skorzysta na załączeniu tej funkcji, jednak w niektórych przypadkach czas druku może się wydłużyć, proszę więc o porównanie oszacowanego czasu z funkcją załączoną oraz wyłączoną. Pierwsza warstwa nie zostanie zoptymalizowana, jeżeli jako poprawa przyczepności stołu zostanie wybrany obrys." #: fdmprinter.def.json msgctxt "outer_inset_first label" @@ -1163,22 +1164,22 @@ msgstr "Kompensuje przepływ dla części, których wewnętrzna ściana jest dru #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "Minimalny Przepływ Dla Ścianek" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "Minimalny dopuszczalny przepływ procentowy dla linii ścianki. Kompensacja nakładania się ścianek redukuje przepływ, gdy dana ścianka znajduje się blisko wydrukowanej już ścianki. Ścianki, których przepływ powinien być mniejszy, niż ta wartość, będą zastąpione ruchami jałowymi. Aby używać tego ustawienia należy załączyć kompensację nakładających się ścianek oraz drukowanie ścianek zewnętrznych przed wewnętrznymi." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "Preferuj Retrakcję" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "Gdy załączone, retrakcja jest używana zamiast kombinowanego ruchu jałowego, który zastępuje ściankę, której przepływ jest mniejszy od minimalnego." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1478,7 +1479,7 @@ msgstr "Gęstość Wypełn." #: fdmprinter.def.json msgctxt "infill_sparse_density description" msgid "Adjusts the density of infill of the print." -msgstr "Dostosowuje gęstość wypełnienia wydruku" +msgstr "Dostosowuje gęstość wypełnienia wydruku." #: fdmprinter.def.json msgctxt "infill_line_distance label" @@ -1573,12 +1574,12 @@ msgstr "Łączy końce gdzie wzór wypełnienia spotyka się z wewn. ścianą u #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "Połącz Wieloboki Wypełnienia" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "Łączy ścieżki wypełnienia, gdy są one prowadzone obok siebie. Dla wzorów wypełnienia zawierających kilka zamkniętych wieloboków, załączenie tego ustawienia znacznie skróci czas ruchów jałowych." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1613,17 +1614,17 @@ msgstr "Wzór wypełnienia jest przesunięty o tę odległość wzdłuż osi Y." #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "Mnożnik Linii Wypełnienia" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "Zmienia pojedynczą linię wypełnienia na zadaną ilość linii. Dodatkowe linie wypełnienia nie będą nad sobą przechodzić, ale będą się unikać. Sprawi to, że wypełnienie będzie sztywniejsze, ale czas druku oraz zużycie materiału zwiększą się." #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "Ilość Dodatkowych Ścianek Wypełnienia" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" @@ -1631,6 +1632,8 @@ msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." msgstr "" +"Dodaje ścianki naokoło wypełnienia. Takie ścianki mogą spowodować, że linie górnej/dolnej powłoki będą zwisać mniej, co pozwoli na zastosowanie mniejszej ilości górnych/dolnych warstw przy zachowaniu takiej samej jakości kosztem dodatkowego materiału.\n" +"Ta funkcja może być używana razem z funkcją \"Połącz Wieloboki Wypełnienia\", aby połączyć całe wypełnienie w pojedynczą ścieżkę, co przy poprawnej konfiguracji wyelinimuje potrzebę wykonywania ruchów jałowych lub retrakcji." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1745,22 +1748,22 @@ msgstr "Nie generuj obszarów wypełnienia mniejszych niż to (zamiast tego uży #: fdmprinter.def.json msgctxt "infill_support_enabled label" msgid "Infill Support" -msgstr "" +msgstr "Wypełnienie Podporowe" #: fdmprinter.def.json msgctxt "infill_support_enabled description" msgid "Print infill structures only where tops of the model should be supported. Enabling this reduces print time and material usage, but leads to ununiform object strength." -msgstr "" +msgstr "Drukuj wypełnienie tylko w miejscach, w których górna część modelu powinna być podparta strukturą wewnętrzną. Załączenie tej funkcji skutkuje redukcją czasu druku, ale prowadzi do niejednolitej wytrzymałości obiektu." #: fdmprinter.def.json msgctxt "infill_support_angle label" msgid "Infill Overhang Angle" -msgstr "" +msgstr "Kąt Zwisu dla Wypełnienia" #: fdmprinter.def.json msgctxt "infill_support_angle description" msgid "The minimum angle of internal overhangs for which infill is added. At a value of 0° objects are totally filled with infill, 90° will not provide any infill." -msgstr "" +msgstr "Minimalny kąt zwisu wewnętrznego, dla którego zostanie dodane wypełnienie. Przy wartości 0° obiekty zostaną wypełnione całkowicie, natomiast przy 90° wypełnienie nie zostanie wygenerowane." #: fdmprinter.def.json msgctxt "skin_preshrink label" @@ -2095,12 +2098,12 @@ msgstr "Okno, w którym wymuszona jest maksymalna liczba retrakcji. Wartość ta #: fdmprinter.def.json msgctxt "limit_support_retractions label" msgid "Limit Support Retractions" -msgstr "" +msgstr "Ogranicz Retrakcje Pomiędzy Podporami" #: fdmprinter.def.json msgctxt "limit_support_retractions description" msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure." -msgstr "" +msgstr "Unikaj retrakcji podczas poruszania się od podpory do podpory w linii prostej. Załączenie tej funkcji spowoduje skrócenie czasu druku, lecz może prowadzić do nadmiernego nitkowania wewnątrz struktur podporowych." #: fdmprinter.def.json msgctxt "material_standby_temperature label" @@ -2210,7 +2213,7 @@ msgstr "Prędkość Wewn. Ściany" #: fdmprinter.def.json msgctxt "speed_wall_x description" msgid "The speed at which all inner walls are printed. Printing the inner wall faster than the outer wall will reduce printing time. It works well to set this in between the outer wall speed and the infill speed." -msgstr "Szybkość, z jaką drukowane są ściany wewnętrzne. Drukowanie wewnętrznej ściany szybciej niż zewn. pozwoli skrócić czas druku. Zaleca się, aby ustawić to pomiędzy prędkością zewn. ściany, a prędkością wypełnienia" +msgstr "Szybkość, z jaką drukowane są ściany wewnętrzne. Drukowanie wewnętrznej ściany szybciej niż zewn. pozwoli skrócić czas druku. Zaleca się, aby ustawić to pomiędzy prędkością zewn. ściany, a prędkością wypełnienia." #: fdmprinter.def.json msgctxt "speed_roofing label" @@ -2781,6 +2784,8 @@ msgstr "Tryb Kombinowania" msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." msgstr "" +"Kombinowanie utrzymuje dyszę w już zadrukowanych obszarach podczas ruchu jałowego. Powoduje to nieco dłuższe ruchy jałowe, ale zmniejsza potrzebę retrakcji. Jeśli kombinowanie jest wyłączone, materiał się cofa, a dysza przemieszcza się w linii prostej do następnego punktu. Można też unikać kombinowania na górnych/dolnych obszarach powłoki, a także kombinować tylko wewnątrz wypełnienia. Opcja \"Wewnątrz Wypełnienia\" wymusza takie samo zachowanie, jak opcja \"Nie w Powłoce\" we wcześniejszych " +"wydaniach Cura." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2795,22 +2800,22 @@ msgstr "Wszędzie" #: fdmprinter.def.json msgctxt "retraction_combing option noskin" msgid "Not in Skin" -msgstr "" +msgstr "Nie w Powłoce" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "Wewnątrz Wypełnienia" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" msgid "Max Comb Distance With No Retract" -msgstr "" +msgstr "Max. Dystans Kombinowania Bez Retrakcji" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance description" msgid "When non-zero, combing travel moves that are longer than this distance will use retraction." -msgstr "" +msgstr "Przy wartości niezerowej, kombinowane ruchy jałowe o dystansie większym niż zadany bedą używały retrakcji." #: fdmprinter.def.json msgctxt "travel_retract_before_outer_wall label" @@ -2835,12 +2840,12 @@ msgstr "Dysza unika już wydrukowanych części podczas ruchu jałowego. Ta opcj #: fdmprinter.def.json msgctxt "travel_avoid_supports label" msgid "Avoid Supports When Traveling" -msgstr "" +msgstr "Unikaj Podpór Podczas Ruchu Jałowego" #: fdmprinter.def.json msgctxt "travel_avoid_supports description" msgid "The nozzle avoids already printed supports when traveling. This option is only available when combing is enabled." -msgstr "" +msgstr "Dysza będzie omijała już wydrukowane podpory podczas ruchu jałowego. Ta opcja jest dostępna jedynie, gdy kombinowanie jest włączone." #: fdmprinter.def.json msgctxt "travel_avoid_distance label" @@ -3195,12 +3200,12 @@ msgstr "Krzyż" #: fdmprinter.def.json msgctxt "support_wall_count label" msgid "Support Wall Line Count" -msgstr "" +msgstr "Ilość Ścianek Podpory" #: fdmprinter.def.json msgctxt "support_wall_count description" msgid "The number of walls with which to surround support infill. Adding a wall can make support print more reliably and can support overhangs better, but increases print time and material used." -msgstr "" +msgstr "Liczba ścianek otaczających wypełnienie podpory. Dodanie ścianki może sprawić, że podpory będą drukowane solidniej i będą mogły lepiej podpierać nawisy, ale wydłuży to czas druku i zwiększy ilość użytego materiału." #: fdmprinter.def.json msgctxt "zig_zaggify_support label" @@ -3245,22 +3250,22 @@ msgstr "Odległość między drukowanymi liniami struktury podpory. To ustawieni #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "Odstęp Między Liniami Podpory w Pocz. Warstwie" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "Odległość między drukowanymi liniami struktury podpory w początkowej warstwie. To ustawienie jest obliczane na podstawie gęstości podpory." #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "Kierunek Linii Wypełnienia Podpory" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "Orientacja wzoru wypełnienia dla podpór. Wzór podpory jest obracany w płaszczyźnie poziomej." #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3630,22 +3635,22 @@ msgstr "Zygzak" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "Nadpisanie Prędkości Wentylatora" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "Gdy załączone, prędkość wentylatora chłodzącego wydruk jest zmieniana dla obszarów leżących bezpośrednio ponad podporami," #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "Prędkość Wentylatora Podpartej Powłoki" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "Procentowa prędkść wentylatora, która zostanie użyta podczas drukowania obszarów powłoki leżących bezpośrednio nad podstawami. Użycie wysokiej prędkości może ułatwić usuwanie podpór." #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3974,7 +3979,7 @@ msgstr "Szerokość linii na podstawowej warstwie tratwy. Powinny być to grube #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "Rozstaw Linii Podstawy Tratwy" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4069,7 +4074,7 @@ msgstr "Zryw Tratwy" #: fdmprinter.def.json msgctxt "raft_jerk description" msgid "The jerk with which the raft is printed." -msgstr "Zryw, z jakim drukowana jest tratwa" +msgstr "Zryw, z jakim drukowana jest tratwa." #: fdmprinter.def.json msgctxt "raft_surface_jerk label" @@ -4719,12 +4724,12 @@ msgstr "Dane łączące przepływ materiału (w mm3 na sekundę) z temperaturą #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "Minimalny Obwód Wieloboku" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "Wieloboki w pociętych warstwach mające obwód mniejszy, niż podany, będą odfiltrowane. Mniejsze wartości dają wyższą rozdzielczość siatki kosztem czasu cięcia. Funkcja ta jest przeznaczona głównie dla drukarek wysokiej rozdzielczości SLA oraz bardzo małych modeli z dużą ilością detali." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -4739,12 +4744,12 @@ msgstr "Minimalny rozmiar linii segmentu po pocięciu. Jeżeli to zwiększysz, s #: fdmprinter.def.json msgctxt "meshfix_maximum_travel_resolution label" msgid "Maximum Travel Resolution" -msgstr "" +msgstr "Maksymalna Rozdzielczość Ruchów Jałowych" #: fdmprinter.def.json msgctxt "meshfix_maximum_travel_resolution description" msgid "The minimum size of a travel line segment after slicing. If you increase this, the travel moves will have less smooth corners. This may allow the printer to keep up with the speed it has to process g-code, but it may cause model avoidance to become less accurate." -msgstr "" +msgstr "Minimalny rozmiar segmentu linii ruchu jałowego po pocięciu. Jeżeli ta wartość zostanie zwiększona, ruch jałowy będzie miał mniej gładkie zakręty. Może to spowodować przyspieszenie prędkości przetwarzania g-code, ale unikanie modelu może być mniej dokładne." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4909,22 +4914,22 @@ msgstr "Rozmiar kieszeni na czterostronnych skrzyżowaniach we wzorze krzyż 3D #: fdmprinter.def.json msgctxt "cross_infill_density_image label" msgid "Cross Infill Density Image" -msgstr "" +msgstr "Gęstośc Wypełnienia Krzyżowego Według Obrazu" #: fdmprinter.def.json msgctxt "cross_infill_density_image description" msgid "The file location of an image of which the brightness values determine the minimal density at the corresponding location in the infill of the print." -msgstr "" +msgstr "Lokalizacja pliku obrazu, którego jasność będzie determinowała minimalną gęstość wypełnienia wydruku w danym punkcie." #: fdmprinter.def.json msgctxt "cross_support_density_image label" msgid "Cross Fill Density Image for Support" -msgstr "" +msgstr "Gęstości Wypełnienia Krzyżowego Podstaw Według Obrazu" #: fdmprinter.def.json msgctxt "cross_support_density_image description" msgid "The file location of an image of which the brightness values determine the minimal density at the corresponding location in the support." -msgstr "" +msgstr "Lokalizacja pliku obrazu, którego jasność będzie determinowała minimalną gęstość wypełnienia podstawy w danym punkcie." #: fdmprinter.def.json msgctxt "spaghetti_infill_enabled label" @@ -5174,7 +5179,7 @@ msgstr "DD Przepływ" #: fdmprinter.def.json msgctxt "wireframe_flow description" msgid "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing." -msgstr "Kompensacja przepływu: ilość wytłaczanego materiału jest mnożona przez tę wartość. Odnosi się tylko do Drukowania Drutu. " +msgstr "Kompensacja przepływu: ilość wytłaczanego materiału jest mnożona przez tę wartość. Odnosi się tylko do Drukowania Drutu." #: fdmprinter.def.json msgctxt "wireframe_flow_connection label" @@ -5258,7 +5263,7 @@ msgstr "DD Spadek" #: fdmprinter.def.json msgctxt "wireframe_fall_down description" msgid "Distance with which the material falls down after an upward extrusion. This distance is compensated for. Only applies to Wire Printing." -msgstr "Odległość o jaką spada materiału przez wytłaczanie w górę. Długość ta jest kompensowana. Odnosi się tylko do Drukowania Drutu" +msgstr "Odległość o jaką spada materiału przez wytłaczanie w górę. Długość ta jest kompensowana. Odnosi się tylko do Drukowania Drutu." #: fdmprinter.def.json msgctxt "wireframe_drag_along label" @@ -5363,7 +5368,7 @@ msgstr "Maks. zmiana zmiennych warstw" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height." -msgstr "" +msgstr "Maksymalna dozwolona różnica wysokości względem bazowej wysokości warstwy." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" @@ -5388,22 +5393,22 @@ msgstr "Opóźnienie w wyborze, czy użyć mniejszej warstwy, czy nie. Ta liczba #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "Kąt Nawisającej Ścianki" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "Ścianka o większym kącie nawisu niż podany będzie drukowana z użyciem ustawień nawisającej ścianki. Przy wartości 90°, żadna ścianka nie będzie traktowana jako ścianka nawisająca." #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "Prędkość Ścianki Nawisającej" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "Nawisające ścianki będą drukowane z taką procentową wartością względem normalnej prędkości druku." #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" @@ -5608,7 +5613,7 @@ msgstr "Ustawienia, które są używane tylko wtedy, gdy CuraEngine nie jest wyw #: fdmprinter.def.json msgctxt "center_object label" msgid "Center Object" -msgstr "" +msgstr "Wyśrodkuj obiekt" #: fdmprinter.def.json msgctxt "center_object description" @@ -5618,7 +5623,7 @@ msgstr "Czy wyśrodkować obiekt na środku stołu (0,0), zamiast używać ukła #: fdmprinter.def.json msgctxt "mesh_position_x label" msgid "Mesh Position X" -msgstr "" +msgstr "Pozycja Siatki w X" #: fdmprinter.def.json msgctxt "mesh_position_x description" @@ -5628,7 +5633,7 @@ msgstr "Przesunięcie zastosowane dla obiektu w kierunku X." #: fdmprinter.def.json msgctxt "mesh_position_y label" msgid "Mesh Position Y" -msgstr "" +msgstr "Pozycja Siatki w Y" #: fdmprinter.def.json msgctxt "mesh_position_y description" @@ -5638,7 +5643,7 @@ msgstr "Przesunięcie zastosowane dla obiektu w kierunku Y." #: fdmprinter.def.json msgctxt "mesh_position_z label" msgid "Mesh Position Z" -msgstr "" +msgstr "Pozycja Siatki w Z" #: fdmprinter.def.json msgctxt "mesh_position_z description" From acb7df710c6f810c1ddba90258359f7a922028b6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 1 Oct 2018 15:37:28 +0200 Subject: [PATCH 123/212] Fix getting cura application instance --- cura/Backups/Backup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Backups/Backup.py b/cura/Backups/Backup.py index 82157a163a..897d5fa979 100644 --- a/cura/Backups/Backup.py +++ b/cura/Backups/Backup.py @@ -36,7 +36,7 @@ class Backup: ## Create a back-up from the current user config folder. def makeFromCurrent(self) -> None: - cura_release = CuraApplication.getInstance().getVersion() + cura_release = self._application.getVersion() version_data_dir = Resources.getDataStoragePath() Logger.log("d", "Creating backup for Cura %s, using folder %s", cura_release, version_data_dir) @@ -59,7 +59,7 @@ class Backup: if archive is None: return files = archive.namelist() - + # Count the metadata items. We do this in a rather naive way at the moment. machine_count = len([s for s in files if "machine_instances/" in s]) - 1 material_count = len([s for s in files if "materials/" in s]) - 1 From 7d537f2c6f7e68e2f099a741c61edd76852e4917 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 1 Oct 2018 16:27:27 +0200 Subject: [PATCH 124/212] Fix data collection message at app start --- plugins/SliceInfoPlugin/SliceInfo.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index fd58e68938..5149b6a6a6 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -33,30 +33,35 @@ class SliceInfo(QObject, Extension): def __init__(self, parent = None): QObject.__init__(self, parent) Extension.__init__(self) - Application.getInstance().getOutputDeviceManager().writeStarted.connect(self._onWriteStarted) - Application.getInstance().getPreferences().addPreference("info/send_slice_info", True) - Application.getInstance().getPreferences().addPreference("info/asked_send_slice_info", False) + + self._application = Application.getInstance() + + self._application.getOutputDeviceManager().writeStarted.connect(self._onWriteStarted) + self._application.getPreferences().addPreference("info/send_slice_info", True) + self._application.getPreferences().addPreference("info/asked_send_slice_info", False) self._more_info_dialog = None self._example_data_content = None - if not Application.getInstance().getPreferences().getValue("info/asked_send_slice_info"): + self._application.initializationFinished.connect(self._onAppInitialized) + + def _onAppInitialized(self): + # DO NOT read any preferences values in the constructor because at the time plugins are created, no version + # upgrade has been performed yet because version upgrades are plugins too! + if not self._application.getPreferences().getValue("info/asked_send_slice_info"): self.send_slice_info_message = Message(catalog.i18nc("@info", "Cura collects anonymized usage statistics."), lifetime = 0, dismissable = False, title = catalog.i18nc("@info:title", "Collecting Data")) self.send_slice_info_message.addAction("MoreInfo", name = catalog.i18nc("@action:button", "More info"), icon = None, - description = catalog.i18nc("@action:tooltip", "See more information on what data Cura sends."), button_style = Message.ActionButtonStyle.LINK) + description = catalog.i18nc("@action:tooltip", "See more information on what data Cura sends."), button_style = Message.ActionButtonStyle.LINK) self.send_slice_info_message.addAction("Dismiss", name = catalog.i18nc("@action:button", "Allow"), icon = None, - description = catalog.i18nc("@action:tooltip", "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing.")) + description = catalog.i18nc("@action:tooltip", "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing.")) self.send_slice_info_message.actionTriggered.connect(self.messageActionTriggered) self.send_slice_info_message.show() - Application.getInstance().initializationFinished.connect(self._onAppInitialized) - - def _onAppInitialized(self): if self._more_info_dialog is None: self._more_info_dialog = self._createDialog("MoreInfoWindow.qml") From d1fce50f60bd8c80c4f3c7591ffe32053da01448 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 1 Oct 2018 16:30:27 +0200 Subject: [PATCH 125/212] Add Preferences upgrade 34 to 35 unit test --- .../tests/TestVersionUpgrade34to35.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py b/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py index 90b2cb5dea..a109d97dd7 100644 --- a/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py +++ b/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py @@ -17,6 +17,10 @@ test_upgrade_version_nr_data = [ version = 5 [metadata] setting_version = 4 + + [info] + asked_send_slice_info = True + send_slice_info = True """ ) ] @@ -32,4 +36,8 @@ def test_upgradeVersionNr(test_name, file_data, upgrader): #Check the new version. assert parser["general"]["version"] == "6" - assert parser["metadata"]["setting_version"] == "5" \ No newline at end of file + assert parser["metadata"]["setting_version"] == "5" + + # Check if the data collection values have been removed + assert not parser.has_option("info", "asked_send_slice_info") + assert not parser.has_option("info", "send_slice_info") From 77fd05ac706822d56e39b202a3ce3f394c30b929 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 1 Oct 2018 17:21:34 +0200 Subject: [PATCH 126/212] Disable other buttons while toolbox is downloading to avoid crashes. I did it that way to not be risky because we're close to the release. Contributes to CURA-5778. --- plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml | 2 +- plugins/Toolbox/resources/qml/ToolboxBackColumn.qml | 5 +++-- plugins/Toolbox/resources/qml/ToolboxDetailPage.qml | 3 +-- plugins/Toolbox/resources/qml/ToolboxHeader.qml | 5 +++-- plugins/Toolbox/src/Toolbox.py | 3 ++- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml b/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml index 90b92bd832..4aaea20813 100644 --- a/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml +++ b/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml @@ -15,7 +15,7 @@ Item { id: sidebar } - Rectangle + Item { id: header anchors diff --git a/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml b/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml index 5c60e368a9..8524b7d1e5 100644 --- a/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml +++ b/plugins/Toolbox/resources/qml/ToolboxBackColumn.qml @@ -23,6 +23,7 @@ Item { id: button text: catalog.i18nc("@action:button", "Back") + enabled: !toolbox.isDownloading UM.RecolorImage { id: backArrow @@ -39,7 +40,7 @@ Item width: width height: height } - color: button.hovered ? UM.Theme.getColor("primary") : UM.Theme.getColor("text") + color: button.enabled ? (button.hovered ? UM.Theme.getColor("primary") : UM.Theme.getColor("text")) : UM.Theme.getColor("text_inactive") source: UM.Theme.getIcon("arrow_left") } width: UM.Theme.getSize("toolbox_back_button").width @@ -59,7 +60,7 @@ Item { id: labelStyle text: control.text - color: control.hovered ? UM.Theme.getColor("primary") : UM.Theme.getColor("text") + color: control.enabled ? (control.hovered ? UM.Theme.getColor("primary") : UM.Theme.getColor("text")) : UM.Theme.getColor("text_inactive") font: UM.Theme.getFont("default_bold") horizontalAlignment: Text.AlignRight width: control.width diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml b/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml index 270e8fc1fc..cba55051f5 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml @@ -9,9 +9,8 @@ import UM 1.1 as UM Item { id: page - property var details: base.selection + property var details: base.selection || {} anchors.fill: parent - width: parent.width ToolboxBackColumn { id: sidebar diff --git a/plugins/Toolbox/resources/qml/ToolboxHeader.qml b/plugins/Toolbox/resources/qml/ToolboxHeader.qml index 59c51039d9..f2ed8fc31f 100644 --- a/plugins/Toolbox/resources/qml/ToolboxHeader.qml +++ b/plugins/Toolbox/resources/qml/ToolboxHeader.qml @@ -25,7 +25,7 @@ Item { text: catalog.i18nc("@title:tab", "Plugins") active: toolbox.viewCategory == "plugin" && enabled - enabled: toolbox.viewPage != "loading" && toolbox.viewPage != "errored" + enabled: !toolbox.isDownloading && toolbox.viewPage != "loading" && toolbox.viewPage != "errored" onClicked: { toolbox.filterModelByProp("packages", "type", "plugin") @@ -39,7 +39,7 @@ Item { text: catalog.i18nc("@title:tab", "Materials") active: toolbox.viewCategory == "material" && enabled - enabled: toolbox.viewPage != "loading" && toolbox.viewPage != "errored" + enabled: !toolbox.isDownloading && toolbox.viewPage != "loading" && toolbox.viewPage != "errored" onClicked: { toolbox.filterModelByProp("authors", "package_types", "material") @@ -53,6 +53,7 @@ Item { text: catalog.i18nc("@title:tab", "Installed") active: toolbox.viewCategory == "installed" + enabled: !toolbox.isDownloading anchors { right: parent.right diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index be9fe65004..3e2085277a 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -603,7 +603,7 @@ class Toolbox(QObject, Extension): @pyqtSlot() def cancelDownload(self) -> None: - Logger.log("i", "Toolbox: User cancelled the download of a plugin.") + Logger.log("i", "Toolbox: User cancelled the download of a package.") self.resetDownload() def resetDownload(self) -> None: @@ -755,6 +755,7 @@ class Toolbox(QObject, Extension): self._active_package = package self.activePackageChanged.emit() + ## The active package is the package that is currently being downloaded @pyqtProperty(QObject, fset = setActivePackage, notify = activePackageChanged) def activePackage(self) -> Optional[Dict[str, Any]]: return self._active_package From 6212bcbc33a5cac49f30b7f6ab48f16e76fb6d55 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 2 Oct 2018 10:34:37 +0200 Subject: [PATCH 127/212] Add traditional chinese translations to Cura. Contributes to CURA-5741. --- resources/i18n/zh_TW/cura.po | 144 ++++++++++---------- resources/i18n/zh_TW/fdmprinter.def.json.po | 74 +++++----- 2 files changed, 110 insertions(+), 108 deletions(-) diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po index 22a1cebe5f..3658a7f2b2 100644 --- a/resources/i18n/zh_TW/cura.po +++ b/resources/i18n/zh_TW/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-06-17 10:40+0800\n" +"PO-Revision-Date: 2018-10-02 10:25+0100\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: Zhang Heh Ji \n" "Language: zh_TW\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 2.0.8\n" +"X-Generator: Poedit 2.1.1\n" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22 msgctxt "@action" @@ -43,13 +43,13 @@ msgstr "G-code 檔案" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "G-code 寫入器不支援非文字模式。" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "請在儲存前產出 G-code。" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -108,7 +108,7 @@ msgstr "透過 USB 連接" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "USB 列印正在進行中,關閉 Cura 將停止此列印工作。你確定要繼續嗎?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -135,7 +135,7 @@ msgstr "壓縮 G-code 檔案" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "G-code GZ 寫入器不支援非文字模式。" #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -341,7 +341,7 @@ msgstr "向印表機發送存取請求" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:202 msgctxt "@label" msgid "Unable to start a new print job." -msgstr "無法開始新的列印作業" +msgstr "無法開始新的列印作業。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:204 msgctxt "@label" @@ -633,7 +633,7 @@ msgstr "無法切片(原因:換料塔或主位置無效)。" #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "有物件使用了被停用的擠出機 %s ,因此無法進行切片。" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -689,12 +689,12 @@ msgstr "噴頭" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "專案檔案 {0} 包含未知的機器類型 {1}。機器無法被匯入,但模型將被匯入。" #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "開啟專案檔案" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -751,7 +751,7 @@ msgstr "Cura 專案 3MF 檔案" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "寫入 3mf 檔案發生錯誤。" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -1467,7 +1467,7 @@ msgstr "作者" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "下載" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1507,27 +1507,27 @@ msgstr "返回" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "移除確認 " #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "你正在移除仍被使用的耗材/列印設定。確認後會將下列耗材/列印設定重設為預設值。" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "耗材" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "參數" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "確定" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1542,17 +1542,17 @@ msgstr "結束 Cura" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "社群貢獻" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "社群外掛" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "通用耗材" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1618,12 +1618,12 @@ msgstr "取得軟體包..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "網站" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "電子郵件" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1760,12 +1760,12 @@ msgstr "位址" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "此印表機未被設定為管理印表機群組。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "此印表機為 %1 印表機群組的管理者。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1813,100 +1813,100 @@ msgstr "列印" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "等待:印表機無法使用" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "等待:第一可用" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "等待:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "移至頂端" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "將列印作業移至最頂端" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "你確定要將 %1 移至隊列的頂端嗎?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "刪除" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "刪除列印作業" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "你確定要刪除 %1 嗎?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "管理隊列" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" msgid "Queued" -msgstr "已排入佇列" +msgstr "已排入隊列" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:44 msgctxt "@label" msgid "Printing" -msgstr "已排入佇列" +msgstr "列印中" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "管理印表機" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "無法使用" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "無法連接" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "可用" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "繼續" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "暫停" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "中斷" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 @@ -1917,13 +1917,13 @@ msgstr "中斷列印" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "你確定要中斷 %1 嗎?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "已中斷" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1938,7 +1938,7 @@ msgstr "正在準備" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "暫停中" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2354,7 +2354,7 @@ msgstr "開啟" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "前一個" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2366,12 +2366,12 @@ msgstr "匯出" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "下一個" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "提示" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2420,12 +2420,12 @@ msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "列印實驗" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "檢查清單" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2648,7 +2648,7 @@ msgstr "請取出列印件" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "中斷列印" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -3111,7 +3111,7 @@ msgstr "開啟專案檔案時的預設行為:" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "每次都向我確認" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3131,22 +3131,22 @@ msgstr "當你對列印參數進行更改然後切換到其他列印參數時, #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "列印參數" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "當切換到另一組列印參數時,對於被修改過的設定的預設行為:" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "總是放棄修改過的設定" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "總是將修改過的設定轉移至新的列印參數" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3341,7 +3341,7 @@ msgstr "新增印表機" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "無標題" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3558,7 +3558,7 @@ msgstr "這個設定是所有擠出機共用的。修改它會同時更動到所 #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 msgctxt "@label" msgid "The value is resolved from per-extruder values " -msgstr "這個數值是由每個擠出機的設定值解析出來的" +msgstr "這個數值是由每個擠出機的設定值解析出來的 " #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:188 msgctxt "@label" @@ -3636,7 +3636,7 @@ msgstr "此加熱頭的目前溫度。" #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ExtruderBox.qml:172 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the hotend to." -msgstr "加熱頭預熱溫度" +msgstr "加熱頭預熱溫度。" #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ExtruderBox.qml:336 #: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/HeatedBedBox.qml:331 @@ -3699,17 +3699,17 @@ msgstr "列印前請預熱熱床。你可以在熱床加熱時繼續調整相關 #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "耗材" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "常用" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "通用" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -4144,17 +4144,17 @@ msgstr "檔案(&F)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "儲存(&S)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "匯出(&E)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "匯出選擇…" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4256,13 +4256,13 @@ msgstr "你確定要開始一個新專案嗎?這將清除列印平台及任何 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "關閉 Cura 中" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "你確定要結束 Cura 嗎?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4322,7 +4322,7 @@ msgstr "層高" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:277 msgctxt "@tooltip" msgid "This quality profile is not available for you current material and nozzle configuration. Please change these to enable this quality profile" -msgstr "品質參數不適用於目前的耗材和噴頭設定。請變更這些設定以啟用此品質參數。" +msgstr "品質參數不適用於目前的耗材和噴頭設定。請變更這些設定以啟用此品質參數" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:450 msgctxt "@tooltip" @@ -4443,7 +4443,7 @@ msgstr "耗材" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "此耗材使用膠水組合" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4783,12 +4783,12 @@ msgstr "升級版本 2.7 到 3.0" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "將設定從 Cura 3.4 版本升級至 3.5 版本。" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "升級版本 3.4 到 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" diff --git a/resources/i18n/zh_TW/fdmprinter.def.json.po b/resources/i18n/zh_TW/fdmprinter.def.json.po index e3eff330ed..b59748ce00 100644 --- a/resources/i18n/zh_TW/fdmprinter.def.json.po +++ b/resources/i18n/zh_TW/fdmprinter.def.json.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-06-14 00:09+0800\n" +"PO-Revision-Date: 2018-10-02 10:30+0100\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: Zhang Heh Ji \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.8\n" +"X-Generator: Poedit 2.1.1\n" #: fdmprinter.def.json msgctxt "machine_settings label" @@ -1038,7 +1038,7 @@ msgstr "直線" #: fdmprinter.def.json msgctxt "top_bottom_pattern option concentric" msgid "Concentric" -msgstr "同心圓" +msgstr "同心" #: fdmprinter.def.json msgctxt "top_bottom_pattern option zigzag" @@ -1063,7 +1063,7 @@ msgstr "直線" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 option concentric" msgid "Concentric" -msgstr "同心圓" +msgstr "同心" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 option zigzag" @@ -1073,12 +1073,12 @@ msgstr "鋸齒狀" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "連接頂部/底部多邊形" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "將頂部/底部表層路徑相鄰的位置連接。同心模式時開啟此設定,可以大大地減少空跑時間。但因連接可能發生在填充途中,所以此功能可能降低頂部表層的品質。" #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1163,22 +1163,22 @@ msgstr "列印內壁時如果該位置已經有牆壁存在,所進行的的流 #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "最小牆壁流量" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "牆壁允許的最小流量百分比。當在已列印的牆壁旁列印牆壁時,「補償牆壁重疊」會減少耗材流量。小於此設定流量的牆壁會被空跑取代。當啟用此設定時,必需啟用「補償牆壁重疊」並設定先列印外壁再列印內壁。" #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "回抽優先" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "當此功能開啟時,對於低於最小流量門檻值的牆壁,使用回抽取代而非梳理模式空跑。" #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1543,7 +1543,7 @@ msgstr "四分立方體" #: fdmprinter.def.json msgctxt "infill_pattern option concentric" msgid "Concentric" -msgstr "同心圓" +msgstr "同心" #: fdmprinter.def.json msgctxt "infill_pattern option zigzag" @@ -1573,12 +1573,12 @@ msgstr "使用一條線沿著內牆的形狀,連接填充線條與內牆交會 #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "連接填充多邊形" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "連接彼此相鄰的填充路徑。 對於由多個閉合多邊形組成的填充圖案,啟用此設定可大大縮短空跑時間。" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1613,17 +1613,17 @@ msgstr "填充樣式在 Y 軸方向平移此距離。" #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "填充線倍增器" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "將每條填充線轉換為此數量。 額外的線條不會相互交叉,而是相互避開。 這會使填充更硬,但增加了列印時間和耗材使用。" #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "額外填充牆壁數量" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" @@ -1631,6 +1631,8 @@ msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." msgstr "" +"在填充區域周圍添加額外的牆壁。這樣的牆壁可以使頂部/底部表層線條較不易下垂,這表示您只要花費一些額外的材料,就可用更少層的頂部/底部表層得到相同的品質。\n" +"此功能可與「連接填充多邊形」結合使用。如果設定正確,可將所有填充連接為單一擠出路徑,不需空跑或回抽。" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2780,7 +2782,7 @@ msgstr "梳理模式" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "梳理模式讓噴頭空跑時保持在已列印的區域內。這導致較長的空跑距離但減少回抽的需求。如果關閉梳理模式,噴頭將會回抽耗材,直線移動到下一點。梳理模式可以避開頂部/底部表層,也可以只用在內部填充。注意「內部填充」選項的行為與舊版 Cura 的「表層以外區域」選項是完全相同的。" #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2800,7 +2802,7 @@ msgstr "表層以外區域" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "內部填充" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3240,27 +3242,27 @@ msgstr "支撐線條間距" #: fdmprinter.def.json msgctxt "support_line_distance description" msgid "Distance between the printed support structure lines. This setting is calculated by the support density." -msgstr "已列印支撐結構線條之間的距離。該設定通過支撐密度計算。" +msgstr "支撐結構線條之間的距離。該設定通過支撐密度計算。" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "支撐起始層線條間距" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "支撐結構起始層線條之間的距離。該設定通過支撐密度計算。" #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "支撐填充線條方向" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "支撐填充樣式的方向。 支撐填充樣式的旋轉方向是在水平面上旋轉。" #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3585,7 +3587,7 @@ msgstr "三角形" #: fdmprinter.def.json msgctxt "support_roof_pattern option concentric" msgid "Concentric" -msgstr "同心圓" +msgstr "同心" #: fdmprinter.def.json msgctxt "support_roof_pattern option zigzag" @@ -3630,22 +3632,22 @@ msgstr "鋸齒狀" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "改變風扇轉速" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "啟用後,列印支撐上方表層的風扇轉速會發生變化。" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "受支撐表層風扇轉速" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "在支撐上方列印表層區域時使用的風扇轉速百分比。使用高風扇轉速可以使支撐更容易移除。" #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3974,7 +3976,7 @@ msgstr "木筏底部的線寬。這些線條應該是粗線,以便協助列印 #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "木筏底部間距" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4719,12 +4721,12 @@ msgstr "數據連接耗材流量(mm3/s)到溫度(攝氏)。" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "最小多邊形周長" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "切片層中周長小於此值的多邊形將被過濾掉。設定較低的值會花費較多的切片時間,以獲得較高解析度的網格。它主要用於高解析度的 SLA 印表機和具有大量細節的微小 3D 模型。" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5034,7 +5036,7 @@ msgstr "絨毛皮膚" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_enabled description" msgid "Randomly jitter while printing the outer wall, so that the surface has a rough and fuzzy look." -msgstr "在列印外牆時隨機抖動,使表面具有粗糙和模糊的外觀。" +msgstr "在列印外牆時隨機抖動,使表面具有粗糙和毛絨絨的外觀。" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_thickness label" @@ -5388,22 +5390,22 @@ msgstr "決定是否使用較小層高的門檻值。此值會與一層中最陡 #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "突出牆壁角度" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "牆壁突出的角度大於此值時,將使用突出牆壁的設定列印。當此值設定為 90 時,所有牆壁都不會被當作突出牆壁。" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "突出牆壁速度" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "突出牆壁將會以正常速度的此百分比值列印。" #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" From 18361b94343dd1f443aa4074c6f8c5e28b38c904 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 2 Oct 2018 10:31:05 +0200 Subject: [PATCH 128/212] Ensure that CuraAPI can be called in the same way as before This should prevent another API break. CURA-5744 --- cura/API/__init__.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/cura/API/__init__.py b/cura/API/__init__.py index e9aba86a41..ad07452c1a 100644 --- a/cura/API/__init__.py +++ b/cura/API/__init__.py @@ -23,10 +23,22 @@ class CuraAPI(QObject): # For now we use the same API version to be consistent. VERSION = PluginRegistry.APIVersion + __instance = None # type: "CuraAPI" + _application = None # type: CuraApplication - def __init__(self, application: "CuraApplication") -> None: - super().__init__(parent = application) - self._application = application + # This is done to ensure that the first time an instance is created, it's forced that the application is set. + # The main reason for this is that we want to prevent consumers of API to have a dependency on CuraApplication. + # Since the API is intended to be used by plugins, the cura application should have already created this. + def __new__(cls, application: Optional["CuraApplication"] = None): + if cls.__instance is None: + if application is None: + raise Exception("Upon first time creation, the application must be set.") + cls.__instance = super(CuraAPI, cls).__new__(cls) + cls._application = application + return cls.__instance + + def __init__(self, application: Optional["CuraApplication"] = None) -> None: + super().__init__(parent = CuraAPI._application) # Accounts API self._account = Account(self._application) From 13eaa14752e7aec9d495c48bebe3be1206b56387 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 2 Oct 2018 11:37:04 +0200 Subject: [PATCH 129/212] Set preference for sending info to default state instead of removing them CURA-5095 --- .../VersionUpgrade34to35/VersionUpgrade34to35.py | 4 ++-- .../VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade34to35/VersionUpgrade34to35.py b/plugins/VersionUpgrade/VersionUpgrade34to35/VersionUpgrade34to35.py index 7acea7ab5e..9d59133036 100644 --- a/plugins/VersionUpgrade/VersionUpgrade34to35/VersionUpgrade34to35.py +++ b/plugins/VersionUpgrade/VersionUpgrade34to35/VersionUpgrade34to35.py @@ -88,9 +88,9 @@ class VersionUpgrade34to35(VersionUpgrade): # Need to show the data collection agreement again because the data Cura collects has been changed. if parser.has_option("info", "asked_send_slice_info"): - parser.remove_option("info", "asked_send_slice_info") + parser.set("info", "asked_send_slice_info", "False") if parser.has_option("info", "send_slice_info"): - parser.remove_option("info", "send_slice_info") + parser.set("info", "send_slice_info", "True") # Update version number. parser["general"]["version"] = "6" diff --git a/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py b/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py index a109d97dd7..b74e6f35ac 100644 --- a/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py +++ b/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py @@ -38,6 +38,6 @@ def test_upgradeVersionNr(test_name, file_data, upgrader): assert parser["general"]["version"] == "6" assert parser["metadata"]["setting_version"] == "5" - # Check if the data collection values have been removed - assert not parser.has_option("info", "asked_send_slice_info") - assert not parser.has_option("info", "send_slice_info") + # Check if the data collection values have been reset to their defaults + assert parser.get("info", "asked_send_slice_info") == "False" + assert parser.get("info", "send_slice_info") == "True" From 6d17144766fd7f3b02b5aaf9b8018580239b1065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20=27Patola=27=20Sampaio?= Date: Tue, 2 Oct 2018 07:00:14 -0300 Subject: [PATCH 130/212] Updated strings to Cura 3.5 --- resources/i18n/pt_BR/cura.po | 166 +++++++++---------- resources/i18n/pt_BR/fdmextruder.def.json.po | 4 +- resources/i18n/pt_BR/fdmprinter.def.json.po | 66 ++++---- 3 files changed, 119 insertions(+), 117 deletions(-) diff --git a/resources/i18n/pt_BR/cura.po b/resources/i18n/pt_BR/cura.po index f79850003a..1ff220941e 100644 --- a/resources/i18n/pt_BR/cura.po +++ b/resources/i18n/pt_BR/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2018-09-19 17:07+0200\n" -"PO-Revision-Date: 2018-06-23 02:20-0300\n" +"PO-Revision-Date: 2018-10-01 03:20-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio \n" "Language: pt_BR\n" @@ -42,13 +42,13 @@ msgstr "Arquivo G-Code" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:67 msgctxt "@error:not supported" msgid "GCodeWriter does not support non-text mode." -msgstr "" +msgstr "O GCodeWriter não suporta modo binário." #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:73 #: /home/ruben/Projects/Cura/plugins/GCodeWriter/GCodeWriter.py:89 msgctxt "@warning:status" msgid "Please generate G-code before saving." -msgstr "" +msgstr "Por favor gere o G-Code antes de salvar." #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:30 msgctxt "@info:title" @@ -107,7 +107,7 @@ msgstr "Conectado via USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:103 msgctxt "@label" msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "" +msgstr "Uma impressão USB está em progresso, fechar o Cura interromperá esta impressão. Tem certeza?" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15 #: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 @@ -134,7 +134,7 @@ msgstr "Arquivo de G-Code Comprimido" #: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/GCodeGzWriter.py:38 msgctxt "@error:not supported" msgid "GCodeGzWriter does not support text mode." -msgstr "" +msgstr "O GCodeGzWriter não suporta modo binário." #: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:38 msgctxt "@item:inlistbox" @@ -161,7 +161,7 @@ msgstr "Salvar em Unidade Removível {0}" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:131 msgctxt "@info:status" msgid "There are no file formats available to write with!" -msgstr "Há formatos de arquivo disponíveis com os quais escrever!" +msgstr "Não há formatos de arquivo disponíveis com os quais escrever!" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:94 #, python-brace-format @@ -345,13 +345,13 @@ msgstr "Incapaz de iniciar novo trabalho de impressão." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:204 msgctxt "@label" msgid "There is an issue with the configuration of your Ultimaker, which makes it impossible to start the print. Please resolve this issues before continuing." -msgstr "Há um problema com a configuração de sua Ultimaker que torna impossível iniciar a impressão. Por favor resolva este problema antes de continuar." +msgstr "Há um problema com a configuração de sua Ultimaker, o que torna impossível iniciar a impressão. Por favor resolva este problema antes de continuar." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:210 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:232 msgctxt "@window:title" msgid "Mismatched configuration" -msgstr "Configuração divergente" +msgstr "Configuração conflitante" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:224 msgctxt "@label" @@ -533,7 +533,7 @@ msgstr "Bloqueador de Suporte" #: /home/ruben/Projects/Cura/plugins/SupportEraser/__init__.py:13 msgctxt "@info:tooltip" msgid "Create a volume in which supports are not printed." -msgstr "Cria um volume em que suportes não são impressos." +msgstr "Cria um volume em que os suportes não são impressos." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" @@ -553,7 +553,7 @@ msgstr "Mais informações" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "See more information on what data Cura sends." -msgstr "Ver mais informações em que dados o Cura envia." +msgstr "Ver mais informações sobre os dados enviados pelo Cura." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:button" @@ -620,7 +620,7 @@ msgstr "Incapaz de fatiar com os ajustes atuais. Os seguintes ajustes têm erros #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "Incapaz de fatiar devido a alguns ajustes por modelo. Os seguintes ajustes têm erros em um ou mais dos modelos: {error_labels}" +msgstr "Incapaz de fatiar devido a alguns ajustes por modelo. Os seguintes ajustes têm erros em um dos modelos ou mais: {error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:396 msgctxt "@info:status" @@ -631,7 +631,7 @@ msgstr "Incapaz de fatiar porque a torre de purga ou posição de purga são inv #, python-format msgctxt "@info:status" msgid "Unable to slice because there are objects associated with disabled Extruder %s." -msgstr "" +msgstr "Incapaz de fatiar porque há objetos associados com o Extrusor desabilitado %s." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:414 msgctxt "@info:status" @@ -687,12 +687,12 @@ msgstr "Bico" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead." -msgstr "" +msgstr "O arquivo de projeto {0} contém um tipo de máquina desconhecido {1}. Não foi possível importar a máquina. Os modelos serão importados ao invés dela." #: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:471 msgctxt "@info:title" msgid "Open Project File" -msgstr "" +msgstr "Abrir Arquivo de Projeto" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" @@ -749,7 +749,7 @@ msgstr "Arquivo de Projeto 3MF do Cura" #: /home/ruben/Projects/Cura/plugins/3MFWriter/ThreeMFWriter.py:179 msgctxt "@error:zip" msgid "Error writing 3mf file." -msgstr "" +msgstr "Erro ao escrever arquivo 3mf." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -854,7 +854,7 @@ msgstr "O arquivo {0} já existe. Tem certeza que quer sobr #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:212 msgctxt "@menuitem" msgid "Not overridden" -msgstr "Não sobrepujado" +msgstr "Não sobreposto" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:120 msgctxt "@info:status" @@ -1397,7 +1397,7 @@ msgstr "Diâmetro de material compatível" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:403 msgctxt "@tooltip" msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "O diâmetro nominal do filamento suportado pela impressora. O diâmetro exato será sobrepujado pelo material e/ou perfil." +msgstr "O diâmetro nominal do filamento suportado pela impressora. O diâmetro exato será sobreposto pelo material e/ou perfil." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:419 msgctxt "@label" @@ -1465,7 +1465,7 @@ msgstr "Autor" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98 msgctxt "@label" msgid "Downloads" -msgstr "" +msgstr "Downloads" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:117 #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:159 @@ -1505,27 +1505,27 @@ msgstr "Voltar" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:20 msgctxt "@title:window" msgid "Confirm uninstall " -msgstr "" +msgstr "Confirme a deinstalação" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:50 msgctxt "@text:window" msgid "You are uninstalling materials and/or profiles that are still in use. Confirming will reset the following materials/profiles to their defaults." -msgstr "" +msgstr "Você está desinstalando material e/ou perfis que ainda estão em uso. Confirmar irá restaurar os materiais e perfis seguintes a seus defaults." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:51 msgctxt "@text:window" msgid "Materials" -msgstr "" +msgstr "Materiais" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:52 msgctxt "@text:window" msgid "Profiles" -msgstr "" +msgstr "Perfis" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:89 msgctxt "@action:button" msgid "Confirm" -msgstr "" +msgstr "Confirmar" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxFooter.qml:17 msgctxt "@info" @@ -1540,17 +1540,17 @@ msgstr "Sair do Cura" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Contributions" -msgstr "" +msgstr "Contribuições da Comunidade" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:34 msgctxt "@label" msgid "Community Plugins" -msgstr "" +msgstr "Complementos da Comunidade" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml:43 msgctxt "@label" msgid "Generic Materials" -msgstr "" +msgstr "Materiais Genéricos" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:54 msgctxt "@title:tab" @@ -1616,12 +1616,12 @@ msgstr "Obtendo pacotes..." #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:88 msgctxt "@label" msgid "Website" -msgstr "" +msgstr "Sítio Web" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:94 msgctxt "@label" msgid "Email" -msgstr "" +msgstr "Email" #: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22 msgctxt "@info:tooltip" @@ -1758,12 +1758,12 @@ msgstr "Endereço" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:302 msgctxt "@label" msgid "This printer is not set up to host a group of printers." -msgstr "" +msgstr "Esta impressora não está configurada para hospedar um grupo de impressoras." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:306 msgctxt "@label" msgid "This printer is the host for a group of %1 printers." -msgstr "" +msgstr "Esta impressora é a hospedeira de um grupo de %1 impressoras." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:316 msgctxt "@label" @@ -1811,52 +1811,52 @@ msgstr "Imprimir" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:142 msgctxt "@label" msgid "Waiting for: Unavailable printer" -msgstr "" +msgstr "Aguardando por: Impressora indisponível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:144 msgctxt "@label" msgid "Waiting for: First available" -msgstr "" +msgstr "Aguardando por: A primeira disponível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:148 msgctxt "@label" msgid "Waiting for: " -msgstr "" +msgstr "Aguardando por: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:213 msgctxt "@label" msgid "Move to top" -msgstr "" +msgstr "Mover para o topo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:234 msgctxt "@window:title" msgid "Move print job to top" -msgstr "" +msgstr "Move o trabalho de impressão para o topo da fila" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:236 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to move %1 to the top of the queue?" -msgstr "" +msgstr "Você tem certeza que quer mover %1 para o topo da fila?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:245 msgctxt "@label" msgid "Delete" -msgstr "" +msgstr "Remover" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:264 msgctxt "@window:title" msgid "Delete print job" -msgstr "" +msgstr "Remover trabalho de impressão" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintJobInfoBlock.qml:266 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to delete %1?" -msgstr "" +msgstr "Você tem certeza que quer remover %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:32 msgctxt "@label link to connect manager" msgid "Manage queue" -msgstr "" +msgstr "Gerenciar fila" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterMonitorItem.qml:54 msgctxt "@label" @@ -1871,40 +1871,40 @@ msgstr "Imprimindo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:54 msgctxt "@label link to connect manager" msgid "Manage printers" -msgstr "" +msgstr "Gerenciar impressoras" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:212 msgctxt "@label" msgid "Not available" -msgstr "" +msgstr "Não disponível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:215 msgctxt "@label" msgid "Unreachable" -msgstr "" +msgstr "Inacessível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:221 msgctxt "@label" msgid "Available" -msgstr "" +msgstr "Disponível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:289 msgctxt "@label" msgid "Resume" -msgstr "" +msgstr "Continuar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:416 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:293 msgctxt "@label" msgid "Pause" -msgstr "" +msgstr "Pausar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:444 msgctxt "@label" msgid "Abort" -msgstr "" +msgstr "Abortar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:464 #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:335 @@ -1915,13 +1915,13 @@ msgstr "Abortar impressão" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:466 msgctxt "@label %1 is the name of a print job." msgid "Are you sure you want to abort %1?" -msgstr "" +msgstr "Você tem certeza que quer abortar %1?" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:665 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:673 msgctxt "@label:status" msgid "Aborted" -msgstr "" +msgstr "Abortado" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:667 msgctxt "@label:status" @@ -1936,7 +1936,7 @@ msgstr "Preparando" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:675 msgctxt "@label:status" msgid "Pausing" -msgstr "" +msgstr "Pausando" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/ClusterControlItem.qml:677 msgctxt "@label:status" @@ -2293,8 +2293,8 @@ msgstr "Ausente no perfil" msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" -msgstr[0] "%1 sobrepujança" -msgstr[1] "%1 sobrepujanças" +msgstr[0] "%1 sobreposto" +msgstr[1] "%1 sobrepostos" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:247 msgctxt "@action:label" @@ -2305,8 +2305,8 @@ msgstr "Derivado de" msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" -msgstr[0] "%1, %2 sobrepujança" -msgstr[1] "%1, %2 sobrepujanças" +msgstr[0] "%1, %2 sobreposição" +msgstr[1] "%1, %2 sobreposições" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:268 msgctxt "@action:label" @@ -2354,7 +2354,7 @@ msgstr "Abrir" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:34 msgctxt "@action:button" msgid "Previous" -msgstr "" +msgstr "Anterior" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:138 #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154 @@ -2366,12 +2366,12 @@ msgstr "Exportar" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:140 msgctxt "@action:button" msgid "Next" -msgstr "" +msgstr "Próximo" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:163 msgctxt "@label" msgid "Tip" -msgstr "" +msgstr "Dica" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/CuraPrintProfileCreatorView.qml:80 #: /home/ruben/Projects/Cura/resources/qml/PrepareSidebar.qml:341 @@ -2420,12 +2420,12 @@ msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:143 msgctxt "@label" msgid "Print experiment" -msgstr "" +msgstr "Imprimir experimento" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageValidation.qml:26 msgctxt "@label" msgid "Checklist" -msgstr "" +msgstr "Lista de verificação" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2648,7 +2648,7 @@ msgstr "Por favor remova a impressão" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:325 msgctxt "@label" msgid "Abort Print" -msgstr "" +msgstr "Abortar Impressão" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337 msgctxt "@label" @@ -3111,7 +3111,7 @@ msgstr "Comportamento default ao abrir um arquivo de projeto" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@option:openProject" msgid "Always ask me this" -msgstr "" +msgstr "Sempre me perguntar" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:574 msgctxt "@option:openProject" @@ -3131,22 +3131,22 @@ msgstr "Quando você faz alterações em um perfil e troca para um diferent, um #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620 msgctxt "@label" msgid "Profiles" -msgstr "" +msgstr "Perfis" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:625 msgctxt "@window:text" msgid "Default behavior for changed setting values when switching to a different profile: " -msgstr "" +msgstr "Comportamento default para valores de configuração alterados ao mudar para um perfil diferente: " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:640 msgctxt "@option:discardOrKeep" msgid "Always discard changed settings" -msgstr "" +msgstr "Sempre descartar alterações da configuração" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:discardOrKeep" msgid "Always transfer changed settings to new profile" -msgstr "" +msgstr "Sempre transferir as alterações para o novo perfil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:675 msgctxt "@label" @@ -3300,7 +3300,7 @@ msgstr "Perfis personalizados" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:480 msgctxt "@action:button" msgid "Update profile with current settings/overrides" -msgstr "Atualizar perfil com ajustes atuais" +msgstr "Atualizar perfil com ajustes/sobreposições atuais" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:487 msgctxt "@action:button" @@ -3310,7 +3310,7 @@ msgstr "Descartar ajustes atuais" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:504 msgctxt "@action:label" msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below." -msgstr "Este perfil usa os defaults especificados pela impressora, portanto não tem ajustes e sobrepujanças na lista abaixo." +msgstr "Este perfil usa os defaults especificados pela impressora, portanto não tem ajustes/sobreposições na lista abaixo." #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:511 msgctxt "@action:label" @@ -3341,7 +3341,7 @@ msgstr "Adicionar Impressora" #: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:84 msgctxt "@text Print job name" msgid "Untitled" -msgstr "" +msgstr "Sem Título" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3479,7 +3479,7 @@ msgid "" "\n" "Click to open the profile manager." msgstr "" -"Alguns ajustes/sobrepujanças têm valores diferentes dos que estão armazenados no perfil.\n" +"Alguns ajustes/sobreposições têm valores diferentes dos que estão armazenados no perfil.\n" "\n" "Clique para abrir o gerenciador de perfis." @@ -3699,17 +3699,17 @@ msgstr "Aquecer a mesa antes de imprimir. Você pode continuar ajustando sua imp #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:13 msgctxt "@label:category menu label" msgid "Material" -msgstr "" +msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:37 msgctxt "@label:category menu label" msgid "Favorites" -msgstr "" +msgstr "Favoritos" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:61 msgctxt "@label:category menu label" msgid "Generic" -msgstr "" +msgstr "Genérico" #: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25 msgctxt "@label:category menu label" @@ -3912,7 +3912,7 @@ msgstr "Administrar Materiais..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" -msgstr "At&ualizar perfil com valores e sobrepujanças atuais" +msgstr "At&ualizar perfil com valores e sobreposições atuais" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:184 msgctxt "@action:inmenu menubar:profile" @@ -3922,7 +3922,7 @@ msgstr "&Descartar ajustes atuais" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." -msgstr "&Criar perfil a partir de ajustes atuais..." +msgstr "&Criar perfil a partir de ajustes/sobreposições atuais..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:202 msgctxt "@action:inmenu menubar:profile" @@ -4149,17 +4149,17 @@ msgstr "Arquivo (&F)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:120 msgctxt "@title:menu menubar:file" msgid "&Save..." -msgstr "" +msgstr "&Salvar..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:file" msgid "&Export..." -msgstr "" +msgstr "&Exportar..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:151 msgctxt "@action:inmenu menubar:file" msgid "Export Selection..." -msgstr "" +msgstr "Exportar Seleção..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:168 msgctxt "@title:menu menubar:toplevel" @@ -4261,13 +4261,13 @@ msgstr "Tem certeza que quer iniciar novo projeto? Isto esvaziará a mesa de imp #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:715 msgctxt "@title:window" msgid "Closing Cura" -msgstr "" +msgstr "Fechando o Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:716 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@label" msgid "Are you sure you want to exit Cura?" -msgstr "" +msgstr "Você tem certeza que deseja sair do Cura?" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:861 msgctxt "@window:title" @@ -4449,7 +4449,7 @@ msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:543 msgctxt "@label" msgid "Use glue with this material combination" -msgstr "" +msgstr "Use cola com esta combinação de materiais." #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:575 msgctxt "@label" @@ -4789,12 +4789,12 @@ msgstr "Atualização de Versão de 2.7 para 3.0" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" +msgstr "Atualiza configurações do Cura 3.4 para o Cura 3.5" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "" +msgstr "Atualização de Versão 3.4 para 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" @@ -5108,7 +5108,7 @@ msgstr "Leitor de Perfis do Cura" #~ msgctxt "@label" #~ msgid "Override Profile" -#~ msgstr "Sobrepujar Perfil" +#~ msgstr "Sobrescrever Perfil" #~ msgctxt "@info:tooltip" #~ msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" diff --git a/resources/i18n/pt_BR/fdmextruder.def.json.po b/resources/i18n/pt_BR/fdmextruder.def.json.po index 66a9aa7d3d..87eb768e57 100644 --- a/resources/i18n/pt_BR/fdmextruder.def.json.po +++ b/resources/i18n/pt_BR/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-06-23 05:00-0300\n" +"PO-Revision-Date: 2018-10-02 05:00-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio \n" "Language: pt_BR\n" @@ -215,4 +215,4 @@ msgstr "Diâmetro" #: fdmextruder.def.json msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." -msgstr "Ajusta o diâmetro do filamento usado. Acerte este valor com o diâmetro do filamento atual." +msgstr "Ajusta o diâmetro do filamento usado. Use o valor medido do diâmetro do filamento atual." diff --git a/resources/i18n/pt_BR/fdmprinter.def.json.po b/resources/i18n/pt_BR/fdmprinter.def.json.po index 68543a2aef..a352af777e 100644 --- a/resources/i18n/pt_BR/fdmprinter.def.json.po +++ b/resources/i18n/pt_BR/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.5\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" -"PO-Revision-Date: 2018-04-23 05:20-0300\n" +"PO-Revision-Date: 2018-10-02 06:30-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio \n" "Language: pt_BR\n" @@ -1073,12 +1073,12 @@ msgstr "Ziguezague" #: fdmprinter.def.json msgctxt "connect_skin_polygons label" msgid "Connect Top/Bottom Polygons" -msgstr "" +msgstr "Conectar Polígonos do Topo e Base" #: fdmprinter.def.json msgctxt "connect_skin_polygons description" msgid "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality." -msgstr "" +msgstr "Conectar camihos de contorno do topo e base onde se situarem próximos. Habilitar para o padrão concêntrico reduzirá bastante o tempo de percurso, mas visto que as conexões podem acontecer sobre o preenchimento no meio do caminho, este recurso pode reduzir a qualidade da superfície superior." #: fdmprinter.def.json msgctxt "skin_angles label" @@ -1163,22 +1163,22 @@ msgstr "Compensa o fluxo para partes de uma parede interna sendo impressa onde j #: fdmprinter.def.json msgctxt "wall_min_flow label" msgid "Minimum Wall Flow" -msgstr "" +msgstr "Mínimo Fluxo da Parede" #: fdmprinter.def.json msgctxt "wall_min_flow description" msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls." -msgstr "" +msgstr "Mínima porcentagem de fluxo permite para um filete de parede. A compensação de sobreposição de parede reduz o fluxo de uma parede quando ela está próxima a outra já impressa. Paredes cujo fluxo seja menor que este valor serão trocadas por um momento de percurso. Ao usar este ajuste, você deve habilitar a compensação de sobreposição de paredes e imprimir as paredes externas antes das internas." #: fdmprinter.def.json msgctxt "wall_min_flow_retract label" msgid "Prefer Retract" -msgstr "" +msgstr "Preferir Retração" #: fdmprinter.def.json msgctxt "wall_min_flow_retract description" msgid "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold." -msgstr "" +msgstr "Se usado, a retração é usada ao invés de combing para movimentos de percurso que substituem paredes cujo fluxo estiver abaixo do limite mínimo." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" @@ -1573,12 +1573,12 @@ msgstr "Conecta as extremidades onde o padrão de preenchimento toca a parede in #: fdmprinter.def.json msgctxt "connect_infill_polygons label" msgid "Connect Infill Polygons" -msgstr "" +msgstr "Conectar Polígonos do Preenchimento" #: fdmprinter.def.json msgctxt "connect_infill_polygons description" msgid "Connect infill paths where they run next to each other. For infill patterns which consist of several closed polygons, enabling this setting greatly reduces the travel time." -msgstr "" +msgstr "Conecta os caminhos de preenchimentos onde estiverem próximos um ao outro. Para padrões de preenchimento que consistam de vários polígonos fechados, a habilitação deste ajuste reduz bastante o tempo de percurso." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1613,17 +1613,17 @@ msgstr "O padrão de preenchimento é movido por esta distância no eixo Y." #: fdmprinter.def.json msgctxt "infill_multiplier label" msgid "Infill Line Multiplier" -msgstr "" +msgstr "Multiplicador de Filete de Preenchimento" #: fdmprinter.def.json msgctxt "infill_multiplier description" msgid "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage." -msgstr "" +msgstr "Converte cada file de preenchimento para este número de filetes. Os filetes extras não se cruzam, se evitam. Isto torna o preenchimento mais rígido, mas aumenta o tempo de impressão e uso do material." #: fdmprinter.def.json msgctxt "infill_wall_line_count label" msgid "Extra Infill Wall Count" -msgstr "" +msgstr "Contagem de Paredes de Preenchimento Extras" #: fdmprinter.def.json msgctxt "infill_wall_line_count description" @@ -1631,6 +1631,8 @@ msgid "" "Add extra walls around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\n" "This feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right." msgstr "" +"Adiciona paredes extra em torno da área de preenchimento. Tais paredes podem fazer filetes de contorno de topo e base afundarem menos, o que significa que você precisará de menos camadas de contorno de topo e base para a mesma qualidade, à custa de algum material extra.\n" +"Este recurso pode combinar com o Conectar Polígonos de Preenchimento para conecta todo o preenchimento em um único caminho de extrusão sem a necessidade de percursos ou retrações se os ajustes forem consistentes." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2780,7 +2782,7 @@ msgstr "Modo de Combing" #: fdmprinter.def.json msgctxt "retraction_combing description" msgid "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas and also to only comb within the infill. Note that the 'Within Infill' option behaves exactly like the 'Not in Skin' option in earlier Cura releases." -msgstr "" +msgstr "O Combing (penteamento) mantém o bico dentro de áreas já impressas durante os percursos. Isto resulta em movimentações um pouco mais amplas mas reduz a necessidade de retrações. Se o combing for desligado, o material sofrerá retração e o bico se moverá em linha reta ao próximo ponto. É também possível evitar combing sobre áreas de contorno de topo e base e ainda só fazer combing no preenchimento. Note que a opção 'Dentro do Preenchimento' se comporta exatamente como a 'Não no Contorno' em versões anteriores do Cura." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2800,7 +2802,7 @@ msgstr "Não no Contorno" #: fdmprinter.def.json msgctxt "retraction_combing option infill" msgid "Within Infill" -msgstr "" +msgstr "Dentro do Preenchimento" #: fdmprinter.def.json msgctxt "retraction_combing_max_distance label" @@ -3245,22 +3247,22 @@ msgstr "Distância entre as linhas impressas da estrutura de suporte. Este ajust #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance label" msgid "Initial Layer Support Line Distance" -msgstr "" +msgstr "Distância de Filetes da Camada Inicial de Suporte" #: fdmprinter.def.json msgctxt "support_initial_layer_line_distance description" msgid "Distance between the printed initial layer support structure lines. This setting is calculated by the support density." -msgstr "" +msgstr "Distância entre os filetes da camada inicial da camada de suporte. Este ajuste é calculado pela densidade de suporte." #: fdmprinter.def.json msgctxt "support_infill_angle label" msgid "Support Infill Line Direction" -msgstr "" +msgstr "Direção de Filete do Preenchimento de Suporte" #: fdmprinter.def.json msgctxt "support_infill_angle description" msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane." -msgstr "" +msgstr "Orientação do padrão de preenchimento para suportes. O padrão de preenchimento do suporte é rotacionado no plano horizontal." #: fdmprinter.def.json msgctxt "support_z_distance label" @@ -3310,17 +3312,17 @@ msgstr "Prioridade das Distâncias de Suporte" #: fdmprinter.def.json msgctxt "support_xy_overrides_z description" msgid "Whether the Support X/Y Distance overrides the Support Z Distance or vice versa. When X/Y overrides Z the X/Y distance can push away the support from the model, influencing the actual Z distance to the overhang. We can disable this by not applying the X/Y distance around overhangs." -msgstr "Se a distância XY sobrepuja a distância Z de suporte ou vice-versa. Quando XY sobrepuja Z a distância XY pode afastar o suporte do modelo, influenciando a distância Z real até a seção pendente. Podemos desabilitar isso não aplicando a distância XY em volta das seções pendentes." +msgstr "Se a distância XY substitui a distância Z de suporte ou vice-versa. Quando XY substitui Z a distância XY pode afastar o suporte do modelo, influenciando a distância Z real até a seção pendente. Podemos desabilitar isso não aplicando a distância XY em volta das seções pendentes." #: fdmprinter.def.json msgctxt "support_xy_overrides_z option xy_overrides_z" msgid "X/Y overrides Z" -msgstr "X/Y sobrepuja Z" +msgstr "X/Y substitui Z" #: fdmprinter.def.json msgctxt "support_xy_overrides_z option z_overrides_xy" msgid "Z overrides X/Y" -msgstr "Z sobrepuja X/Y" +msgstr "Z substitui X/Y" #: fdmprinter.def.json msgctxt "support_xy_distance_overhang label" @@ -3630,22 +3632,22 @@ msgstr "Ziguezague" #: fdmprinter.def.json msgctxt "support_fan_enable label" msgid "Fan Speed Override" -msgstr "" +msgstr "Sobrepor Velocidade de Ventoinha" #: fdmprinter.def.json msgctxt "support_fan_enable description" msgid "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support." -msgstr "" +msgstr "Quando habilitado, a velocidade da ventoinha de resfriamento é alterada para as regiões de contorno imediatamente acima do suporte" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed label" msgid "Supported Skin Fan Speed" -msgstr "" +msgstr "Velocidade de Ventoinha do Contorno Suportado" #: fdmprinter.def.json msgctxt "support_supported_skin_fan_speed description" msgid "Percentage fan speed to use when printing the skin regions immediately above the support. Using a high fan speed can make the support easier to remove." -msgstr "" +msgstr "Porcentagem de velocidade da ventoinha a usar ao imprimir as regiões de contorno imediatamente sobre o suporte. Usar uma velocidade de ventoinha alta pode fazer o suporte mais fácil de remover." #: fdmprinter.def.json msgctxt "support_use_towers label" @@ -3974,7 +3976,7 @@ msgstr "Largura das linhas na camada de base do raft. Devem ser grossas para aux #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Base Line Spacing" -msgstr "" +msgstr "Espaçamento de Filete de Base do Raft" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -4719,12 +4721,12 @@ msgstr "Dados relacionando fluxo de material (em mm³ por segundo) a temperatura #: fdmprinter.def.json msgctxt "minimum_polygon_circumference label" msgid "Minimum Polygon Circumference" -msgstr "" +msgstr "Mínima Circunferência do Polígono" #: fdmprinter.def.json msgctxt "minimum_polygon_circumference description" msgid "Polygons in sliced layers that have a circumference smaller than this amount will be filtered out. Lower values lead to higher resolution mesh at the cost of slicing time. It is meant mostly for high resolution SLA printers and very tiny 3D models with a lot of details." -msgstr "" +msgstr "Polígonos em camadas fatiadas que tiverem uma circunferência menor que esta quantia serão excluídos. Menores valores levam a malha de maior resolução ao custo de tempo de fatiamento. Serve melhor para impressoras SLA de alta resolução e pequenos modelos 3D com muitos detalhes." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -5388,22 +5390,22 @@ msgstr "Limite até onde se usa uma camada menor ou não. Este número é compar #: fdmprinter.def.json msgctxt "wall_overhang_angle label" msgid "Overhanging Wall Angle" -msgstr "" +msgstr "Ângulo de Parede Pendente" #: fdmprinter.def.json msgctxt "wall_overhang_angle description" msgid "Walls that overhang more than this angle will be printed using overhanging wall settings. When the value is 90, no walls will be treated as overhanging." -msgstr "" +msgstr "Paredes que têm inclinação maior que este ângulo serão impressas usando ajustes de seção pendente de parede. Quando o valor for 90, nenhuma parede será tratada como seção pendente." #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor label" msgid "Overhanging Wall Speed" -msgstr "" +msgstr "Velocidade de Parede Pendente" #: fdmprinter.def.json msgctxt "wall_overhang_speed_factor description" msgid "Overhanging walls will be printed at this percentage of their normal print speed." -msgstr "" +msgstr "Paredes pendentes serão impressas com esta porcentagem de sua velocidade de impressão normal." #: fdmprinter.def.json msgctxt "bridge_settings_enabled label" From a99241d20bcfb6a46b920d3e0257083e04291323 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 2 Oct 2018 15:53:06 +0200 Subject: [PATCH 131/212] Add missing quote. Contributes to CURA-5741. --- resources/i18n/pl_PL/fdmprinter.def.json.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/pl_PL/fdmprinter.def.json.po b/resources/i18n/pl_PL/fdmprinter.def.json.po index 53aa32009e..a8b07e032c 100644 --- a/resources/i18n/pl_PL/fdmprinter.def.json.po +++ b/resources/i18n/pl_PL/fdmprinter.def.json.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.5\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" "PO-Revision-Date: 2018-09-21 21:52+0200\n" "Last-Translator: 'Jaguś' Paweł Jagusiak, Andrzej 'anraf1001' Rafalski and Jakub 'drzejkopf' Świeciński\n" From 3908781f6f7d7072f71ae7011731c62d6c6583bc Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 2 Oct 2018 17:08:39 +0200 Subject: [PATCH 132/212] Fix this sh*t Sorry, I kind of dropped the ball before. --- cura/PrinterOutput/FirmwareUpdater.py | 38 ++++++++++++++--------- plugins/USBPrinting/AvrFirmwareUpdater.py | 20 +++++++----- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/cura/PrinterOutput/FirmwareUpdater.py b/cura/PrinterOutput/FirmwareUpdater.py index 2f200118a9..88169b1d75 100644 --- a/cura/PrinterOutput/FirmwareUpdater.py +++ b/cura/PrinterOutput/FirmwareUpdater.py @@ -16,6 +16,8 @@ class FirmwareUpdater(QObject): firmwareUpdateStateChanged = pyqtSignal() def __init__(self, output_device: PrinterOutputDevice) -> None: + super().__init__() + self._output_device = output_device self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) @@ -31,29 +33,35 @@ class FirmwareUpdater(QObject): self._firmware_location = QUrl(file).toLocalFile() else: self._firmware_location = file - self.showFirmwareInterface() - self.setFirmwareUpdateState(FirmwareUpdateState.updating) + self._showFirmwareInterface() + self._setFirmwareUpdateState(FirmwareUpdateState.updating) + self._update_firmware_thread.start() def _updateFirmware(self) -> None: raise NotImplementedError("_updateFirmware needs to be implemented") - def cleanupAfterUpdate(self) -> None: + ## Show firmware interface. + # This will create the view if its not already created. + def _showFirmwareInterface(self) -> None: + if self._firmware_view is None: + path = Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "FirmwareUpdateWindow.qml") + self._firmware_view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) + + if not self._firmware_view: + return + + self._onFirmwareProgress(0) + self._setFirmwareUpdateState(FirmwareUpdateState.idle) + self._firmware_view.show() + + ## Cleanup after a succesful update + def _cleanupAfterUpdate(self) -> None: # Clean up for next attempt. self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) self._firmware_location = "" self._onFirmwareProgress(100) - self.setFirmwareUpdateState(FirmwareUpdateState.completed) - - ## Show firmware interface. - # This will create the view if its not already created. - def showFirmwareInterface(self) -> None: - if self._firmware_view is None: - path = Resources.getPath(self.ResourceTypes.QmlFiles, "FirmwareUpdateWindow.qml") - self._firmware_view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) - - if self._firmware_view: - self._firmware_view.show() + self._setFirmwareUpdateState(FirmwareUpdateState.completed) @pyqtProperty(float, notify = firmwareProgressChanged) def firmwareProgress(self) -> float: @@ -63,7 +71,7 @@ class FirmwareUpdater(QObject): def firmwareUpdateState(self) -> "FirmwareUpdateState": return self._firmware_update_state - def setFirmwareUpdateState(self, state) -> None: + def _setFirmwareUpdateState(self, state) -> None: if self._firmware_update_state != state: self._firmware_update_state = state self.firmwareUpdateStateChanged.emit() diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py index ab71f70e30..505e1ddb7e 100644 --- a/plugins/USBPrinting/AvrFirmwareUpdater.py +++ b/plugins/USBPrinting/AvrFirmwareUpdater.py @@ -22,39 +22,43 @@ class AvrFirmwareUpdater(FirmwareUpdater): assert len(hex_file) > 0 except (FileNotFoundError, AssertionError): Logger.log("e", "Unable to read provided hex file. Could not update firmware.") - self.setFirmwareUpdateState(FirmwareUpdateState.firmware_not_found_error) + self._setFirmwareUpdateState(FirmwareUpdateState.firmware_not_found_error) return programmer = stk500v2.Stk500v2() programmer.progress_callback = self._onFirmwareProgress + # Ensure that other connections are closed. + if self._output_device.isConnected(): + self._output_device.close() + try: - programmer.connect(self._serial_port) + programmer.connect(self._output_device._serial_port) except: programmer.close() Logger.logException("e", "Failed to update firmware") - self.setFirmwareUpdateState(FirmwareUpdateState.communication_error) + self._setFirmwareUpdateState(FirmwareUpdateState.communication_error) return # Give programmer some time to connect. Might need more in some cases, but this worked in all tested cases. sleep(1) if not programmer.isConnected(): Logger.log("e", "Unable to connect with serial. Could not update firmware") - self.setFirmwareUpdateState(FirmwareUpdateState.communication_error) + self._setFirmwareUpdateState(FirmwareUpdateState.communication_error) try: programmer.programChip(hex_file) except SerialException as e: Logger.log("e", "A serial port exception occured during firmware update: %s" % e) - self.setFirmwareUpdateState(FirmwareUpdateState.io_error) + self._setFirmwareUpdateState(FirmwareUpdateState.io_error) return except Exception as e: Logger.log("e", "An unknown exception occured during firmware update: %s" % e) - self.setFirmwareUpdateState(FirmwareUpdateState.unknown_error) + self._setFirmwareUpdateState(FirmwareUpdateState.unknown_error) return programmer.close() # Try to re-connect with the machine again, which must be done on the Qt thread, so we use call later. - CuraApplication.getInstance().callLater(self.connect) + CuraApplication.getInstance().callLater(self._output_device.connect) - self.cleanupAfterUpdate() + self._cleanupAfterUpdate() From b4e186ce789c920ab4a1387910ea4a89ad3ce843 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 2 Oct 2018 17:14:22 +0200 Subject: [PATCH 133/212] Disable close button while updating firmware --- resources/qml/FirmwareUpdateWindow.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/FirmwareUpdateWindow.qml b/resources/qml/FirmwareUpdateWindow.qml index e0f9de314e..c71d70fc97 100644 --- a/resources/qml/FirmwareUpdateWindow.qml +++ b/resources/qml/FirmwareUpdateWindow.qml @@ -82,7 +82,7 @@ UM.Dialog Button { text: catalog.i18nc("@action:button","Close"); - enabled: manager.firmwareUpdateCompleteStatus; + enabled: manager.firmwareUpdateState != 1; onClicked: base.visible = false; } ] From afccd38a5d26dcfa6556a1c3319ea912d0974b60 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 2 Oct 2018 17:48:25 +0200 Subject: [PATCH 134/212] Add preposition to be consistent with other strings. Contributes to CURA-5741. --- resources/i18n/pt_BR/cura.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/pt_BR/cura.po b/resources/i18n/pt_BR/cura.po index 1ff220941e..c6cc088249 100644 --- a/resources/i18n/pt_BR/cura.po +++ b/resources/i18n/pt_BR/cura.po @@ -4794,7 +4794,7 @@ msgstr "Atualiza configurações do Cura 3.4 para o Cura 3.5" #: VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" msgid "Version Upgrade 3.4 to 3.5" -msgstr "Atualização de Versão 3.4 para 3.5" +msgstr "Atualização de Versão de 3.4 para 3.5" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" From 718ac0a30731dec368422b5d230945ee09f5595e Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 3 Oct 2018 09:17:51 +0200 Subject: [PATCH 135/212] Create firmware update progress window from QML --- cura/PrinterOutput/FirmwareUpdater.py | 27 +---- cura/PrinterOutputDevice.py | 7 +- .../UpgradeFirmwareMachineAction.py | 43 ++++++- .../UpgradeFirmwareMachineAction.qml | 107 ++++++++++++++++-- resources/qml/FirmwareUpdateWindow.qml | 89 --------------- 5 files changed, 151 insertions(+), 122 deletions(-) delete mode 100644 resources/qml/FirmwareUpdateWindow.qml diff --git a/cura/PrinterOutput/FirmwareUpdater.py b/cura/PrinterOutput/FirmwareUpdater.py index 88169b1d75..92e92437ad 100644 --- a/cura/PrinterOutput/FirmwareUpdater.py +++ b/cura/PrinterOutput/FirmwareUpdater.py @@ -3,26 +3,25 @@ from PyQt5.QtCore import QObject, QUrl, pyqtSignal, pyqtProperty -from UM.Resources import Resources -from cura.PrinterOutputDevice import PrinterOutputDevice -from cura.CuraApplication import CuraApplication - from enum import IntEnum from threading import Thread from typing import Union +MYPY = False +if MYPY: + from cura.PrinterOutputDevice import PrinterOutputDevice + class FirmwareUpdater(QObject): firmwareProgressChanged = pyqtSignal() firmwareUpdateStateChanged = pyqtSignal() - def __init__(self, output_device: PrinterOutputDevice) -> None: + def __init__(self, output_device: "PrinterOutputDevice") -> None: super().__init__() self._output_device = output_device self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) - self._firmware_view = None self._firmware_location = "" self._firmware_progress = 0 self._firmware_update_state = FirmwareUpdateState.idle @@ -33,7 +32,7 @@ class FirmwareUpdater(QObject): self._firmware_location = QUrl(file).toLocalFile() else: self._firmware_location = file - self._showFirmwareInterface() + self._setFirmwareUpdateState(FirmwareUpdateState.updating) self._update_firmware_thread.start() @@ -41,20 +40,6 @@ class FirmwareUpdater(QObject): def _updateFirmware(self) -> None: raise NotImplementedError("_updateFirmware needs to be implemented") - ## Show firmware interface. - # This will create the view if its not already created. - def _showFirmwareInterface(self) -> None: - if self._firmware_view is None: - path = Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "FirmwareUpdateWindow.qml") - self._firmware_view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) - - if not self._firmware_view: - return - - self._onFirmwareProgress(0) - self._setFirmwareUpdateState(FirmwareUpdateState.idle) - self._firmware_view.show() - ## Cleanup after a succesful update def _cleanupAfterUpdate(self) -> None: # Clean up for next attempt. diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 5ea65adb8e..c63f9c35b5 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -20,6 +20,7 @@ MYPY = False if MYPY: from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.ConfigurationModel import ConfigurationModel + from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdater i18n_catalog = i18nCatalog("cura") @@ -83,6 +84,7 @@ class PrinterOutputDevice(QObject, OutputDevice): self._connection_state = ConnectionState.closed #type: ConnectionState + self._firmware_updater = None #type: Optional[FirmwareUpdater] self._firmware_name = None #type: Optional[str] self._address = "" #type: str self._connection_text = "" #type: str @@ -225,4 +227,7 @@ class PrinterOutputDevice(QObject, OutputDevice): # # This name can be used to define device type def getFirmwareName(self) -> Optional[str]: - return self._firmware_name \ No newline at end of file + return self._firmware_name + + def getFirmwareUpdater(self) -> Optional["FirmwareUpdater"]: + return self._firmware_updater \ No newline at end of file diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py index 1f0e640f04..671ed22d5a 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py @@ -1,19 +1,58 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + from UM.Application import Application from UM.Settings.DefinitionContainer import DefinitionContainer from cura.MachineAction import MachineAction from UM.i18n import i18nCatalog from UM.Settings.ContainerRegistry import ContainerRegistry +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject +from typing import Optional + +MYPY = False +if MYPY: + from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdater + catalog = i18nCatalog("cura") ## Upgrade the firmware of a machine by USB with this action. class UpgradeFirmwareMachineAction(MachineAction): - def __init__(self): + def __init__(self) -> None: super().__init__("UpgradeFirmware", catalog.i18nc("@action", "Upgrade Firmware")) self._qml_url = "UpgradeFirmwareMachineAction.qml" ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) - def _onContainerAdded(self, container): + self._active_output_device = None + + Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) + + def _onEngineCreated(self) -> None: + Application.getInstance().getMachineManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) + + def _onContainerAdded(self, container) -> None: # Add this action as a supported action to all machine definitions if they support USB connection if isinstance(container, DefinitionContainer) and container.getMetaDataEntry("type") == "machine" and container.getMetaDataEntry("supports_usb_connection"): Application.getInstance().getMachineActionManager().addSupportedAction(container.getId(), self.getKey()) + + def _onOutputDevicesChanged(self) -> None: + if self._active_output_device: + self._active_output_device.activePrinter.getController().canUpdateFirmwareChanged.disconnect(self._onControllerCanUpdateFirmwareChanged) + output_devices = Application.getInstance().getMachineManager().printerOutputDevices + print(output_devices) + self._active_output_device = output_devices[0] if output_devices else None + if self._active_output_device: + self._active_output_device.activePrinter.getController().canUpdateFirmwareChanged.connect(self._onControllerCanUpdateFirmwareChanged) + + self.outputDeviceCanUpdateFirmwareChanged.emit() + + def _onControllerCanUpdateFirmwareChanged(self) -> None: + self.outputDeviceCanUpdateFirmwareChanged.emit() + + outputDeviceCanUpdateFirmwareChanged = pyqtSignal() + @pyqtProperty(QObject, notify = outputDeviceCanUpdateFirmwareChanged) + def firmwareUpdater(self) -> Optional["firmwareUpdater"]: + if self._active_output_device and self._active_output_device.activePrinter.getController().can_update_firmware: + return self._active_output_device.getFirmwareUpdater() + + return None \ No newline at end of file diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml index 1d0aabcae3..1c1f39edd0 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Ultimaker B.V. +// Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -59,7 +59,8 @@ Cura.MachineAction enabled: parent.firmwareName != "" && canUpdateFirmware onClicked: { - activeOutputDevice.updateFirmware(parent.firmwareName) + firmwareUpdateWindow.visible = true; + activeOutputDevice.updateFirmware(parent.firmwareName); } } Button @@ -78,7 +79,7 @@ Cura.MachineAction { width: parent.width wrapMode: Text.WordWrap - visible: !printerConnected + visible: !printerConnected && !firmwareUpdateWindow.visible text: catalog.i18nc("@label", "Firmware can not be upgraded because there is no connection with the printer."); } @@ -89,14 +90,102 @@ Cura.MachineAction visible: printerConnected && !canUpdateFirmware text: catalog.i18nc("@label", "Firmware can not be upgraded because the connection with the printer does not support upgrading firmware."); } + } - FileDialog + FileDialog + { + id: customFirmwareDialog + title: catalog.i18nc("@title:window", "Select custom firmware") + nameFilters: "Firmware image files (*.hex)" + selectExisting: true + onAccepted: { - id: customFirmwareDialog - title: catalog.i18nc("@title:window", "Select custom firmware") - nameFilters: "Firmware image files (*.hex)" - selectExisting: true - onAccepted: activeOutputDevice.updateFirmware(fileUrl) + firmwareUpdateWindow.visible = true; + activeOutputDevice.updateFirmware(fileUrl); } } + + UM.Dialog + { + id: firmwareUpdateWindow + + width: minimumWidth + minimumWidth: 500 * screenScaleFactor + height: minimumHeight + minimumHeight: 100 * screenScaleFactor + + modality: Qt.ApplicationModal + + title: catalog.i18nc("@title:window","Firmware Update") + + Column + { + anchors.fill: parent + + Label + { + anchors + { + left: parent.left + right: parent.right + } + + text: { + if(manager.firmwareUpdater == null) + { + return ""; + } + switch (manager.firmwareUpdater.firmwareUpdateState) + { + case 0: + return ""; //Not doing anything (eg; idling) + case 1: + return catalog.i18nc("@label","Updating firmware."); + case 2: + return catalog.i18nc("@label","Firmware update completed."); + case 3: + return catalog.i18nc("@label","Firmware update failed due to an unknown error."); + case 4: + return catalog.i18nc("@label","Firmware update failed due to an communication error."); + case 5: + return catalog.i18nc("@label","Firmware update failed due to an input/output error."); + case 6: + return catalog.i18nc("@label","Firmware update failed due to missing firmware."); + } + } + + wrapMode: Text.Wrap + } + + ProgressBar + { + id: prog + value: (manager.firmwareUpdater != null) ? manager.firmwareUpdater.firmwareProgress : 0 + minimumValue: 0 + maximumValue: 100 + indeterminate: + { + if(manager.firmwareUpdater == null) + { + return false; + } + return manager.firmwareUpdater.firmwareProgress < 1 && manager.firmwareUpdater.firmwareProgress > 0; + } + anchors + { + left: parent.left; + right: parent.right; + } + } + } + + rightButtons: [ + Button + { + text: catalog.i18nc("@action:button","Close"); + enabled: (manager.firmwareUpdater != null) ? manager.firmwareUpdater.firmwareUpdateState != 1 : true; + onClicked: firmwareUpdateWindow.visible = false; + } + ] + } } \ No newline at end of file diff --git a/resources/qml/FirmwareUpdateWindow.qml b/resources/qml/FirmwareUpdateWindow.qml deleted file mode 100644 index c71d70fc97..0000000000 --- a/resources/qml/FirmwareUpdateWindow.qml +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) 2017 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.2 -import QtQuick.Window 2.2 -import QtQuick.Controls 1.2 - -import UM 1.1 as UM - -UM.Dialog -{ - id: base; - - width: minimumWidth; - minimumWidth: 500 * screenScaleFactor; - height: minimumHeight; - minimumHeight: 100 * screenScaleFactor; - - visible: true; - modality: Qt.ApplicationModal; - - title: catalog.i18nc("@title:window","Firmware Update"); - - Column - { - anchors.fill: parent; - - Label - { - anchors - { - left: parent.left; - right: parent.right; - } - - text: { - switch (manager.firmwareUpdateState) - { - case 0: - return "" //Not doing anything (eg; idling) - case 1: - return catalog.i18nc("@label","Updating firmware.") - case 2: - return catalog.i18nc("@label","Firmware update completed.") - case 3: - return catalog.i18nc("@label","Firmware update failed due to an unknown error.") - case 4: - return catalog.i18nc("@label","Firmware update failed due to an communication error.") - case 5: - return catalog.i18nc("@label","Firmware update failed due to an input/output error.") - case 6: - return catalog.i18nc("@label","Firmware update failed due to missing firmware.") - } - } - - wrapMode: Text.Wrap; - } - - ProgressBar - { - id: prog - value: manager.firmwareProgress - minimumValue: 0 - maximumValue: 100 - indeterminate: manager.firmwareProgress < 1 && manager.firmwareProgress > 0 - anchors - { - left: parent.left; - right: parent.right; - } - } - - SystemPalette - { - id: palette; - } - - UM.I18nCatalog { id: catalog; name: "cura"; } - } - - rightButtons: [ - Button - { - text: catalog.i18nc("@action:button","Close"); - enabled: manager.firmwareUpdateState != 1; - onClicked: base.visible = false; - } - ] -} From 51e7b6c3880d677ef7e4d041c9825cc2486d1d67 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 3 Oct 2018 10:30:48 +0200 Subject: [PATCH 136/212] Change font style for active material in preferences CURA-5747 --- resources/qml/Preferences/Materials/MaterialsSlot.qml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/resources/qml/Preferences/Materials/MaterialsSlot.qml b/resources/qml/Preferences/Materials/MaterialsSlot.qml index a474b52838..c75c34b81a 100644 --- a/resources/qml/Preferences/Materials/MaterialsSlot.qml +++ b/resources/qml/Preferences/Materials/MaterialsSlot.qml @@ -41,6 +41,15 @@ Rectangle anchors.left: swatch.right anchors.verticalCenter: materialSlot.verticalCenter anchors.leftMargin: UM.Theme.getSize("narrow_margin").width + font.italic: + { + var selected_material = Cura.MachineManager.currentRootMaterialId[Cura.ExtruderManager.activeExtruderIndex] + if(selected_material == material.root_material_id) + { + return true + } + return false + } } MouseArea { From 6db1342255493c264694074fc3dc7f423038e840 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 3 Oct 2018 10:44:20 +0200 Subject: [PATCH 137/212] Fix the layer view when there is a print job with only one layer. Contributes to CURA-5789. --- plugins/SimulationView/LayerSlider.qml | 10 ++++++++++ plugins/SimulationView/SimulationView.py | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/plugins/SimulationView/LayerSlider.qml b/plugins/SimulationView/LayerSlider.qml index 841472a836..1552506969 100644 --- a/plugins/SimulationView/LayerSlider.qml +++ b/plugins/SimulationView/LayerSlider.qml @@ -234,6 +234,11 @@ Item UM.SimulationView.setCurrentLayer(value) var diff = (value - sliderRoot.maximumValue) / (sliderRoot.minimumValue - sliderRoot.maximumValue) + // In case there is only one layer, the diff value results in a NaN, so this is for catching this specific case + if (isNaN(diff)) + { + diff = 0 + } var newUpperYPosition = Math.round(diff * (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize))) y = newUpperYPosition @@ -339,6 +344,11 @@ Item UM.SimulationView.setMinimumLayer(value) var diff = (value - sliderRoot.maximumValue) / (sliderRoot.minimumValue - sliderRoot.maximumValue) + // In case there is only one layer, the diff value results in a NaN, so this is for catching this specific case + if (isNaN(diff)) + { + diff = 0 + } var newLowerYPosition = Math.round((sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize) + diff * (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize))) y = newLowerYPosition diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 44643dbf1c..5b369c26d2 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -334,7 +334,7 @@ class SimulationView(View): self._old_max_layers = self._max_layers ## Recalculate num max layers - new_max_layers = 0 + new_max_layers = -1 for node in DepthFirstIterator(scene.getRoot()): layer_data = node.callDecoration("getLayerData") if not layer_data: @@ -369,7 +369,7 @@ class SimulationView(View): if new_max_layers < layer_count: new_max_layers = layer_count - if new_max_layers > 0 and new_max_layers != self._old_max_layers: + if new_max_layers >= 0 and new_max_layers != self._old_max_layers: self._max_layers = new_max_layers # The qt slider has a bit of weird behavior that if the maxvalue needs to be changed first From c3e7e426ffc4bbe44081f05f1289c01785540a4a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 3 Oct 2018 11:21:03 +0200 Subject: [PATCH 138/212] Fix getDefaultVariantNode for UM2 CURA-5790 UM2 has optional variant which depends on whether Olsson Block is enabled. getDefaultVariantNode() should take that into account. --- cura/Machines/VariantManager.py | 17 ++++++++++++----- cura/Settings/CuraStackBuilder.py | 3 ++- resources/definitions/ultimaker2.def.json | 1 + 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/cura/Machines/VariantManager.py b/cura/Machines/VariantManager.py index 969fed670e..0d497de51e 100644 --- a/cura/Machines/VariantManager.py +++ b/cura/Machines/VariantManager.py @@ -115,17 +115,24 @@ class VariantManager: # # Gets the default variant for the given machine definition. + # If the optional GlobalStack is given, the metadata information will be fetched from the GlobalStack instead of + # the DefinitionContainer. Because for machines such as UM2, you can enable Olsson Block, which will set + # "has_variants" to True in the GlobalStack. In those cases, we need to fetch metadata from the GlobalStack or + # it may not be correct. # def getDefaultVariantNode(self, machine_definition: "DefinitionContainer", - variant_type: VariantType) -> Optional["ContainerNode"]: + variant_type: "VariantType", + global_stack: Optional["GlobalStack"] = None) -> Optional["ContainerNode"]: machine_definition_id = machine_definition.getId() + container_for_metadata_fetching = global_stack if global_stack is not None else machine_definition + preferred_variant_name = None if variant_type == VariantType.BUILD_PLATE: - if parseBool(machine_definition.getMetaDataEntry("has_variant_buildplates", False)): - preferred_variant_name = machine_definition.getMetaDataEntry("preferred_variant_buildplate_name") + if parseBool(container_for_metadata_fetching.getMetaDataEntry("has_variant_buildplates", False)): + preferred_variant_name = container_for_metadata_fetching.getMetaDataEntry("preferred_variant_buildplate_name") else: - if parseBool(machine_definition.getMetaDataEntry("has_variants", False)): - preferred_variant_name = machine_definition.getMetaDataEntry("preferred_variant_name") + if parseBool(container_for_metadata_fetching.getMetaDataEntry("has_variants", False)): + preferred_variant_name = container_for_metadata_fetching.getMetaDataEntry("preferred_variant_name") node = None if preferred_variant_name: diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 6374e6056c..58109d3a8d 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -114,7 +114,8 @@ class CuraStackBuilder: # get variant container for extruders extruder_variant_container = application.empty_variant_container - extruder_variant_node = variant_manager.getDefaultVariantNode(global_stack.definition, VariantType.NOZZLE) + extruder_variant_node = variant_manager.getDefaultVariantNode(global_stack.definition, VariantType.NOZZLE, + global_stack = global_stack) extruder_variant_name = None if extruder_variant_node: extruder_variant_container = extruder_variant_node.getContainer() diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index aa684946c2..a91d2332b0 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -14,6 +14,7 @@ "platform_offset": [9, 0, 0], "has_materials": false, "has_machine_quality": true, + "preferred_variant_name": "0.4 mm", "exclude_materials": ["generic_hips", "generic_petg", "generic_bam", "ultimaker_bam", "generic_pva", "ultimaker_pva", "generic_tough_pla", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white"], "first_start_actions": ["UM2UpgradeSelection"], "supported_actions":["UM2UpgradeSelection", "UpgradeFirmware"], From 959f698b038a189238c59eff69035a446382d74a Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 3 Oct 2018 13:23:37 +0200 Subject: [PATCH 139/212] Update date format CURA-5762 --- plugins/Toolbox/resources/qml/ToolboxDetailPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml b/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml index cba55051f5..e9aaf39226 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml @@ -126,7 +126,7 @@ Item return "" } var date = new Date(details.last_updated) - return date.toLocaleString(UM.Preferences.getValue("general/language")) + return date.toLocaleDateString(UM.Preferences.getValue("general/language")) } font: UM.Theme.getFont("very_small") color: UM.Theme.getColor("text") From f3fdb46dbaa37a515f31a322df75f1999726efda Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Oct 2018 13:33:30 +0200 Subject: [PATCH 140/212] Add missing types --- cura/CuraApplication.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index b40b65358b..eb5abf79d6 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -4,7 +4,7 @@ import os import sys import time -from typing import cast, TYPE_CHECKING +from typing import cast, TYPE_CHECKING, Optional import numpy @@ -175,7 +175,7 @@ class CuraApplication(QtApplication): self._single_instance = None - self._cura_formula_functions = None + self._cura_formula_functions = None # type: Optional[CuraFormulaFunctions] self._cura_package_manager = None @@ -810,6 +810,8 @@ class CuraApplication(QtApplication): return self._setting_visibility_presets_model def getCuraFormulaFunctions(self, *args) -> "CuraFormulaFunctions": + if self._cura_formula_functions is None: + self._cura_formula_functions = CuraFormulaFunctions(self) return self._cura_formula_functions def getMachineErrorChecker(self, *args) -> MachineErrorChecker: From cf3d7df8a6998c9982b1a2a1e5136898c96e0b2e Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 3 Oct 2018 13:59:46 +0200 Subject: [PATCH 141/212] Fix showing progress --- .../UpgradeFirmwareMachineAction.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py index 671ed22d5a..478ea9b6bb 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py @@ -6,6 +6,7 @@ from UM.Settings.DefinitionContainer import DefinitionContainer from cura.MachineAction import MachineAction from UM.i18n import i18nCatalog from UM.Settings.ContainerRegistry import ContainerRegistry +from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdateState from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject from typing import Optional @@ -13,6 +14,7 @@ from typing import Optional MYPY = False if MYPY: from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdater + from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice catalog = i18nCatalog("cura") @@ -23,7 +25,8 @@ class UpgradeFirmwareMachineAction(MachineAction): self._qml_url = "UpgradeFirmwareMachineAction.qml" ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) - self._active_output_device = None + self._active_output_device = None #type: Optional[PrinterOutputDevice] + self._active_firmware_updater = None #type: Optional[FirmwareUpdater] Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) @@ -38,9 +41,10 @@ class UpgradeFirmwareMachineAction(MachineAction): def _onOutputDevicesChanged(self) -> None: if self._active_output_device: self._active_output_device.activePrinter.getController().canUpdateFirmwareChanged.disconnect(self._onControllerCanUpdateFirmwareChanged) + output_devices = Application.getInstance().getMachineManager().printerOutputDevices - print(output_devices) self._active_output_device = output_devices[0] if output_devices else None + if self._active_output_device: self._active_output_device.activePrinter.getController().canUpdateFirmwareChanged.connect(self._onControllerCanUpdateFirmwareChanged) @@ -53,6 +57,12 @@ class UpgradeFirmwareMachineAction(MachineAction): @pyqtProperty(QObject, notify = outputDeviceCanUpdateFirmwareChanged) def firmwareUpdater(self) -> Optional["firmwareUpdater"]: if self._active_output_device and self._active_output_device.activePrinter.getController().can_update_firmware: - return self._active_output_device.getFirmwareUpdater() + self._active_firmware_updater = self._active_output_device.getFirmwareUpdater() + return self._active_firmware_updater - return None \ No newline at end of file + elif self._active_firmware_updater and self._active_firmware_updater.firmwareUpdateState not in [FirmwareUpdateState.idle, FirmwareUpdateState.completed]: + # During a firmware update, the PrinterOutputDevice is disconnected but the FirmwareUpdater is still there + return self._active_firmware_updater + + self._active_firmware_updater = None + return None From 254106bb264699174a8edcfc20e50e22c455ef32 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 3 Oct 2018 15:37:52 +0200 Subject: [PATCH 142/212] Format date strings to ISO YYYY/MM/DD in Toolbox CURA-5762 --- .../Toolbox/resources/qml/ToolboxDetailPage.qml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml b/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml index e9aaf39226..af08bbe288 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml @@ -125,11 +125,22 @@ Item { return "" } - var date = new Date(details.last_updated) - return date.toLocaleDateString(UM.Preferences.getValue("general/language")) + var date = new Date(details.last_updated); + var date_text = formatDateToISOString(date); + return date_text; } font: UM.Theme.getFont("very_small") color: UM.Theme.getColor("text") + + function formatDateToISOString(date) { + var day = String(date.getDate()); + day = (day.length < 2) ? "0" + day : day; + var month = String(date.getMonth()); + month = (month.length < 2) ? "0" + month : month; + var year = String(date.getFullYear()); + + return year + '/' + month + '/' + day; + } } Label { From 2e529452ddf9e8068b819438e0fd51cf1b9194fc Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Oct 2018 15:58:16 +0200 Subject: [PATCH 143/212] Moved the actual adding of containers by script to initialize This ensures that when loading scripts (and checking they are valid) we don't start adding unneeded containers --- plugins/PostProcessingPlugin/PostProcessingPlugin.py | 2 ++ plugins/PostProcessingPlugin/Script.py | 9 +++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.py b/plugins/PostProcessingPlugin/PostProcessingPlugin.py index b28a028325..78aa690106 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.py +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.py @@ -189,6 +189,7 @@ class PostProcessingPlugin(QObject, Extension): def addScriptToList(self, key): Logger.log("d", "Adding script %s to list.", key) new_script = self._loaded_scripts[key]() + new_script.initialize() self._script_list.append(new_script) self.setSelectedScriptIndex(len(self._script_list) - 1) self.scriptListChanged.emit() @@ -220,6 +221,7 @@ class PostProcessingPlugin(QObject, Extension): Logger.log("e", "Unknown post-processing script {script_name} was encountered in this global stack.".format(script_name = script_name)) continue new_script = self._loaded_scripts[script_name]() + new_script.initialize() for setting_key, setting_value in settings.items(): #Put all setting values into the script. new_script._instance.setProperty(setting_key, "value", setting_value) self._script_list.append(new_script) diff --git a/plugins/PostProcessingPlugin/Script.py b/plugins/PostProcessingPlugin/Script.py index 7e430a5c78..b5211401c1 100644 --- a/plugins/PostProcessingPlugin/Script.py +++ b/plugins/PostProcessingPlugin/Script.py @@ -26,14 +26,14 @@ class Script: self._settings = None self._stack = None + def initialize(self): setting_data = self.getSettingData() - self._stack = ContainerStack(stack_id = str(id(self))) + self._stack = ContainerStack(stack_id=str(id(self))) self._stack.setDirty(False) # This stack does not need to be saved. - ## Check if the definition of this script already exists. If not, add it to the registry. if "key" in setting_data: - definitions = ContainerRegistry.getInstance().findDefinitionContainers(id = setting_data["key"]) + definitions = ContainerRegistry.getInstance().findDefinitionContainers(id=setting_data["key"]) if definitions: # Definition was found self._definition = definitions[0] @@ -48,7 +48,8 @@ class Script: self._stack.addContainer(self._definition) self._instance = InstanceContainer(container_id="ScriptInstanceContainer") self._instance.setDefinition(self._definition.getId()) - self._instance.setMetaDataEntry("setting_version", self._definition.getMetaDataEntry("setting_version", default = 0)) + self._instance.setMetaDataEntry("setting_version", + self._definition.getMetaDataEntry("setting_version", default=0)) self._stack.addContainer(self._instance) self._stack.propertyChanged.connect(self._onPropertyChanged) From e3721fe539cc2f94ca45270c909cc1ebb3c78a4d Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 3 Oct 2018 16:27:13 +0200 Subject: [PATCH 144/212] Revert "Format date strings to ISO YYYY/MM/DD in Toolbox" This reverts commit 254106bb264699174a8edcfc20e50e22c455ef32. --- .../Toolbox/resources/qml/ToolboxDetailPage.qml | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml b/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml index af08bbe288..e9aaf39226 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml @@ -125,22 +125,11 @@ Item { return "" } - var date = new Date(details.last_updated); - var date_text = formatDateToISOString(date); - return date_text; + var date = new Date(details.last_updated) + return date.toLocaleDateString(UM.Preferences.getValue("general/language")) } font: UM.Theme.getFont("very_small") color: UM.Theme.getColor("text") - - function formatDateToISOString(date) { - var day = String(date.getDate()); - day = (day.length < 2) ? "0" + day : day; - var month = String(date.getMonth()); - month = (month.length < 2) ? "0" + month : month; - var year = String(date.getFullYear()); - - return year + '/' + month + '/' + day; - } } Label { From a4e02a6eaef9018ab714c7d8d2190252d325790a Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 3 Oct 2018 16:27:30 +0200 Subject: [PATCH 145/212] Revert "Update date format" This reverts commit 959f698b038a189238c59eff69035a446382d74a. --- plugins/Toolbox/resources/qml/ToolboxDetailPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml b/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml index e9aaf39226..cba55051f5 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml @@ -126,7 +126,7 @@ Item return "" } var date = new Date(details.last_updated) - return date.toLocaleDateString(UM.Preferences.getValue("general/language")) + return date.toLocaleString(UM.Preferences.getValue("general/language")) } font: UM.Theme.getFont("very_small") color: UM.Theme.getColor("text") From adf8285d20d4fd7236e1ab8835f2c7bd2ef1ed34 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Oct 2018 16:36:58 +0200 Subject: [PATCH 146/212] Typing fixes Since I was stupid enough to touch it, I was also forced to boyscout the code. --- .../PostProcessingPlugin.py | 141 ++++++++++-------- plugins/PostProcessingPlugin/Script.py | 54 ++++--- 2 files changed, 115 insertions(+), 80 deletions(-) diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.py b/plugins/PostProcessingPlugin/PostProcessingPlugin.py index 78aa690106..1a1ea92d10 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.py +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.py @@ -2,6 +2,7 @@ # The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal, pyqtSlot +from typing import Dict, Type, TYPE_CHECKING, List, Optional, cast from UM.PluginRegistry import PluginRegistry from UM.Resources import Resources @@ -9,55 +10,62 @@ from UM.Application import Application from UM.Extension import Extension from UM.Logger import Logger -import configparser #The script lists are stored in metadata as serialised config files. -import io #To allow configparser to write to a string. +import configparser # The script lists are stored in metadata as serialised config files. +import io # To allow configparser to write to a string. import os.path import pkgutil import sys import importlib.util from UM.i18n import i18nCatalog +from cura.CuraApplication import CuraApplication + i18n_catalog = i18nCatalog("cura") +if TYPE_CHECKING: + from .Script import Script + ## The post processing plugin is an Extension type plugin that enables pre-written scripts to post process generated # g-code files. class PostProcessingPlugin(QObject, Extension): - def __init__(self, parent = None): - super().__init__(parent) + def __init__(self, parent = None) -> None: + QObject.__init__(self, parent) + Extension.__init__(self) self.addMenuItem(i18n_catalog.i18n("Modify G-Code"), self.showPopup) self._view = None # Loaded scripts are all scripts that can be used - self._loaded_scripts = {} - self._script_labels = {} + self._loaded_scripts = {} # type: Dict[str, Type[Script]] + self._script_labels = {} # type: Dict[str, str] # Script list contains instances of scripts in loaded_scripts. # There can be duplicates, which will be executed in sequence. - self._script_list = [] + self._script_list = [] # type: List[Script] self._selected_script_index = -1 Application.getInstance().getOutputDeviceManager().writeStarted.connect(self.execute) - Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged) #When the current printer changes, update the list of scripts. - Application.getInstance().mainWindowChanged.connect(self._createView) #When the main window is created, create the view so that we can display the post-processing icon if necessary. + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged) # When the current printer changes, update the list of scripts. + CuraApplication.getInstance().mainWindowChanged.connect(self._createView) # When the main window is created, create the view so that we can display the post-processing icon if necessary. selectedIndexChanged = pyqtSignal() - @pyqtProperty("QVariant", notify = selectedIndexChanged) - def selectedScriptDefinitionId(self): + + @pyqtProperty(str, notify = selectedIndexChanged) + def selectedScriptDefinitionId(self) -> Optional[str]: try: return self._script_list[self._selected_script_index].getDefinitionId() except: return "" - @pyqtProperty("QVariant", notify=selectedIndexChanged) - def selectedScriptStackId(self): + @pyqtProperty(str, notify=selectedIndexChanged) + def selectedScriptStackId(self) -> Optional[str]: try: return self._script_list[self._selected_script_index].getStackId() except: return "" ## Execute all post-processing scripts on the gcode. - def execute(self, output_device): + def execute(self, output_device) -> None: scene = Application.getInstance().getController().getScene() # If the scene does not have a gcode, do nothing if not hasattr(scene, "gcode_dict"): @@ -67,7 +75,7 @@ class PostProcessingPlugin(QObject, Extension): return # get gcode list for the active build plate - active_build_plate_id = Application.getInstance().getMultiBuildPlateModel().activeBuildPlate + active_build_plate_id = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate gcode_list = gcode_dict[active_build_plate_id] if not gcode_list: return @@ -86,16 +94,17 @@ class PostProcessingPlugin(QObject, Extension): Logger.log("e", "Already post processed") @pyqtSlot(int) - def setSelectedScriptIndex(self, index): - self._selected_script_index = index - self.selectedIndexChanged.emit() + def setSelectedScriptIndex(self, index: int) -> None: + if self._selected_script_index != index: + self._selected_script_index = index + self.selectedIndexChanged.emit() @pyqtProperty(int, notify = selectedIndexChanged) - def selectedScriptIndex(self): + def selectedScriptIndex(self) -> int: return self._selected_script_index @pyqtSlot(int, int) - def moveScript(self, index, new_index): + def moveScript(self, index: int, new_index: int) -> None: if new_index < 0 or new_index > len(self._script_list) - 1: return # nothing needs to be done else: @@ -107,7 +116,7 @@ class PostProcessingPlugin(QObject, Extension): ## Remove a script from the active script list by index. @pyqtSlot(int) - def removeScriptByIndex(self, index): + def removeScriptByIndex(self, index: int) -> None: self._script_list.pop(index) if len(self._script_list) - 1 < self._selected_script_index: self._selected_script_index = len(self._script_list) - 1 @@ -118,14 +127,16 @@ class PostProcessingPlugin(QObject, Extension): ## Load all scripts from all paths where scripts can be found. # # This should probably only be done on init. - def loadAllScripts(self): - if self._loaded_scripts: #Already loaded. + def loadAllScripts(self) -> None: + if self._loaded_scripts: # Already loaded. return - #The PostProcessingPlugin path is for built-in scripts. - #The Resources path is where the user should store custom scripts. - #The Preferences path is legacy, where the user may previously have stored scripts. + # The PostProcessingPlugin path is for built-in scripts. + # The Resources path is where the user should store custom scripts. + # The Preferences path is legacy, where the user may previously have stored scripts. for root in [PluginRegistry.getInstance().getPluginPath("PostProcessingPlugin"), Resources.getStoragePath(Resources.Resources), Resources.getStoragePath(Resources.Preferences)]: + if root is None: + continue path = os.path.join(root, "scripts") if not os.path.isdir(path): try: @@ -139,7 +150,7 @@ class PostProcessingPlugin(QObject, Extension): ## Load all scripts from provided path. # This should probably only be done on init. # \param path Path to check for scripts. - def loadScripts(self, path): + def loadScripts(self, path: str) -> None: ## Load all scripts in the scripts folders scripts = pkgutil.iter_modules(path = [path]) for loader, script_name, ispkg in scripts: @@ -148,6 +159,8 @@ class PostProcessingPlugin(QObject, Extension): try: spec = importlib.util.spec_from_file_location(__name__ + "." + script_name, os.path.join(path, script_name + ".py")) loaded_script = importlib.util.module_from_spec(spec) + if spec.loader is None: + continue spec.loader.exec_module(loaded_script) sys.modules[script_name] = loaded_script #TODO: This could be a security risk. Overwrite any module with a user-provided name? @@ -172,21 +185,21 @@ class PostProcessingPlugin(QObject, Extension): loadedScriptListChanged = pyqtSignal() @pyqtProperty("QVariantList", notify = loadedScriptListChanged) - def loadedScriptList(self): + def loadedScriptList(self) -> List[str]: return sorted(list(self._loaded_scripts.keys())) @pyqtSlot(str, result = str) - def getScriptLabelByKey(self, key): - return self._script_labels[key] + def getScriptLabelByKey(self, key: str) -> Optional[str]: + return self._script_labels.get(key) scriptListChanged = pyqtSignal() - @pyqtProperty("QVariantList", notify = scriptListChanged) - def scriptList(self): + @pyqtProperty("QStringList", notify = scriptListChanged) + def scriptList(self) -> List[str]: script_list = [script.getSettingData()["key"] for script in self._script_list] return script_list @pyqtSlot(str) - def addScriptToList(self, key): + def addScriptToList(self, key: str) -> None: Logger.log("d", "Adding script %s to list.", key) new_script = self._loaded_scripts[key]() new_script.initialize() @@ -197,82 +210,89 @@ class PostProcessingPlugin(QObject, Extension): ## When the global container stack is changed, swap out the list of active # scripts. - def _onGlobalContainerStackChanged(self): + def _onGlobalContainerStackChanged(self) -> None: self.loadAllScripts() new_stack = Application.getInstance().getGlobalContainerStack() + if new_stack is None: + return self._script_list.clear() - if not new_stack.getMetaDataEntry("post_processing_scripts"): #Missing or empty. - self.scriptListChanged.emit() #Even emit this if it didn't change. We want it to write the empty list to the stack's metadata. + if not new_stack.getMetaDataEntry("post_processing_scripts"): # Missing or empty. + self.scriptListChanged.emit() # Even emit this if it didn't change. We want it to write the empty list to the stack's metadata. return self._script_list.clear() scripts_list_strs = new_stack.getMetaDataEntry("post_processing_scripts") - for script_str in scripts_list_strs.split("\n"): #Encoded config files should never contain three newlines in a row. At most 2, just before section headers. - if not script_str: #There were no scripts in this one (or a corrupt file caused more than 3 consecutive newlines here). + for script_str in scripts_list_strs.split("\n"): # Encoded config files should never contain three newlines in a row. At most 2, just before section headers. + if not script_str: # There were no scripts in this one (or a corrupt file caused more than 3 consecutive newlines here). continue - script_str = script_str.replace(r"\\\n", "\n").replace(r"\\\\", "\\\\") #Unescape escape sequences. + script_str = script_str.replace(r"\\\n", "\n").replace(r"\\\\", "\\\\") # Unescape escape sequences. script_parser = configparser.ConfigParser(interpolation = None) - script_parser.optionxform = str #Don't transform the setting keys as they are case-sensitive. + script_parser.optionxform = str # type: ignore # Don't transform the setting keys as they are case-sensitive. script_parser.read_string(script_str) - for script_name, settings in script_parser.items(): #There should only be one, really! Otherwise we can't guarantee the order or allow multiple uses of the same script. - if script_name == "DEFAULT": #ConfigParser always has a DEFAULT section, but we don't fill it. Ignore this one. + for script_name, settings in script_parser.items(): # There should only be one, really! Otherwise we can't guarantee the order or allow multiple uses of the same script. + if script_name == "DEFAULT": # ConfigParser always has a DEFAULT section, but we don't fill it. Ignore this one. continue - if script_name not in self._loaded_scripts: #Don't know this post-processing plug-in. + if script_name not in self._loaded_scripts: # Don't know this post-processing plug-in. Logger.log("e", "Unknown post-processing script {script_name} was encountered in this global stack.".format(script_name = script_name)) continue new_script = self._loaded_scripts[script_name]() new_script.initialize() - for setting_key, setting_value in settings.items(): #Put all setting values into the script. - new_script._instance.setProperty(setting_key, "value", setting_value) + for setting_key, setting_value in settings.items(): # Put all setting values into the script. + if new_script._instance is not None: + new_script._instance.setProperty(setting_key, "value", setting_value) self._script_list.append(new_script) self.setSelectedScriptIndex(0) self.scriptListChanged.emit() @pyqtSlot() - def writeScriptsToStack(self): - script_list_strs = [] + def writeScriptsToStack(self) -> None: + script_list_strs = [] # type: List[str] for script in self._script_list: - parser = configparser.ConfigParser(interpolation = None) #We'll encode the script as a config with one section. The section header is the key and its values are the settings. - parser.optionxform = str #Don't transform the setting keys as they are case-sensitive. + parser = configparser.ConfigParser(interpolation = None) # We'll encode the script as a config with one section. The section header is the key and its values are the settings. + parser.optionxform = str # type: ignore # Don't transform the setting keys as they are case-sensitive. script_name = script.getSettingData()["key"] parser.add_section(script_name) for key in script.getSettingData()["settings"]: value = script.getSettingValueByKey(key) parser[script_name][key] = str(value) - serialized = io.StringIO() #ConfigParser can only write to streams. Fine. + serialized = io.StringIO() # ConfigParser can only write to streams. Fine. parser.write(serialized) serialized.seek(0) script_str = serialized.read() - script_str = script_str.replace("\\\\", r"\\\\").replace("\n", r"\\\n") #Escape newlines because configparser sees those as section delimiters. + script_str = script_str.replace("\\\\", r"\\\\").replace("\n", r"\\\n") # Escape newlines because configparser sees those as section delimiters. script_list_strs.append(script_str) - script_list_strs = "\n".join(script_list_strs) #ConfigParser should never output three newlines in a row when serialised, so it's a safe delimiter. + script_list_string = "\n".join(script_list_strs) # ConfigParser should never output three newlines in a row when serialised, so it's a safe delimiter. global_stack = Application.getInstance().getGlobalContainerStack() + if global_stack is None: + return + if "post_processing_scripts" not in global_stack.getMetaData(): global_stack.setMetaDataEntry("post_processing_scripts", "") - Application.getInstance().getGlobalContainerStack().setMetaDataEntry("post_processing_scripts", script_list_strs) + + global_stack.setMetaDataEntry("post_processing_scripts", script_list_string) ## Creates the view used by show popup. The view is saved because of the fairly aggressive garbage collection. - def _createView(self): + def _createView(self) -> None: Logger.log("d", "Creating post processing plugin view.") self.loadAllScripts() # Create the plugin dialog component - path = os.path.join(PluginRegistry.getInstance().getPluginPath("PostProcessingPlugin"), "PostProcessingPlugin.qml") - self._view = Application.getInstance().createQmlComponent(path, {"manager": self}) + path = os.path.join(cast(str, PluginRegistry.getInstance().getPluginPath("PostProcessingPlugin")), "PostProcessingPlugin.qml") + self._view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self}) if self._view is None: Logger.log("e", "Not creating PostProcessing button near save button because the QML component failed to be created.") return Logger.log("d", "Post processing view created.") # Create the save button component - Application.getInstance().addAdditionalComponent("saveButton", self._view.findChild(QObject, "postProcessingSaveAreaButton")) + CuraApplication.getInstance().addAdditionalComponent("saveButton", self._view.findChild(QObject, "postProcessingSaveAreaButton")) ## Show the (GUI) popup of the post processing plugin. - def showPopup(self): + def showPopup(self) -> None: if self._view is None: self._createView() if self._view is None: @@ -284,8 +304,9 @@ class PostProcessingPlugin(QObject, Extension): # To do this we use the global container stack propertyChanged. # Re-slicing is necessary for setting changes in this plugin, because the changes # are applied only once per "fresh" gcode - def _propertyChanged(self): + def _propertyChanged(self) -> None: global_container_stack = Application.getInstance().getGlobalContainerStack() - global_container_stack.propertyChanged.emit("post_processing_plugin", "value") + if global_container_stack is not None: + global_container_stack.propertyChanged.emit("post_processing_plugin", "value") diff --git a/plugins/PostProcessingPlugin/Script.py b/plugins/PostProcessingPlugin/Script.py index b5211401c1..e502f107f9 100644 --- a/plugins/PostProcessingPlugin/Script.py +++ b/plugins/PostProcessingPlugin/Script.py @@ -1,6 +1,8 @@ # Copyright (c) 2015 Jaime van Kessel # Copyright (c) 2018 Ultimaker B.V. # The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +from typing import Optional, Any, Dict, TYPE_CHECKING, List + from UM.Signal import Signal, signalemitter from UM.i18n import i18nCatalog @@ -17,16 +19,20 @@ import json import collections i18n_catalog = i18nCatalog("cura") +if TYPE_CHECKING: + from UM.Settings.Interfaces import DefinitionContainerInterface + ## Base class for scripts. All scripts should inherit the script class. @signalemitter class Script: - def __init__(self): + def __init__(self) -> None: super().__init__() - self._settings = None - self._stack = None + self._stack = None # type: Optional[ContainerStack] + self._definition = None # type: Optional[DefinitionContainerInterface] + self._instance = None # type: Optional[InstanceContainer] - def initialize(self): + def initialize(self) -> None: setting_data = self.getSettingData() self._stack = ContainerStack(stack_id=str(id(self))) self._stack.setDirty(False) # This stack does not need to be saved. @@ -45,6 +51,8 @@ class Script: except ContainerFormatError: self._definition = None return + if self._definition is None: + return self._stack.addContainer(self._definition) self._instance = InstanceContainer(container_id="ScriptInstanceContainer") self._instance.setDefinition(self._definition.getId()) @@ -58,16 +66,17 @@ class Script: settingsLoaded = Signal() valueChanged = Signal() # Signal emitted whenever a value of a setting is changed - def _onPropertyChanged(self, key, property_name): + def _onPropertyChanged(self, key: str, property_name: str) -> None: if property_name == "value": self.valueChanged.emit() # Property changed: trigger reslice # To do this we use the global container stack propertyChanged. - # Reslicing is necessary for setting changes in this plugin, because the changes + # Re-slicing is necessary for setting changes in this plugin, because the changes # are applied only once per "fresh" gcode global_container_stack = Application.getInstance().getGlobalContainerStack() - global_container_stack.propertyChanged.emit(key, property_name) + if global_container_stack is not None: + global_container_stack.propertyChanged.emit(key, property_name) ## Needs to return a dict that can be used to construct a settingcategory file. # See the example script for an example. @@ -75,30 +84,35 @@ class Script: # Scripts can either override getSettingData directly, or use getSettingDataString # to return a string that will be parsed as json. The latter has the benefit over # returning a dict in that the order of settings is maintained. - def getSettingData(self): - setting_data = self.getSettingDataString() - if type(setting_data) == str: - setting_data = json.loads(setting_data, object_pairs_hook = collections.OrderedDict) + def getSettingData(self) -> Dict[str, Any]: + setting_data_as_string = self.getSettingDataString() + setting_data = json.loads(setting_data_as_string, object_pairs_hook = collections.OrderedDict) return setting_data - def getSettingDataString(self): + def getSettingDataString(self) -> str: raise NotImplementedError() - def getDefinitionId(self): + def getDefinitionId(self) -> Optional[str]: if self._stack: - return self._stack.getBottom().getId() + bottom = self._stack.getBottom() + if bottom is not None: + return bottom.getId() + return None - def getStackId(self): + def getStackId(self) -> Optional[str]: if self._stack: return self._stack.getId() + return None ## Convenience function that retrieves value of a setting from the stack. - def getSettingValueByKey(self, key): - return self._stack.getProperty(key, "value") + def getSettingValueByKey(self, key: str) -> Any: + if self._stack is not None: + return self._stack.getProperty(key, "value") + return None ## Convenience function that finds the value in a line of g-code. # When requesting key = x from line "G1 X100" the value 100 is returned. - def getValue(self, line, key, default = None): + def getValue(self, line: str, key: str, default = None) -> Any: if not key in line or (';' in line and line.find(key) > line.find(';')): return default sub_part = line[line.find(key) + 1:] @@ -126,7 +140,7 @@ class Script: # \param line The original g-code line that must be modified. If not # provided, an entirely new g-code line will be produced. # \return A line of g-code with the desired parameters filled in. - def putValue(self, line = "", **kwargs): + def putValue(self, line: str = "", **kwargs) -> str: #Strip the comment. comment = "" if ";" in line: @@ -167,5 +181,5 @@ class Script: ## This is called when the script is executed. # It gets a list of g-code strings and needs to return a (modified) list. - def execute(self, data): + def execute(self, data: List[str]) -> List[str]: raise NotImplementedError() From 7d7de32dbdd16ceb87a0bb7651a0ab43ebc5317b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 3 Oct 2018 16:53:07 +0200 Subject: [PATCH 147/212] Add ExtruderStack to GlobalStack in single extrusion machine fix --- cura/Settings/ExtruderManager.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 9089ba96e9..2514e17075 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -374,6 +374,8 @@ class ExtruderManager(QObject): extruder_definition = container_registry.findDefinitionContainers(id = expected_extruder_definition_0_id)[0] extruder_stack_0.definition = extruder_definition + extruder_stack_0.setNextStack(global_stack) + ## Get all extruder values for a certain setting. # # This is exposed to qml for display purposes From 4ca63f84b815518f3bcc94eb37ed4e086630dd1d Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 2 Oct 2018 15:53:06 +0200 Subject: [PATCH 148/212] Add missing quote. Contributes to CURA-5741. --- resources/i18n/pl_PL/fdmprinter.def.json.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/pl_PL/fdmprinter.def.json.po b/resources/i18n/pl_PL/fdmprinter.def.json.po index 53aa32009e..a8b07e032c 100644 --- a/resources/i18n/pl_PL/fdmprinter.def.json.po +++ b/resources/i18n/pl_PL/fdmprinter.def.json.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.5\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com" "POT-Creation-Date: 2018-09-19 17:07+0000\n" "PO-Revision-Date: 2018-09-21 21:52+0200\n" "Last-Translator: 'Jaguś' Paweł Jagusiak, Andrzej 'anraf1001' Rafalski and Jakub 'drzejkopf' Świeciński\n" From d91d0fab10f1e26698599d1aa426c2d99ef5bbd3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 3 Oct 2018 17:27:01 +0200 Subject: [PATCH 149/212] Fix SimulationView: missing import --- plugins/SimulationView/SimulationView.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index aafbca0247..0ae8b4d9e4 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -24,7 +24,7 @@ from UM.Signal import Signal from UM.View.CompositePass import CompositePass from UM.View.GL.OpenGL import OpenGL from UM.View.GL.OpenGLContext import OpenGLContext - +from UM.View.GL.ShaderProgram import ShaderProgram from UM.View.View import View from UM.i18n import i18nCatalog @@ -42,8 +42,6 @@ from typing import Optional, TYPE_CHECKING, List, cast if TYPE_CHECKING: from UM.Scene.SceneNode import SceneNode from UM.Scene.Scene import Scene - from UM.View.GL.ShaderProgram import ShaderProgram - from UM.View.RenderPass import RenderPass from UM.Settings.ContainerStack import ContainerStack catalog = i18nCatalog("cura") From 61ffdf23d70d79857156020dcd1508496d036511 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 3 Oct 2018 14:10:02 +0200 Subject: [PATCH 150/212] Fix MYPY/typing errors --- plugins/USBPrinting/USBPrinterOutputDevice.py | 3 +++ .../UpgradeFirmwareMachineAction.py | 12 ++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 15136491f8..1fd2fdeb5c 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -100,6 +100,9 @@ class USBPrinterOutputDevice(PrinterOutputDevice): @pyqtSlot(str) def updateFirmware(self, file: Union[str, QUrl]) -> None: + if not self._firmware_updater: + return + self._firmware_updater.updateFirmware(file) ## Reset USB device settings diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py index 478ea9b6bb..8d03a15b38 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py @@ -1,7 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from UM.Application import Application +from cura.CuraApplication import CuraApplication from UM.Settings.DefinitionContainer import DefinitionContainer from cura.MachineAction import MachineAction from UM.i18n import i18nCatalog @@ -28,21 +28,21 @@ class UpgradeFirmwareMachineAction(MachineAction): self._active_output_device = None #type: Optional[PrinterOutputDevice] self._active_firmware_updater = None #type: Optional[FirmwareUpdater] - Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) + CuraApplication.getInstance().engineCreatedSignal.connect(self._onEngineCreated) def _onEngineCreated(self) -> None: - Application.getInstance().getMachineManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) + CuraApplication.getInstance().getMachineManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) def _onContainerAdded(self, container) -> None: # Add this action as a supported action to all machine definitions if they support USB connection if isinstance(container, DefinitionContainer) and container.getMetaDataEntry("type") == "machine" and container.getMetaDataEntry("supports_usb_connection"): - Application.getInstance().getMachineActionManager().addSupportedAction(container.getId(), self.getKey()) + CuraApplication.getInstance().getMachineActionManager().addSupportedAction(container.getId(), self.getKey()) def _onOutputDevicesChanged(self) -> None: if self._active_output_device: self._active_output_device.activePrinter.getController().canUpdateFirmwareChanged.disconnect(self._onControllerCanUpdateFirmwareChanged) - output_devices = Application.getInstance().getMachineManager().printerOutputDevices + output_devices = CuraApplication.getInstance().getMachineManager().printerOutputDevices self._active_output_device = output_devices[0] if output_devices else None if self._active_output_device: @@ -55,7 +55,7 @@ class UpgradeFirmwareMachineAction(MachineAction): outputDeviceCanUpdateFirmwareChanged = pyqtSignal() @pyqtProperty(QObject, notify = outputDeviceCanUpdateFirmwareChanged) - def firmwareUpdater(self) -> Optional["firmwareUpdater"]: + def firmwareUpdater(self) -> Optional["FirmwareUpdater"]: if self._active_output_device and self._active_output_device.activePrinter.getController().can_update_firmware: self._active_firmware_updater = self._active_output_device.getFirmwareUpdater() return self._active_firmware_updater From b7542a8ef8ff17491c1366e7ca5532ebc9e0c526 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 3 Oct 2018 20:55:51 +0200 Subject: [PATCH 151/212] Move Firmware Updater into a plugin of its own --- .../FirmwareUpdaterMachineAction.py} | 4 ++-- .../FirmwareUpdaterMachineAction.qml} | 18 +++++++++--------- plugins/FirmwareUpdater/__init__.py | 13 +++++++++++++ plugins/FirmwareUpdater/plugin.json | 8 ++++++++ plugins/UltimakerMachineActions/__init__.py | 5 ----- resources/bundled_packages/cura.json | 17 +++++++++++++++++ 6 files changed, 49 insertions(+), 16 deletions(-) rename plugins/{UltimakerMachineActions/UpgradeFirmwareMachineAction.py => FirmwareUpdater/FirmwareUpdaterMachineAction.py} (96%) rename plugins/{UltimakerMachineActions/UpgradeFirmwareMachineAction.qml => FirmwareUpdater/FirmwareUpdaterMachineAction.qml} (92%) create mode 100644 plugins/FirmwareUpdater/__init__.py create mode 100644 plugins/FirmwareUpdater/plugin.json diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py similarity index 96% rename from plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py rename to plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py index 8d03a15b38..4faa3abc64 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py +++ b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py @@ -19,10 +19,10 @@ if MYPY: catalog = i18nCatalog("cura") ## Upgrade the firmware of a machine by USB with this action. -class UpgradeFirmwareMachineAction(MachineAction): +class FirmwareUpdaterMachineAction(MachineAction): def __init__(self) -> None: super().__init__("UpgradeFirmware", catalog.i18nc("@action", "Upgrade Firmware")) - self._qml_url = "UpgradeFirmwareMachineAction.qml" + self._qml_url = "FirmwareUpdaterMachineAction.qml" ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) self._active_output_device = None #type: Optional[PrinterOutputDevice] diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml similarity index 92% rename from plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml rename to plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml index 1c1f39edd0..ab5bb89347 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml +++ b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml @@ -20,7 +20,7 @@ Cura.MachineAction Column { - id: upgradeFirmwareMachineAction + id: firmwareUpdaterMachineAction anchors.fill: parent; UM.I18nCatalog { id: catalog; name:"cura"} spacing: UM.Theme.getSize("default_margin").height @@ -28,7 +28,7 @@ Cura.MachineAction Label { width: parent.width - text: catalog.i18nc("@title", "Upgrade Firmware") + text: catalog.i18nc("@title", "Update Firmware") wrapMode: Text.WordWrap font.pointSize: 18 } @@ -59,7 +59,7 @@ Cura.MachineAction enabled: parent.firmwareName != "" && canUpdateFirmware onClicked: { - firmwareUpdateWindow.visible = true; + updateProgressDialog.visible = true; activeOutputDevice.updateFirmware(parent.firmwareName); } } @@ -79,8 +79,8 @@ Cura.MachineAction { width: parent.width wrapMode: Text.WordWrap - visible: !printerConnected && !firmwareUpdateWindow.visible - text: catalog.i18nc("@label", "Firmware can not be upgraded because there is no connection with the printer."); + visible: !printerConnected && !updateProgressDialog.visible + text: catalog.i18nc("@label", "Firmware can not be updated because there is no connection with the printer."); } Label @@ -88,7 +88,7 @@ Cura.MachineAction width: parent.width wrapMode: Text.WordWrap visible: printerConnected && !canUpdateFirmware - text: catalog.i18nc("@label", "Firmware can not be upgraded because the connection with the printer does not support upgrading firmware."); + text: catalog.i18nc("@label", "Firmware can not be updated because the connection with the printer does not support upgrading firmware."); } } @@ -100,14 +100,14 @@ Cura.MachineAction selectExisting: true onAccepted: { - firmwareUpdateWindow.visible = true; + updateProgressDialog.visible = true; activeOutputDevice.updateFirmware(fileUrl); } } UM.Dialog { - id: firmwareUpdateWindow + id: updateProgressDialog width: minimumWidth minimumWidth: 500 * screenScaleFactor @@ -184,7 +184,7 @@ Cura.MachineAction { text: catalog.i18nc("@action:button","Close"); enabled: (manager.firmwareUpdater != null) ? manager.firmwareUpdater.firmwareUpdateState != 1 : true; - onClicked: firmwareUpdateWindow.visible = false; + onClicked: updateProgressDialog.visible = false; } ] } diff --git a/plugins/FirmwareUpdater/__init__.py b/plugins/FirmwareUpdater/__init__.py new file mode 100644 index 0000000000..58c351a4ea --- /dev/null +++ b/plugins/FirmwareUpdater/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import FirmwareUpdaterMachineAction + +def getMetaData(): + return { + } + +def register(app): + return { "machine_action": [ + FirmwareUpdaterMachineAction.FirmwareUpdaterMachineAction(), + ]} diff --git a/plugins/FirmwareUpdater/plugin.json b/plugins/FirmwareUpdater/plugin.json new file mode 100644 index 0000000000..3e09eab2b5 --- /dev/null +++ b/plugins/FirmwareUpdater/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Firmware Updater", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Provides a machine actions for updating firmware.", + "api": 5, + "i18n-catalog": "cura" +} diff --git a/plugins/UltimakerMachineActions/__init__.py b/plugins/UltimakerMachineActions/__init__.py index 495f212736..30493536ce 100644 --- a/plugins/UltimakerMachineActions/__init__.py +++ b/plugins/UltimakerMachineActions/__init__.py @@ -2,13 +2,9 @@ # Cura is released under the terms of the LGPLv3 or higher. from . import BedLevelMachineAction -from . import UpgradeFirmwareMachineAction from . import UMOUpgradeSelection from . import UM2UpgradeSelection -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - def getMetaData(): return { } @@ -16,7 +12,6 @@ def getMetaData(): def register(app): return { "machine_action": [ BedLevelMachineAction.BedLevelMachineAction(), - UpgradeFirmwareMachineAction.UpgradeFirmwareMachineAction(), UMOUpgradeSelection.UMOUpgradeSelection(), UM2UpgradeSelection.UM2UpgradeSelection() ]} diff --git a/resources/bundled_packages/cura.json b/resources/bundled_packages/cura.json index 7107bbe4f0..ad97f3595b 100644 --- a/resources/bundled_packages/cura.json +++ b/resources/bundled_packages/cura.json @@ -118,6 +118,23 @@ } } }, + "FirmwareUpdater": { + "package_info": { + "package_id": "FirmwareUpdater", + "package_type": "plugin", + "display_name": "Firmware Updater", + "description": "Provides a machine actions for updating firmware.", + "package_version": "1.0.0", + "sdk_version": 5, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, "GCodeGzReader": { "package_info": { "package_id": "GCodeGzReader", From c2558f91dd26095ddb5d019f1fa07e1e5b67c1e1 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 3 Oct 2018 21:00:23 +0200 Subject: [PATCH 152/212] Remove UpgradeFirmware as supported machine action... because the plugin adds itself as a supported action --- resources/definitions/makeit_pro_l.def.json | 1 - resources/definitions/makeit_pro_m.def.json | 1 - resources/definitions/tam.def.json | 1 - resources/definitions/ultimaker2.def.json | 2 +- resources/definitions/ultimaker2_extended_plus.def.json | 1 - resources/definitions/ultimaker2_go.def.json | 1 - resources/definitions/ultimaker2_plus.def.json | 1 - resources/definitions/ultimaker_original.def.json | 2 +- resources/definitions/ultimaker_original_dual.def.json | 2 +- resources/definitions/ultimaker_original_plus.def.json | 2 +- resources/definitions/wanhao_d6.def.json | 3 --- 11 files changed, 4 insertions(+), 13 deletions(-) diff --git a/resources/definitions/makeit_pro_l.def.json b/resources/definitions/makeit_pro_l.def.json index 2f9173c90e..d40d63f97b 100644 --- a/resources/definitions/makeit_pro_l.def.json +++ b/resources/definitions/makeit_pro_l.def.json @@ -8,7 +8,6 @@ "manufacturer": "NA", "file_formats": "text/x-gcode", "has_materials": false, - "supported_actions": [ "MachineSettingsAction", "UpgradeFirmware" ], "machine_extruder_trains": { "0": "makeit_l_dual_1st", diff --git a/resources/definitions/makeit_pro_m.def.json b/resources/definitions/makeit_pro_m.def.json index 0cd7b42df3..1f0381df86 100644 --- a/resources/definitions/makeit_pro_m.def.json +++ b/resources/definitions/makeit_pro_m.def.json @@ -8,7 +8,6 @@ "manufacturer": "NA", "file_formats": "text/x-gcode", "has_materials": false, - "supported_actions": [ "MachineSettingsAction", "UpgradeFirmware" ], "machine_extruder_trains": { "0": "makeit_dual_1st", diff --git a/resources/definitions/tam.def.json b/resources/definitions/tam.def.json index 9865abedda..0ed8d657a2 100644 --- a/resources/definitions/tam.def.json +++ b/resources/definitions/tam.def.json @@ -10,7 +10,6 @@ "platform": "tam_series1.stl", "platform_offset": [-580.0, -6.23, 253.5], "has_materials": false, - "supported_actions": ["UpgradeFirmware"], "machine_extruder_trains": { "0": "tam_extruder_0" diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index f367558df0..bbe61d49fb 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -17,7 +17,7 @@ "preferred_variant_name": "0.4 mm", "exclude_materials": ["generic_hips", "generic_petg", "generic_bam", "ultimaker_bam", "generic_pva", "ultimaker_pva", "generic_tough_pla", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white"], "first_start_actions": ["UM2UpgradeSelection"], - "supported_actions":["UM2UpgradeSelection", "UpgradeFirmware"], + "supported_actions":["UM2UpgradeSelection"], "machine_extruder_trains": { "0": "ultimaker2_extruder_0" diff --git a/resources/definitions/ultimaker2_extended_plus.def.json b/resources/definitions/ultimaker2_extended_plus.def.json index c296ecd43e..0242115057 100644 --- a/resources/definitions/ultimaker2_extended_plus.def.json +++ b/resources/definitions/ultimaker2_extended_plus.def.json @@ -10,7 +10,6 @@ "file_formats": "text/x-gcode", "platform": "ultimaker2_platform.obj", "platform_texture": "Ultimaker2ExtendedPlusbackplate.png", - "supported_actions": ["UpgradeFirmware"], "machine_extruder_trains": { "0": "ultimaker2_extended_plus_extruder_0" diff --git a/resources/definitions/ultimaker2_go.def.json b/resources/definitions/ultimaker2_go.def.json index 5301fd7db9..e2ad2b00a1 100644 --- a/resources/definitions/ultimaker2_go.def.json +++ b/resources/definitions/ultimaker2_go.def.json @@ -13,7 +13,6 @@ "platform_texture": "Ultimaker2Gobackplate.png", "platform_offset": [0, 0, 0], "first_start_actions": [], - "supported_actions": ["UpgradeFirmware"], "machine_extruder_trains": { "0": "ultimaker2_go_extruder_0" diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json index 45019789bf..bf48353f59 100644 --- a/resources/definitions/ultimaker2_plus.def.json +++ b/resources/definitions/ultimaker2_plus.def.json @@ -15,7 +15,6 @@ "has_machine_materials": true, "has_machine_quality": true, "first_start_actions": [], - "supported_actions": ["UpgradeFirmware"], "machine_extruder_trains": { "0": "ultimaker2_plus_extruder_0" diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index bb21e4b82e..4714fc1217 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -14,7 +14,7 @@ "has_machine_quality": true, "exclude_materials": ["generic_hips", "generic_petg", "generic_bam", "ultimaker_bam", "generic_pva", "ultimaker_pva", "generic_tough_pla", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white"], "first_start_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel"], - "supported_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel", "UpgradeFirmware"], + "supported_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel"], "machine_extruder_trains": { "0": "ultimaker_original_extruder_0" diff --git a/resources/definitions/ultimaker_original_dual.def.json b/resources/definitions/ultimaker_original_dual.def.json index 1ffb6e840b..0dc1cb3d2d 100644 --- a/resources/definitions/ultimaker_original_dual.def.json +++ b/resources/definitions/ultimaker_original_dual.def.json @@ -22,7 +22,7 @@ "firmware_file": "MarlinUltimaker-{baudrate}-dual.hex", "firmware_hbk_file": "MarlinUltimaker-HBK-{baudrate}-dual.hex", "first_start_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel"], - "supported_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel", "UpgradeFirmware"] + "supported_actions": ["UMOUpgradeSelection", "UMOCheckup", "BedLevel"] }, "overrides": { diff --git a/resources/definitions/ultimaker_original_plus.def.json b/resources/definitions/ultimaker_original_plus.def.json index 46d95f8028..01523f34b7 100644 --- a/resources/definitions/ultimaker_original_plus.def.json +++ b/resources/definitions/ultimaker_original_plus.def.json @@ -12,7 +12,7 @@ "platform_texture": "UltimakerPlusbackplate.png", "quality_definition": "ultimaker_original", "first_start_actions": ["UMOCheckup", "BedLevel"], - "supported_actions": ["UMOCheckup", "BedLevel", "UpgradeFirmware"], + "supported_actions": ["UMOCheckup", "BedLevel"], "machine_extruder_trains": { "0": "ultimaker_original_plus_extruder_0" diff --git a/resources/definitions/wanhao_d6.def.json b/resources/definitions/wanhao_d6.def.json index 6164f4d016..e269615c4a 100644 --- a/resources/definitions/wanhao_d6.def.json +++ b/resources/definitions/wanhao_d6.def.json @@ -18,9 +18,6 @@ 0, -28, 0 - ], - "supported_actions": [ - "UpgradeFirmware" ] }, "overrides": { From 9ac744b9ba33cacf767f9b9ba3873fef3bdb50bf Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 3 Oct 2018 22:00:24 +0200 Subject: [PATCH 153/212] Remove unnecessary import and declaration of i18n in plugins --- plugins/3MFWriter/__init__.py | 2 +- plugins/ChangeLogPlugin/__init__.py | 2 -- plugins/FirmwareUpdateChecker/__init__.py | 4 ---- plugins/MachineSettingsAction/__init__.py | 2 -- plugins/ModelChecker/__init__.py | 5 +---- plugins/MonitorStage/__init__.py | 1 + plugins/PostProcessingPlugin/__init__.py | 6 +++--- plugins/RemovableDriveOutputDevice/__init__.py | 6 ++---- plugins/SliceInfoPlugin/__init__.py | 7 +++---- plugins/UM3NetworkPrinting/__init__.py | 3 --- plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py | 3 --- plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py | 3 --- plugins/VersionUpgrade/VersionUpgrade25to26/__init__.py | 3 --- plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py | 3 --- plugins/VersionUpgrade/VersionUpgrade33to34/__init__.py | 1 - plugins/VersionUpgrade/VersionUpgrade34to35/__init__.py | 1 - plugins/XmlMaterialProfile/__init__.py | 3 --- 17 files changed, 11 insertions(+), 44 deletions(-) diff --git a/plugins/3MFWriter/__init__.py b/plugins/3MFWriter/__init__.py index 4b8a03888d..eff1648489 100644 --- a/plugins/3MFWriter/__init__.py +++ b/plugins/3MFWriter/__init__.py @@ -12,7 +12,7 @@ from . import ThreeMFWorkspaceWriter from UM.i18n import i18nCatalog from UM.Platform import Platform -i18n_catalog = i18nCatalog("uranium") +i18n_catalog = i18nCatalog("cura") def getMetaData(): workspace_extension = "3mf" diff --git a/plugins/ChangeLogPlugin/__init__.py b/plugins/ChangeLogPlugin/__init__.py index 97d9e411e5..a5452b60c8 100644 --- a/plugins/ChangeLogPlugin/__init__.py +++ b/plugins/ChangeLogPlugin/__init__.py @@ -3,8 +3,6 @@ from . import ChangeLog -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") def getMetaData(): return {} diff --git a/plugins/FirmwareUpdateChecker/__init__.py b/plugins/FirmwareUpdateChecker/__init__.py index 3fae15e826..892c9c0320 100644 --- a/plugins/FirmwareUpdateChecker/__init__.py +++ b/plugins/FirmwareUpdateChecker/__init__.py @@ -1,12 +1,8 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from UM.i18n import i18nCatalog - from . import FirmwareUpdateChecker -i18n_catalog = i18nCatalog("cura") - def getMetaData(): return {} diff --git a/plugins/MachineSettingsAction/__init__.py b/plugins/MachineSettingsAction/__init__.py index b1c4a75fec..ff80a12551 100644 --- a/plugins/MachineSettingsAction/__init__.py +++ b/plugins/MachineSettingsAction/__init__.py @@ -3,8 +3,6 @@ from . import MachineSettingsAction -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") def getMetaData(): return {} diff --git a/plugins/ModelChecker/__init__.py b/plugins/ModelChecker/__init__.py index 5f4d443729..dffee21723 100644 --- a/plugins/ModelChecker/__init__.py +++ b/plugins/ModelChecker/__init__.py @@ -1,11 +1,8 @@ # Copyright (c) 2018 Ultimaker B.V. -# This example is released under the terms of the AGPLv3 or higher. +# Cura is released under the terms of the LGPLv3 or higher. from . import ModelChecker -from UM.i18n import i18nCatalog -i18n_catalog = i18nCatalog("cura") - def getMetaData(): return {} diff --git a/plugins/MonitorStage/__init__.py b/plugins/MonitorStage/__init__.py index 884d43a8af..bdaf53a36c 100644 --- a/plugins/MonitorStage/__init__.py +++ b/plugins/MonitorStage/__init__.py @@ -3,6 +3,7 @@ from . import MonitorStage + from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") diff --git a/plugins/PostProcessingPlugin/__init__.py b/plugins/PostProcessingPlugin/__init__.py index 85f1126136..8064d1132a 100644 --- a/plugins/PostProcessingPlugin/__init__.py +++ b/plugins/PostProcessingPlugin/__init__.py @@ -2,10 +2,10 @@ # The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. from . import PostProcessingPlugin -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") + + def getMetaData(): return {} - + def register(app): return {"extension": PostProcessingPlugin.PostProcessingPlugin()} \ No newline at end of file diff --git a/plugins/RemovableDriveOutputDevice/__init__.py b/plugins/RemovableDriveOutputDevice/__init__.py index dc547b7bcc..1758801f8a 100644 --- a/plugins/RemovableDriveOutputDevice/__init__.py +++ b/plugins/RemovableDriveOutputDevice/__init__.py @@ -3,12 +3,10 @@ from UM.Platform import Platform from UM.Logger import Logger -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") + def getMetaData(): - return { - } + return {} def register(app): if Platform.isWindows(): diff --git a/plugins/SliceInfoPlugin/__init__.py b/plugins/SliceInfoPlugin/__init__.py index 7f1dfa5336..440ca8ec40 100644 --- a/plugins/SliceInfoPlugin/__init__.py +++ b/plugins/SliceInfoPlugin/__init__.py @@ -1,12 +1,11 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. + from . import SliceInfo -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") + def getMetaData(): - return { - } + return {} def register(app): return { "extension": SliceInfo.SliceInfo()} \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/__init__.py b/plugins/UM3NetworkPrinting/__init__.py index 7f2b34223c..e2ad5a2b12 100644 --- a/plugins/UM3NetworkPrinting/__init__.py +++ b/plugins/UM3NetworkPrinting/__init__.py @@ -2,9 +2,6 @@ # Cura is released under the terms of the LGPLv3 or higher. from .src import DiscoverUM3Action -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - from .src import UM3OutputDevicePlugin def getMetaData(): diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py b/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py index 435621ec54..609781ebfe 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py @@ -3,9 +3,6 @@ from . import VersionUpgrade21to22 -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - upgrade = VersionUpgrade21to22.VersionUpgrade21to22() def getMetaData(): diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py b/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py index fbdbf92a4b..278b660ec1 100644 --- a/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py @@ -3,9 +3,6 @@ from . import VersionUpgrade -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - upgrade = VersionUpgrade.VersionUpgrade22to24() def getMetaData(): diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/__init__.py b/plugins/VersionUpgrade/VersionUpgrade25to26/__init__.py index 1419325cc1..67aa73233f 100644 --- a/plugins/VersionUpgrade/VersionUpgrade25to26/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/__init__.py @@ -3,9 +3,6 @@ from . import VersionUpgrade25to26 -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - upgrade = VersionUpgrade25to26.VersionUpgrade25to26() def getMetaData(): diff --git a/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py b/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py index 79ed5e8b68..0e26ca8bbf 100644 --- a/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade26to27/__init__.py @@ -3,9 +3,6 @@ from . import VersionUpgrade26to27 -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - upgrade = VersionUpgrade26to27.VersionUpgrade26to27() def getMetaData(): diff --git a/plugins/VersionUpgrade/VersionUpgrade33to34/__init__.py b/plugins/VersionUpgrade/VersionUpgrade33to34/__init__.py index 4faa1290b5..8213f195d5 100644 --- a/plugins/VersionUpgrade/VersionUpgrade33to34/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade33to34/__init__.py @@ -5,7 +5,6 @@ from . import VersionUpgrade33to34 upgrade = VersionUpgrade33to34.VersionUpgrade33to34() - def getMetaData(): return { "version_upgrade": { diff --git a/plugins/VersionUpgrade/VersionUpgrade34to35/__init__.py b/plugins/VersionUpgrade/VersionUpgrade34to35/__init__.py index 9d3410e40d..de0fdccb7d 100644 --- a/plugins/VersionUpgrade/VersionUpgrade34to35/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade34to35/__init__.py @@ -5,7 +5,6 @@ from . import VersionUpgrade34to35 upgrade = VersionUpgrade34to35.VersionUpgrade34to35() - def getMetaData(): return { "version_upgrade": { diff --git a/plugins/XmlMaterialProfile/__init__.py b/plugins/XmlMaterialProfile/__init__.py index 70a359ee76..e8bde78424 100644 --- a/plugins/XmlMaterialProfile/__init__.py +++ b/plugins/XmlMaterialProfile/__init__.py @@ -5,10 +5,7 @@ from . import XmlMaterialProfile from . import XmlMaterialUpgrader from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase -from UM.i18n import i18nCatalog - -catalog = i18nCatalog("cura") upgrader = XmlMaterialUpgrader.XmlMaterialUpgrader() From 477862d779b5f590ec16d223e917582579c7972c Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 3 Oct 2018 23:07:37 +0200 Subject: [PATCH 154/212] Fix code style and unused imports --- plugins/FirmwareUpdater/__init__.py | 5 ++--- plugins/USBPrinting/__init__.py | 3 --- plugins/UltimakerMachineActions/__init__.py | 5 ++--- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/plugins/FirmwareUpdater/__init__.py b/plugins/FirmwareUpdater/__init__.py index 58c351a4ea..5a008d7d15 100644 --- a/plugins/FirmwareUpdater/__init__.py +++ b/plugins/FirmwareUpdater/__init__.py @@ -4,10 +4,9 @@ from . import FirmwareUpdaterMachineAction def getMetaData(): - return { - } + return {} def register(app): return { "machine_action": [ - FirmwareUpdaterMachineAction.FirmwareUpdaterMachineAction(), + FirmwareUpdaterMachineAction.FirmwareUpdaterMachineAction() ]} diff --git a/plugins/USBPrinting/__init__.py b/plugins/USBPrinting/__init__.py index 0cb68d3865..075ad2943b 100644 --- a/plugins/USBPrinting/__init__.py +++ b/plugins/USBPrinting/__init__.py @@ -2,9 +2,6 @@ # Cura is released under the terms of the LGPLv3 or higher. from . import USBPrinterOutputDeviceManager -from PyQt5.QtQml import qmlRegisterSingletonType -from UM.i18n import i18nCatalog -i18n_catalog = i18nCatalog("cura") def getMetaData(): diff --git a/plugins/UltimakerMachineActions/__init__.py b/plugins/UltimakerMachineActions/__init__.py index 30493536ce..e87949580a 100644 --- a/plugins/UltimakerMachineActions/__init__.py +++ b/plugins/UltimakerMachineActions/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from . import BedLevelMachineAction @@ -6,8 +6,7 @@ from . import UMOUpgradeSelection from . import UM2UpgradeSelection def getMetaData(): - return { - } + return {} def register(app): return { "machine_action": [ From 436860f84167a7544a17a141e987c13a38e420a5 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Thu, 4 Oct 2018 11:36:02 +0200 Subject: [PATCH 155/212] Don't show prime tower shadow if only one extruder is enabled CURA-5740 --- cura/BuildVolume.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 9d2f5c1f90..547c3dae71 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -718,21 +718,23 @@ class BuildVolume(SceneNode): # Add prime tower location as disallowed area. if len(used_extruders) > 1: #No prime tower in single-extrusion. - prime_tower_collision = False - prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders) - for extruder_id in prime_tower_areas: - for prime_tower_area in prime_tower_areas[extruder_id]: - for area in result_areas[extruder_id]: - if prime_tower_area.intersectsPolygon(area) is not None: - prime_tower_collision = True + + if len([x for x in used_extruders if x.isEnabled == True]) > 1: #No prime tower if only one extruder is enabled + prime_tower_collision = False + prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders) + for extruder_id in prime_tower_areas: + for prime_tower_area in prime_tower_areas[extruder_id]: + for area in result_areas[extruder_id]: + if prime_tower_area.intersectsPolygon(area) is not None: + prime_tower_collision = True + break + if prime_tower_collision: #Already found a collision. break - if prime_tower_collision: #Already found a collision. - break - if not prime_tower_collision: - result_areas[extruder_id].extend(prime_tower_areas[extruder_id]) - result_areas_no_brim[extruder_id].extend(prime_tower_areas[extruder_id]) - else: - self._error_areas.extend(prime_tower_areas[extruder_id]) + if not prime_tower_collision: + result_areas[extruder_id].extend(prime_tower_areas[extruder_id]) + result_areas_no_brim[extruder_id].extend(prime_tower_areas[extruder_id]) + else: + self._error_areas.extend(prime_tower_areas[extruder_id]) self._has_errors = len(self._error_areas) > 0 From 28dc32adaba8e9bae6361ba06fb0872b4a275530 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 4 Oct 2018 11:47:51 +0200 Subject: [PATCH 156/212] Fix typing in GenericOutputController --- cura/PrinterOutput/GenericOutputController.py | 65 ++++++++++--------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/cura/PrinterOutput/GenericOutputController.py b/cura/PrinterOutput/GenericOutputController.py index c8caa85caf..9434feea62 100644 --- a/cura/PrinterOutput/GenericOutputController.py +++ b/cura/PrinterOutput/GenericOutputController.py @@ -1,7 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import TYPE_CHECKING, Union +from typing import TYPE_CHECKING, Set, Union, Optional from cura.PrinterOutput.PrinterOutputController import PrinterOutputController from PyQt5.QtCore import QTimer @@ -9,27 +9,28 @@ from PyQt5.QtCore import QTimer if TYPE_CHECKING: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel class GenericOutputController(PrinterOutputController): - def __init__(self, output_device): + def __init__(self, output_device: "PrinterOutputDevice") -> None: super().__init__(output_device) self._preheat_bed_timer = QTimer() self._preheat_bed_timer.setSingleShot(True) self._preheat_bed_timer.timeout.connect(self._onPreheatBedTimerFinished) - self._preheat_printer = None + self._preheat_printer = None #type: Optional[PrinterOutputModel] self._preheat_hotends_timer = QTimer() self._preheat_hotends_timer.setSingleShot(True) self._preheat_hotends_timer.timeout.connect(self._onPreheatHotendsTimerFinished) - self._preheat_hotends = set() + self._preheat_hotends = set() #type: Set[ExtruderOutputModel] self._output_device.printersChanged.connect(self._onPrintersChanged) - self._active_printer = None + self._active_printer = None #type: Optional[PrinterOutputModel] - def _onPrintersChanged(self): + def _onPrintersChanged(self) -> None: if self._active_printer: self._active_printer.stateChanged.disconnect(self._onPrinterStateChanged) self._active_printer.targetBedTemperatureChanged.disconnect(self._onTargetBedTemperatureChanged) @@ -43,32 +44,33 @@ class GenericOutputController(PrinterOutputController): for extruder in self._active_printer.extruders: extruder.targetHotendTemperatureChanged.connect(self._onTargetHotendTemperatureChanged) - def _onPrinterStateChanged(self): - if self._active_printer.state != "idle": + def _onPrinterStateChanged(self) -> None: + if self._active_printer and self._active_printer.state != "idle": if self._preheat_bed_timer.isActive(): self._preheat_bed_timer.stop() - self._preheat_printer.updateIsPreheating(False) + if self._preheat_printer: + self._preheat_printer.updateIsPreheating(False) if self._preheat_hotends_timer.isActive(): self._preheat_hotends_timer.stop() for extruder in self._preheat_hotends: extruder.updateIsPreheating(False) - self._preheat_hotends = set() + self._preheat_hotends = set() #type: Set[ExtruderOutputModel] - def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): + def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed) -> None: self._output_device.sendCommand("G91") self._output_device.sendCommand("G0 X%s Y%s Z%s F%s" % (x, y, z, speed)) self._output_device.sendCommand("G90") - def homeHead(self, printer): + def homeHead(self, printer: "PrinterOutputModel") -> None: self._output_device.sendCommand("G28 X Y") - def homeBed(self, printer): + def homeBed(self, printer: "PrinterOutputModel") -> None: self._output_device.sendCommand("G28 Z") - def sendRawCommand(self, printer: "PrinterOutputModel", command: str): + def sendRawCommand(self, printer: "PrinterOutputModel", command: str) -> None: self._output_device.sendCommand(command.upper()) #Most printers only understand uppercase g-code commands. - def setJobState(self, job: "PrintJobOutputModel", state: str): + def setJobState(self, job: "PrintJobOutputModel", state: str) -> None: if state == "pause": self._output_device.pausePrint() job.updateState("paused") @@ -79,15 +81,15 @@ class GenericOutputController(PrinterOutputController): self._output_device.cancelPrint() pass - def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int): + def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int) -> None: self._output_device.sendCommand("M140 S%s" % temperature) - def _onTargetBedTemperatureChanged(self): - if self._preheat_bed_timer.isActive() and self._preheat_printer.targetBedTemperature == 0: + def _onTargetBedTemperatureChanged(self) -> None: + if self._preheat_bed_timer.isActive() and self._preheat_printer and self._preheat_printer.targetBedTemperature == 0: self._preheat_bed_timer.stop() self._preheat_printer.updateIsPreheating(False) - def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): + def preheatBed(self, printer: "PrinterOutputModel", temperature, duration) -> None: try: temperature = round(temperature) # The API doesn't allow floating point. duration = round(duration) @@ -100,21 +102,25 @@ class GenericOutputController(PrinterOutputController): self._preheat_printer = printer printer.updateIsPreheating(True) - def cancelPreheatBed(self, printer: "PrinterOutputModel"): + def cancelPreheatBed(self, printer: "PrinterOutputModel") -> None: self.setTargetBedTemperature(printer, temperature=0) self._preheat_bed_timer.stop() printer.updateIsPreheating(False) - def _onPreheatBedTimerFinished(self): + def _onPreheatBedTimerFinished(self) -> None: + if not self._preheat_printer: + return self.setTargetBedTemperature(self._preheat_printer, 0) self._preheat_printer.updateIsPreheating(False) def setTargetHotendTemperature(self, printer: "PrinterOutputModel", position: int, temperature: Union[int, float]) -> None: self._output_device.sendCommand("M104 S%s T%s" % (temperature, position)) - def _onTargetHotendTemperatureChanged(self): + def _onTargetHotendTemperatureChanged(self) -> None: if not self._preheat_hotends_timer.isActive(): return + if not self._active_printer: + return for extruder in self._active_printer.extruders: if extruder in self._preheat_hotends and extruder.targetHotendTemperature == 0: @@ -123,7 +129,7 @@ class GenericOutputController(PrinterOutputController): if not self._preheat_hotends: self._preheat_hotends_timer.stop() - def preheatHotend(self, extruder: "ExtruderOutputModel", temperature, duration): + def preheatHotend(self, extruder: "ExtruderOutputModel", temperature, duration) -> None: position = extruder.getPosition() number_of_extruders = len(extruder.getPrinter().extruders) if position >= number_of_extruders: @@ -141,7 +147,7 @@ class GenericOutputController(PrinterOutputController): self._preheat_hotends.add(extruder) extruder.updateIsPreheating(True) - def cancelPreheatHotend(self, extruder: "ExtruderOutputModel"): + def cancelPreheatHotend(self, extruder: "ExtruderOutputModel") -> None: self.setTargetHotendTemperature(extruder.getPrinter(), extruder.getPosition(), temperature=0) if extruder in self._preheat_hotends: extruder.updateIsPreheating(False) @@ -149,21 +155,22 @@ class GenericOutputController(PrinterOutputController): if not self._preheat_hotends and self._preheat_hotends_timer.isActive(): self._preheat_hotends_timer.stop() - def _onPreheatHotendsTimerFinished(self): + def _onPreheatHotendsTimerFinished(self) -> None: for extruder in self._preheat_hotends: self.setTargetHotendTemperature(extruder.getPrinter(), extruder.getPosition(), 0) - self._preheat_hotends = set() + self._preheat_hotends = set() #type: Set[ExtruderOutputModel] # Cancel any ongoing preheating timers, without setting back the temperature to 0 # This can be used eg at the start of a print - def stopPreheatTimers(self): + def stopPreheatTimers(self) -> None: if self._preheat_hotends_timer.isActive(): for extruder in self._preheat_hotends: extruder.updateIsPreheating(False) - self._preheat_hotends = set() + self._preheat_hotends = set() #type: Set[ExtruderOutputModel] self._preheat_hotends_timer.stop() if self._preheat_bed_timer.isActive(): - self._preheat_printer.updateIsPreheating(False) + if self._preheat_printer: + self._preheat_printer.updateIsPreheating(False) self._preheat_bed_timer.stop() From 5b2dc804cac706537f7daf5bd0d6c24bf4e3b5d8 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 4 Oct 2018 12:32:42 +0200 Subject: [PATCH 157/212] Fix a crash when adding a printer part of a cluster --- plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py index 4faa3abc64..4a172b6557 100644 --- a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py +++ b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py @@ -39,13 +39,13 @@ class FirmwareUpdaterMachineAction(MachineAction): CuraApplication.getInstance().getMachineActionManager().addSupportedAction(container.getId(), self.getKey()) def _onOutputDevicesChanged(self) -> None: - if self._active_output_device: + if self._active_output_device and self._active_output_device.activePrinter: self._active_output_device.activePrinter.getController().canUpdateFirmwareChanged.disconnect(self._onControllerCanUpdateFirmwareChanged) output_devices = CuraApplication.getInstance().getMachineManager().printerOutputDevices self._active_output_device = output_devices[0] if output_devices else None - if self._active_output_device: + if self._active_output_device and self._active_output_device.activePrinter: self._active_output_device.activePrinter.getController().canUpdateFirmwareChanged.connect(self._onControllerCanUpdateFirmwareChanged) self.outputDeviceCanUpdateFirmwareChanged.emit() From 04bca109ba67404081f069da488832c027a51571 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 4 Oct 2018 12:48:35 +0200 Subject: [PATCH 158/212] Fix update/upgrade consistency --- plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py index 4a172b6557..981fb819eb 100644 --- a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py +++ b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py @@ -21,7 +21,7 @@ catalog = i18nCatalog("cura") ## Upgrade the firmware of a machine by USB with this action. class FirmwareUpdaterMachineAction(MachineAction): def __init__(self) -> None: - super().__init__("UpgradeFirmware", catalog.i18nc("@action", "Upgrade Firmware")) + super().__init__("UpgradeFirmware", catalog.i18nc("@action", "Update Firmware")) self._qml_url = "FirmwareUpdaterMachineAction.qml" ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) From 110d2daa81e6e28cbfe420974cbeefb4c561e921 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 4 Oct 2018 15:54:22 +0200 Subject: [PATCH 159/212] [CURA-5775] The snaphot-creation of the UFP-writer should only be called when writing to UFP-files. --- plugins/UFPWriter/UFPWriter.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index d318a0e77d..b3088fc863 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -27,14 +27,13 @@ class UFPWriter(MeshWriter): MimeTypeDatabase.addMimeType( MimeType( - name = "application/x-cura-stl-file", + name = "application/x-ufp", comment = "Cura UFP File", suffixes = ["ufp"] ) ) self._snapshot = None - Application.getInstance().getOutputDeviceManager().writeStarted.connect(self._createSnapshot) def _createSnapshot(self, *args): # must be called from the main thread because of OpenGL @@ -62,6 +61,8 @@ class UFPWriter(MeshWriter): gcode.write(gcode_textio.getvalue().encode("UTF-8")) archive.addRelation(virtual_path = "/3D/model.gcode", relation_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") + self._createSnapshot() + #Store the thumbnail. if self._snapshot: archive.addContentType(extension = "png", mime_type = "image/png") From 6abd43f6903c7e0e1f3509a5ffacb27d22115882 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 4 Oct 2018 17:37:28 +0200 Subject: [PATCH 160/212] Add Polish to the list of available languages. Forgotten by mistake. --- resources/qml/Preferences/GeneralPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 5f60b23477..d751d3f101 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -170,7 +170,7 @@ UM.PreferencesPage append({ text: "日本語", code: "ja_JP" }) append({ text: "한국어", code: "ko_KR" }) append({ text: "Nederlands", code: "nl_NL" }) - //Polish is disabled for being incomplete: append({ text: "Polski", code: "pl_PL" }) + append({ text: "Polski", code: "pl_PL" }) append({ text: "Português do Brasil", code: "pt_BR" }) append({ text: "Português", code: "pt_PT" }) append({ text: "Русский", code: "ru_RU" }) From 866110d70c4379ab86131b2a031da69bed4c4fe7 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 4 Oct 2018 18:03:01 +0200 Subject: [PATCH 161/212] Take into account that can be empty layers below the model when the setting Remove empty layers is disabled. The empty layers are skipped if they are at the bottom. Also keeps the models printed with raft showing correclty. Contributes to CURA-5768. --- .../ProcessSlicedLayersJob.py | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 3953625c7e..594bf3a43e 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -2,6 +2,7 @@ #Cura is released under the terms of the LGPLv3 or higher. import gc +import sys from UM.Job import Job from UM.Application import Application @@ -95,23 +96,35 @@ class ProcessSlicedLayersJob(Job): layer_count = len(self._layers) # Find the minimum layer number + # When disabling the remove empty first layers setting, the minimum layer number will be a positive + # value. In that case the first empty layers will be discarded and start processing layers from the + # first layer with data. # When using a raft, the raft layers are sent as layers < 0. Instead of allowing layers < 0, we - # instead simply offset all other layers so the lowest layer is always 0. It could happens that - # the first raft layer has value -8 but there are just 4 raft (negative) layers. - min_layer_number = 0 + # simply offset all other layers so the lowest layer is always 0. It could happens that the first + # raft layer has value -8 but there are just 4 raft (negative) layers. + min_layer_number = sys.maxsize negative_layers = 0 for layer in self._layers: - if layer.id < min_layer_number: - min_layer_number = layer.id - if layer.id < 0: - negative_layers += 1 + if layer.repeatedMessageCount("path_segment") > 0: + if layer.id < min_layer_number: + min_layer_number = layer.id + if layer.id < 0: + negative_layers += 1 current_layer = 0 for layer in self._layers: - # Negative layers are offset by the minimum layer number, but the positive layers are just - # offset by the number of negative layers so there is no layer gap between raft and model - abs_layer_number = layer.id + abs(min_layer_number) if layer.id < 0 else layer.id + negative_layers + # If the layer is below the minimum, it means that there is no data, so that we don't create a layer + # data. However, if there are empty layers in between, we compute them. + if layer.id < min_layer_number: + continue + + # Layers are offset by the minimum layer number. In case the raft (negative layers) is being used, + # then the absolute layer number is adjusted by removing the empty layers that can be in between raft + # and the model + abs_layer_number = layer.id - min_layer_number + if layer.id >= 0 and negative_layers != 0: + abs_layer_number += (min_layer_number + negative_layers) layer_data.addLayer(abs_layer_number) this_layer = layer_data.getLayer(abs_layer_number) From 94164c58654bf121db9fd8212b70771827293632 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 5 Oct 2018 15:29:52 +0200 Subject: [PATCH 162/212] Add Charon, Shapely, Trimesh and NetworkX to credits --- resources/qml/AboutDialog.qml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/resources/qml/AboutDialog.qml b/resources/qml/AboutDialog.qml index 5d3b1d1544..9a7e53260b 100644 --- a/resources/qml/AboutDialog.qml +++ b/resources/qml/AboutDialog.qml @@ -19,6 +19,18 @@ UM.Dialog width: minimumWidth height: minimumHeight + Rectangle + { + width: parent.width + 2 * margin // margin from Dialog.qml + height: version.y + version.height + margin + + anchors.top: parent.top + anchors.topMargin: - margin + anchors.horizontalCenter: parent.horizontalCenter + + color: UM.Theme.getColor("viewport_background") + } + Image { id: logo @@ -42,6 +54,7 @@ UM.Dialog text: catalog.i18nc("@label","version: %1").arg(UM.Application.version) font: UM.Theme.getFont("large") + color: UM.Theme.getColor("text") anchors.right : logo.right anchors.top: logo.bottom anchors.topMargin: (UM.Theme.getSize("default_margin").height / 2) | 0 @@ -75,6 +88,7 @@ UM.Dialog ScrollView { + id: credits anchors.top: creditsNotes.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height @@ -128,7 +142,11 @@ UM.Dialog projectsModel.append({ name:"SciPy", description: catalog.i18nc("@label", "Support library for scientific computing"), license: "BSD-new", url: "https://www.scipy.org/" }); projectsModel.append({ name:"NumPy", description: catalog.i18nc("@label", "Support library for faster math"), license: "BSD", url: "http://www.numpy.org/" }); projectsModel.append({ name:"NumPy-STL", description: catalog.i18nc("@label", "Support library for handling STL files"), license: "BSD", url: "https://github.com/WoLpH/numpy-stl" }); + projectsModel.append({ name:"Shapely", description: catalog.i18nc("@label", "Support library for handling planar objects"), license: "BSD", url: "https://github.com/Toblerity/Shapely" }); + projectsModel.append({ name:"Trimesh", description: catalog.i18nc("@label", "Support library for handling triangular meshes"), license: "MIT", url: "https://trimsh.org" }); + projectsModel.append({ name:"NetworkX", description: catalog.i18nc("@label", "Support library for analysis of complex networks"), license: "3-clause BSD", url: "https://networkx.github.io/" }); projectsModel.append({ name:"libSavitar", description: catalog.i18nc("@label", "Support library for handling 3MF files"), license: "LGPLv3", url: "https://github.com/ultimaker/libsavitar" }); + projectsModel.append({ name:"libCharon", description: catalog.i18nc("@label", "Support library for file metadata and streaming"), license: "LGPLv3", url: "https://github.com/ultimaker/libcharon" }); projectsModel.append({ name:"PySerial", description: catalog.i18nc("@label", "Serial communication library"), license: "Python", url: "http://pyserial.sourceforge.net/" }); projectsModel.append({ name:"python-zeroconf", description: catalog.i18nc("@label", "ZeroConf discovery library"), license: "LGPL", url: "https://github.com/jstasiak/python-zeroconf" }); projectsModel.append({ name:"Clipper", description: catalog.i18nc("@label", "Polygon clipping library"), license: "Boost", url: "http://www.angusj.com/delphi/clipper.php" }); From 39652185011d9b3f171ff88bf86336f9167be3b6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 8 Oct 2018 14:40:38 +0200 Subject: [PATCH 163/212] Fix value templating for gcode CURA-5793 Fix GcodeStartEndFormatter to take the correct default_extruder_nr instead of always using -1. --- plugins/CuraEngineBackend/StartSliceJob.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 28e442033b..bb9387a65d 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -41,11 +41,15 @@ class StartJobResult(IntEnum): ## Formatter class that handles token expansion in start/end gcode class GcodeStartEndFormatter(Formatter): - def get_value(self, key: str, args: str, kwargs: dict, default_extruder_nr: str = "-1") -> str: #type: ignore # [CodeStyle: get_value is an overridden function from the Formatter class] + def __init__(self, default_extruder_nr: int = -1) -> None: + super().__init__() + self._default_extruder_nr = default_extruder_nr + + def get_value(self, key: str, args: str, kwargs: dict) -> str: #type: ignore # [CodeStyle: get_value is an overridden function from the Formatter class] # The kwargs dictionary contains a dictionary for each stack (with a string of the extruder_nr as their key), # and a default_extruder_nr to use when no extruder_nr is specified - extruder_nr = int(default_extruder_nr) + extruder_nr = self._default_extruder_nr key_fragments = [fragment.strip() for fragment in key.split(",")] if len(key_fragments) == 2: @@ -339,7 +343,7 @@ class StartSliceJob(Job): try: # any setting can be used as a token - fmt = GcodeStartEndFormatter() + fmt = GcodeStartEndFormatter(default_extruder_nr = default_extruder_nr) settings = self._all_extruders_settings.copy() settings["default_extruder_nr"] = default_extruder_nr return str(fmt.format(value, **settings)) From 314b966cc90198b2526e405cc2bbea19201ee234 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 8 Oct 2018 15:03:21 +0200 Subject: [PATCH 164/212] Improvements to translated strings These strings were recently found to have been confusing to the translators. Improvements are: - Pulling the (untranslated) error message out of the message sentence. We really want the error message to be at the end so we'll force the translators to translate it as a prefix. - Remove extra spaces at the end. - Remove Python logic from within the i18nc call, since gettext doesn't understand that. Contributes to issue CURA-5741. --- cura/Settings/CuraContainerRegistry.py | 17 ++++++++--------- plugins/ImageReader/ConfigUI.qml | 10 +++++----- .../qml/ToolboxConfirmUninstallResetDialog.qml | 2 +- .../src/LegacyUM3OutputDevice.py | 3 +-- resources/qml/WorkspaceSummaryDialog.qml | 2 +- 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index e1f50a157d..962f4162b5 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -187,11 +187,11 @@ class CuraContainerRegistry(ContainerRegistry): try: profile_or_list = profile_reader.read(file_name) # Try to open the file with the profile reader. except NoProfileException: - return { "status": "ok", "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "No custom profile to import in file {0}", file_name)} + return { "status": "ok", "message": catalog.i18nc("@info:status Don't translate the XML tags !", "No custom profile to import in file {0}", file_name)} except Exception as e: # Note that this will fail quickly. That is, if any profile reader throws an exception, it will stop reading. It will only continue reading if the reader returned None. Logger.log("e", "Failed to import profile from %s: %s while using profile reader. Got exception %s", file_name, profile_reader.getPluginId(), str(e)) - return { "status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "Failed to import profile from {0}: {1}", file_name, "\n" + str(e))} + return { "status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags !", "Failed to import profile from {0}:", file_name) + "\n" + str(e) + ""} if profile_or_list: # Ensure it is always a list of profiles @@ -215,7 +215,7 @@ class CuraContainerRegistry(ContainerRegistry): if not global_profile: Logger.log("e", "Incorrect profile [%s]. Could not find global profile", file_name) return { "status": "error", - "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "This profile {0} contains incorrect data, could not import it.", file_name)} + "message": catalog.i18nc("@info:status Don't translate the XML tags !", "This profile {0} contains incorrect data, could not import it.", file_name)} profile_definition = global_profile.getMetaDataEntry("definition") # Make sure we have a profile_definition in the file: @@ -225,7 +225,7 @@ class CuraContainerRegistry(ContainerRegistry): if not machine_definition: Logger.log("e", "Incorrect profile [%s]. Unknown machine type [%s]", file_name, profile_definition) return {"status": "error", - "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "This profile {0} contains incorrect data, could not import it.", file_name) + "message": catalog.i18nc("@info:status Don't translate the XML tags !", "This profile {0} contains incorrect data, could not import it.", file_name) } machine_definition = machine_definition[0] @@ -238,7 +238,7 @@ class CuraContainerRegistry(ContainerRegistry): if profile_definition != expected_machine_definition: Logger.log("e", "Profile [%s] is for machine [%s] but the current active machine is [%s]. Will not import the profile", file_name, profile_definition, expected_machine_definition) return { "status": "error", - "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "The machine defined in profile {0} ({1}) doesn't match with your current machine ({2}), could not import it.", file_name, profile_definition, expected_machine_definition)} + "message": catalog.i18nc("@info:status Don't translate the XML tags !", "The machine defined in profile {0} ({1}) doesn't match with your current machine ({2}), could not import it.", file_name, profile_definition, expected_machine_definition)} # Fix the global quality profile's definition field in case it's not correct global_profile.setMetaDataEntry("definition", expected_machine_definition) @@ -269,8 +269,7 @@ class CuraContainerRegistry(ContainerRegistry): if idx == 0: # move all per-extruder settings to the first extruder's quality_changes for qc_setting_key in global_profile.getAllKeys(): - settable_per_extruder = global_stack.getProperty(qc_setting_key, - "settable_per_extruder") + settable_per_extruder = global_stack.getProperty(qc_setting_key, "settable_per_extruder") if settable_per_extruder: setting_value = global_profile.getProperty(qc_setting_key, "value") @@ -310,8 +309,8 @@ class CuraContainerRegistry(ContainerRegistry): if result is not None: return {"status": "error", "message": catalog.i18nc( "@info:status Don't translate the XML tags or !", - "Failed to import profile from {0}: {1}", - file_name, result)} + "Failed to import profile from {0}:", + file_name) + " " + result + ""} return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())} diff --git a/plugins/ImageReader/ConfigUI.qml b/plugins/ImageReader/ConfigUI.qml index d829f46459..12c6aa8dde 100644 --- a/plugins/ImageReader/ConfigUI.qml +++ b/plugins/ImageReader/ConfigUI.qml @@ -35,7 +35,7 @@ UM.Dialog width: parent.width Label { - text: catalog.i18nc("@action:label","Height (mm)") + text: catalog.i18nc("@action:label", "Height (mm)") width: 150 * screenScaleFactor anchors.verticalCenter: parent.verticalCenter } @@ -58,7 +58,7 @@ UM.Dialog width: parent.width Label { - text: catalog.i18nc("@action:label","Base (mm)") + text: catalog.i18nc("@action:label", "Base (mm)") width: 150 * screenScaleFactor anchors.verticalCenter: parent.verticalCenter } @@ -81,7 +81,7 @@ UM.Dialog width: parent.width Label { - text: catalog.i18nc("@action:label","Width (mm)") + text: catalog.i18nc("@action:label", "Width (mm)") width: 150 * screenScaleFactor anchors.verticalCenter: parent.verticalCenter } @@ -105,7 +105,7 @@ UM.Dialog width: parent.width Label { - text: catalog.i18nc("@action:label","Depth (mm)") + text: catalog.i18nc("@action:label", "Depth (mm)") width: 150 * screenScaleFactor anchors.verticalCenter: parent.verticalCenter } @@ -151,7 +151,7 @@ UM.Dialog width: parent.width Label { - text: catalog.i18nc("@action:label","Smoothing") + text: catalog.i18nc("@action:label", "Smoothing") width: 150 * screenScaleFactor anchors.verticalCenter: parent.verticalCenter } diff --git a/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml b/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml index 4aa8b883b7..2c5d08aa72 100644 --- a/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml +++ b/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml @@ -17,7 +17,7 @@ UM.Dialog // This dialog asks the user whether he/she wants to open a project file as a project or import models. id: base - title: catalog.i18nc("@title:window", "Confirm uninstall ") + toolbox.pluginToUninstall + title: catalog.i18nc("@title:window", "Confirm uninstall") + toolbox.pluginToUninstall width: 450 * screenScaleFactor height: 50 * screenScaleFactor + dialogText.height + buttonBar.height diff --git a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py index fe94500aa1..e786840803 100644 --- a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py @@ -100,8 +100,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): title=i18n_catalog.i18nc("@info:title", "Authentication status")) - self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", ""), - title=i18n_catalog.i18nc("@info:title", "Authentication Status")) + self._authentication_failed_message = Message("", title=i18n_catalog.i18nc("@info:title", "Authentication Status")) self._authentication_failed_message.addAction("Retry", i18n_catalog.i18nc("@action:button", "Retry"), None, i18n_catalog.i18nc("@info:tooltip", "Re-send the access request")) self._authentication_failed_message.actionTriggered.connect(self._messageCallback) diff --git a/resources/qml/WorkspaceSummaryDialog.qml b/resources/qml/WorkspaceSummaryDialog.qml index 24e94beb88..1b3a7aac55 100644 --- a/resources/qml/WorkspaceSummaryDialog.qml +++ b/resources/qml/WorkspaceSummaryDialog.qml @@ -117,7 +117,7 @@ UM.Dialog height: childrenRect.height Label { - text: catalog.i18nc("@action:label", Cura.MachineManager.activeMachineNetworkGroupName != "" ? "Printer Group" : "Name") + text: Cura.MachineManager.activeMachineNetworkGroupName != "" ? catalog.i18nc("@action:label", "Printer Group") : catalog.i18nc("@action:label", "Name") width: Math.floor(scroll.width / 3) | 0 } Label From 5ba60de20939754241edcd04903038ade60e7ca8 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 8 Oct 2018 15:59:46 +0200 Subject: [PATCH 165/212] Send extruder settings ordered by extruder position CURA-5799 --- plugins/CuraEngineBackend/StartSliceJob.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 28e442033b..780a495de8 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -247,7 +247,10 @@ class StartSliceJob(Job): self._buildGlobalInheritsStackMessage(stack) # Build messages for extruder stacks - for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): + # Send the extruder settings in the order of extruder positions. Somehow, if you send e.g. extruder 3 first, + # then CuraEngine can slice with the wrong settings. This I think should be fixed in CuraEngine as well. + extruder_stack_list = sorted(list(global_stack.extruders.items()), key = lambda item: int(item[0])) + for _, extruder_stack in extruder_stack_list: self._buildExtruderMessage(extruder_stack) for group in filtered_object_groups: From d1a51b26f765badf7c02ec84ee67d0ff63e8df27 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 8 Oct 2018 17:22:04 +0200 Subject: [PATCH 166/212] Simplified QML expression --- resources/qml/Preferences/Materials/MaterialsSlot.qml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/resources/qml/Preferences/Materials/MaterialsSlot.qml b/resources/qml/Preferences/Materials/MaterialsSlot.qml index c75c34b81a..a5af17f47a 100644 --- a/resources/qml/Preferences/Materials/MaterialsSlot.qml +++ b/resources/qml/Preferences/Materials/MaterialsSlot.qml @@ -41,15 +41,7 @@ Rectangle anchors.left: swatch.right anchors.verticalCenter: materialSlot.verticalCenter anchors.leftMargin: UM.Theme.getSize("narrow_margin").width - font.italic: - { - var selected_material = Cura.MachineManager.currentRootMaterialId[Cura.ExtruderManager.activeExtruderIndex] - if(selected_material == material.root_material_id) - { - return true - } - return false - } + font.italic: Cura.MachineManager.currentRootMaterialId[Cura.ExtruderManager.activeExtruderIndex] == material.root_material_id } MouseArea { From 18821b6527c918f622fd57caa0d5cfb711e15644 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Oct 2018 11:43:40 +0200 Subject: [PATCH 167/212] Add missing extruder def for Creality Ender 3 CURA-5806 --- resources/definitions/creality_ender3.def.json | 6 +++++- .../creality_ender3_extruder_0.def.json | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 resources/extruders/creality_ender3_extruder_0.def.json diff --git a/resources/definitions/creality_ender3.def.json b/resources/definitions/creality_ender3.def.json index 4ae4d4ad93..9745f28a93 100755 --- a/resources/definitions/creality_ender3.def.json +++ b/resources/definitions/creality_ender3.def.json @@ -8,7 +8,11 @@ "manufacturer": "Creality3D", "file_formats": "text/x-gcode", "platform": "creality_ender3_platform.stl", - "preferred_quality_type": "draft" + "preferred_quality_type": "draft", + "machine_extruder_trains": + { + "0": "creality_ender3_extruder_0" + } }, "overrides": { "machine_name": { diff --git a/resources/extruders/creality_ender3_extruder_0.def.json b/resources/extruders/creality_ender3_extruder_0.def.json new file mode 100644 index 0000000000..431366c777 --- /dev/null +++ b/resources/extruders/creality_ender3_extruder_0.def.json @@ -0,0 +1,16 @@ +{ + "id": "creality_ender3_extruder_0", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "creality_ender3", + "position": "0" + }, + + "overrides": { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} From a36deea651b6139f9290d585bb8945a29058c408 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 9 Oct 2018 16:26:45 +0200 Subject: [PATCH 168/212] Move updateFirmware to PrinterOutputDevice... along with codestyle and typing fixes --- cura/PrinterOutput/FirmwareUpdater.py | 22 +++++++++---------- cura/PrinterOutput/GenericOutputController.py | 8 +++---- cura/PrinterOutput/PrintJobOutputModel.py | 2 +- cura/PrinterOutputDevice.py | 14 +++++++++--- .../FirmwareUpdaterMachineAction.py | 7 +++--- .../FirmwareUpdaterMachineAction.qml | 4 ++-- plugins/USBPrinting/USBPrinterOutputDevice.py | 11 +--------- 7 files changed, 34 insertions(+), 34 deletions(-) diff --git a/cura/PrinterOutput/FirmwareUpdater.py b/cura/PrinterOutput/FirmwareUpdater.py index 92e92437ad..c6d9513ee0 100644 --- a/cura/PrinterOutput/FirmwareUpdater.py +++ b/cura/PrinterOutput/FirmwareUpdater.py @@ -22,16 +22,16 @@ class FirmwareUpdater(QObject): self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) - self._firmware_location = "" + self._firmware_file = "" self._firmware_progress = 0 self._firmware_update_state = FirmwareUpdateState.idle - def updateFirmware(self, file: Union[str, QUrl]) -> None: + def updateFirmware(self, firmware_file: Union[str, QUrl]) -> None: # the file path could be url-encoded. - if file.startswith("file://"): - self._firmware_location = QUrl(file).toLocalFile() + if firmware_file.startswith("file://"): + self._firmware_file = QUrl(firmware_file).toLocalFile() else: - self._firmware_location = file + self._firmware_file = firmware_file self._setFirmwareUpdateState(FirmwareUpdateState.updating) @@ -44,26 +44,26 @@ class FirmwareUpdater(QObject): def _cleanupAfterUpdate(self) -> None: # Clean up for next attempt. self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) - self._firmware_location = "" + self._firmware_file = "" self._onFirmwareProgress(100) self._setFirmwareUpdateState(FirmwareUpdateState.completed) - @pyqtProperty(float, notify = firmwareProgressChanged) - def firmwareProgress(self) -> float: + @pyqtProperty(int, notify = firmwareProgressChanged) + def firmwareProgress(self) -> int: return self._firmware_progress @pyqtProperty(int, notify=firmwareUpdateStateChanged) def firmwareUpdateState(self) -> "FirmwareUpdateState": return self._firmware_update_state - def _setFirmwareUpdateState(self, state) -> None: + def _setFirmwareUpdateState(self, state: "FirmwareUpdateState") -> None: if self._firmware_update_state != state: self._firmware_update_state = state self.firmwareUpdateStateChanged.emit() # Callback function for firmware update progress. - def _onFirmwareProgress(self, progress, max_progress = 100) -> None: - self._firmware_progress = (progress / max_progress) * 100 # Convert to scale of 0-100 + def _onFirmwareProgress(self, progress: int, max_progress: int = 100) -> None: + self._firmware_progress = int(progress * 100 / max_progress) # Convert to scale of 0-100 self.firmwareProgressChanged.emit() diff --git a/cura/PrinterOutput/GenericOutputController.py b/cura/PrinterOutput/GenericOutputController.py index 9434feea62..c538ae79f8 100644 --- a/cura/PrinterOutput/GenericOutputController.py +++ b/cura/PrinterOutput/GenericOutputController.py @@ -20,15 +20,15 @@ class GenericOutputController(PrinterOutputController): self._preheat_bed_timer = QTimer() self._preheat_bed_timer.setSingleShot(True) self._preheat_bed_timer.timeout.connect(self._onPreheatBedTimerFinished) - self._preheat_printer = None #type: Optional[PrinterOutputModel] + self._preheat_printer = None # type: Optional[PrinterOutputModel] self._preheat_hotends_timer = QTimer() self._preheat_hotends_timer.setSingleShot(True) self._preheat_hotends_timer.timeout.connect(self._onPreheatHotendsTimerFinished) - self._preheat_hotends = set() #type: Set[ExtruderOutputModel] + self._preheat_hotends = set() # type: Set[ExtruderOutputModel] self._output_device.printersChanged.connect(self._onPrintersChanged) - self._active_printer = None #type: Optional[PrinterOutputModel] + self._active_printer = None # type: Optional[PrinterOutputModel] def _onPrintersChanged(self) -> None: if self._active_printer: @@ -54,7 +54,7 @@ class GenericOutputController(PrinterOutputController): self._preheat_hotends_timer.stop() for extruder in self._preheat_hotends: extruder.updateIsPreheating(False) - self._preheat_hotends = set() #type: Set[ExtruderOutputModel] + self._preheat_hotends = set() # type: Set[ExtruderOutputModel] def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed) -> None: self._output_device.sendCommand("G91") diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 70878a7573..1415db16bd 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -91,7 +91,7 @@ class PrintJobOutputModel(QObject): def assignedPrinter(self): return self._assigned_printer - def updateAssignedPrinter(self, assigned_printer: Optional["PrinterOutputModel"]): + def updateAssignedPrinter(self, assigned_printer: Optional["PrinterOutputModel"]) -> None: if self._assigned_printer != assigned_printer: old_printer = self._assigned_printer self._assigned_printer = assigned_printer diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index c63f9c35b5..236b658eba 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -4,7 +4,7 @@ from UM.Decorators import deprecated from UM.i18n import i18nCatalog from UM.OutputDevice.OutputDevice import OutputDevice -from PyQt5.QtCore import pyqtProperty, QObject, QTimer, pyqtSignal +from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject, QTimer, QUrl from PyQt5.QtWidgets import QMessageBox from UM.Logger import Logger @@ -12,9 +12,10 @@ from UM.FileHandler.FileHandler import FileHandler #For typing. from UM.Scene.SceneNode import SceneNode #For typing. from UM.Signal import signalemitter from UM.Qt.QtApplication import QtApplication +from UM.FlameProfiler import pyqtSlot from enum import IntEnum # For the connection state tracking. -from typing import Callable, List, Optional +from typing import Callable, List, Optional, Union MYPY = False if MYPY: @@ -230,4 +231,11 @@ class PrinterOutputDevice(QObject, OutputDevice): return self._firmware_name def getFirmwareUpdater(self) -> Optional["FirmwareUpdater"]: - return self._firmware_updater \ No newline at end of file + return self._firmware_updater + + @pyqtSlot(str) + def updateFirmware(self, firmware_file: Union[str, QUrl]) -> None: + if not self._firmware_updater: + return + + self._firmware_updater.updateFirmware(firmware_file) \ No newline at end of file diff --git a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py index 981fb819eb..0a3e3a0ff0 100644 --- a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py +++ b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py @@ -15,6 +15,7 @@ MYPY = False if MYPY: from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdater from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice + from UM.Settings.ContainerInterface import ContainerInterface catalog = i18nCatalog("cura") @@ -25,15 +26,15 @@ class FirmwareUpdaterMachineAction(MachineAction): self._qml_url = "FirmwareUpdaterMachineAction.qml" ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) - self._active_output_device = None #type: Optional[PrinterOutputDevice] - self._active_firmware_updater = None #type: Optional[FirmwareUpdater] + self._active_output_device = None # type: Optional[PrinterOutputDevice] + self._active_firmware_updater = None # type: Optional[FirmwareUpdater] CuraApplication.getInstance().engineCreatedSignal.connect(self._onEngineCreated) def _onEngineCreated(self) -> None: CuraApplication.getInstance().getMachineManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) - def _onContainerAdded(self, container) -> None: + def _onContainerAdded(self, container: "ContainerInterface") -> None: # Add this action as a supported action to all machine definitions if they support USB connection if isinstance(container, DefinitionContainer) and container.getMetaDataEntry("type") == "machine" and container.getMetaDataEntry("supports_usb_connection"): CuraApplication.getInstance().getMachineActionManager().addSupportedAction(container.getId(), self.getKey()) diff --git a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml index ab5bb89347..9a56dbb20a 100644 --- a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml +++ b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml @@ -16,7 +16,7 @@ Cura.MachineAction anchors.fill: parent; property bool printerConnected: Cura.MachineManager.printerConnected property var activeOutputDevice: printerConnected ? Cura.MachineManager.printerOutputDevices[0] : null - property var canUpdateFirmware: activeOutputDevice ? activeOutputDevice.activePrinter.canUpdateFirmware : false + property bool canUpdateFirmware: activeOutputDevice ? activeOutputDevice.activePrinter.canUpdateFirmware : false Column { @@ -51,7 +51,7 @@ Cura.MachineAction anchors.horizontalCenter: parent.horizontalCenter width: childrenRect.width spacing: UM.Theme.getSize("default_margin").width - property var firmwareName: Cura.MachineManager.activeMachine.getDefaultFirmwareName() + property string firmwareName: Cura.MachineManager.activeMachine.getDefaultFirmwareName() Button { id: autoUpgradeButton diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 1fd2fdeb5c..b5ada76e6c 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -15,8 +15,6 @@ from cura.PrinterOutput.GenericOutputController import GenericOutputController from .AutoDetectBaudJob import AutoDetectBaudJob from .AvrFirmwareUpdater import AvrFirmwareUpdater -from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty, QUrl - from serial import Serial, SerialException, SerialTimeoutException from threading import Thread, Event from time import time, sleep @@ -98,13 +96,6 @@ class USBPrinterOutputDevice(PrinterOutputDevice): application = CuraApplication.getInstance() application.triggerNextExitCheck() - @pyqtSlot(str) - def updateFirmware(self, file: Union[str, QUrl]) -> None: - if not self._firmware_updater: - return - - self._firmware_updater.updateFirmware(file) - ## Reset USB device settings # def resetDeviceSettings(self) -> None: @@ -169,7 +160,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._baud_rate = baud_rate def connect(self): - self._firmware_name = None # after each connection ensure that the firmware name is removed + self._firmware_name = None # after each connection ensure that the firmware name is removed if self._baud_rate is None: if self._use_auto_detect: From ab7fe3138d8bdfa2e1ef1d5a91be93709896099f Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 9 Oct 2018 17:06:20 +0200 Subject: [PATCH 169/212] Remove unused imports --- cura/PrinterOutputDevice.py | 6 +++--- plugins/USBPrinting/AvrFirmwareUpdater.py | 8 ++++++-- plugins/USBPrinting/USBPrinterOutputDevice.py | 4 +--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 236b658eba..969aa3c460 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -8,8 +8,6 @@ from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject, QTimer, QUrl from PyQt5.QtWidgets import QMessageBox from UM.Logger import Logger -from UM.FileHandler.FileHandler import FileHandler #For typing. -from UM.Scene.SceneNode import SceneNode #For typing. from UM.Signal import signalemitter from UM.Qt.QtApplication import QtApplication from UM.FlameProfiler import pyqtSlot @@ -22,6 +20,8 @@ if MYPY: from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.ConfigurationModel import ConfigurationModel from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdater + from UM.FileHandler.FileHandler import FileHandler + from UM.Scene.SceneNode import SceneNode i18n_catalog = i18nCatalog("cura") @@ -131,7 +131,7 @@ class PrinterOutputDevice(QObject, OutputDevice): return None - def requestWrite(self, nodes: List[SceneNode], file_name: Optional[str] = None, limit_mimetypes: bool = False, file_handler: Optional[FileHandler] = None, **kwargs: str) -> None: + def requestWrite(self, nodes: List["SceneNode"], file_name: Optional[str] = None, limit_mimetypes: bool = False, file_handler: Optional["FileHandler"] = None, **kwargs: str) -> None: raise NotImplementedError("requestWrite needs to be implemented") @pyqtProperty(QObject, notify = printersChanged) diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py index 505e1ddb7e..b8650e9208 100644 --- a/plugins/USBPrinting/AvrFirmwareUpdater.py +++ b/plugins/USBPrinting/AvrFirmwareUpdater.py @@ -4,7 +4,6 @@ from UM.Logger import Logger from cura.CuraApplication import CuraApplication -from cura.PrinterOutputDevice import PrinterOutputDevice from cura.PrinterOutput.FirmwareUpdater import FirmwareUpdater, FirmwareUpdateState from .avr_isp import stk500v2, intelHex @@ -12,8 +11,13 @@ from serial import SerialException from time import sleep +MYPY = False +if MYPY: + from cura.PrinterOutputDevice import PrinterOutputDevice + + class AvrFirmwareUpdater(FirmwareUpdater): - def __init__(self, output_device: PrinterOutputDevice) -> None: + def __init__(self, output_device: "PrinterOutputDevice") -> None: super().__init__(output_device) def _updateFirmware(self) -> None: diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index b5ada76e6c..4c3e7ee131 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -4,7 +4,6 @@ from UM.Logger import Logger from UM.i18n import i18nCatalog from UM.Qt.Duration import DurationFormat -from UM.PluginRegistry import PluginRegistry from cura.CuraApplication import CuraApplication from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState @@ -17,13 +16,12 @@ from .AvrFirmwareUpdater import AvrFirmwareUpdater from serial import Serial, SerialException, SerialTimeoutException from threading import Thread, Event -from time import time, sleep +from time import time from queue import Queue from typing import Union, Optional, List, cast import re import functools # Used for reduce -import os catalog = i18nCatalog("cura") From 382adf57dfad00fe69ded8a2f99af5d7b99d5450 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 10 Oct 2018 07:55:49 +0200 Subject: [PATCH 170/212] Use 0.1 layer height as normal for Ender 3 --- resources/definitions/creality_ender3.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/creality_ender3.def.json b/resources/definitions/creality_ender3.def.json index 9745f28a93..d3765ca9b3 100755 --- a/resources/definitions/creality_ender3.def.json +++ b/resources/definitions/creality_ender3.def.json @@ -60,7 +60,7 @@ "default_value": 20 }, "layer_height": { - "default_value": 0.15 + "default_value": 0.10 }, "layer_height_0": { "default_value": 0.2 From d3101b2fd95735a910750f4fbcfae5e702966a04 Mon Sep 17 00:00:00 2001 From: THeijmans Date: Wed, 10 Oct 2018 09:26:16 +0200 Subject: [PATCH 171/212] Fixed prim blob visibility Changed the wrong prime_blob setting, now it should be visible but disabled. --- resources/definitions/ultimaker_s5.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index 2024acdf73..57ba6e864e 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -63,7 +63,8 @@ "machine_end_gcode": { "default_value": "" }, "prime_tower_position_x": { "default_value": 345 }, "prime_tower_position_y": { "default_value": 222.5 }, - "prime_blob_enable": { "enabled": false }, + "prime_blob_enable": { "enabled": true }, + "prime_blob_enable": { "default_value": false }, "speed_travel": { From 6d852228e31fff075cc7381551e5c3287718c733 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 10 Oct 2018 09:29:42 +0200 Subject: [PATCH 172/212] Update ultimaker_s5.def.json --- resources/definitions/ultimaker_s5.def.json | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index 57ba6e864e..94e28eb8a5 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -63,7 +63,6 @@ "machine_end_gcode": { "default_value": "" }, "prime_tower_position_x": { "default_value": 345 }, "prime_tower_position_y": { "default_value": 222.5 }, - "prime_blob_enable": { "enabled": true }, "prime_blob_enable": { "default_value": false }, "speed_travel": From 01d95f51c8168e78a3900ca5127dfb99cfa134b9 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 10 Oct 2018 09:34:27 +0200 Subject: [PATCH 173/212] Fix prime blob enabled for S5 Still need that enabled = true... --- resources/definitions/ultimaker_s5.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index 94e28eb8a5..2e634787af 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -63,7 +63,7 @@ "machine_end_gcode": { "default_value": "" }, "prime_tower_position_x": { "default_value": 345 }, "prime_tower_position_y": { "default_value": 222.5 }, - "prime_blob_enable": { "default_value": false }, + "prime_blob_enable": { "enabled": true, "default_value": false }, "speed_travel": { From cc34e14215c234d0b448e0665a76d7d8a6360360 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 10 Oct 2018 11:52:14 +0200 Subject: [PATCH 174/212] Use ElideRight for long script names CURA-5683 --- plugins/PostProcessingPlugin/PostProcessingPlugin.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml index e91fc73cf4..22555562c0 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml @@ -115,6 +115,7 @@ UM.Dialog { wrapMode: Text.Wrap text: control.text + elide: Text.ElideRight color: activeScriptButton.checked ? palette.highlightedText : palette.text } } From e3861b0d90a6d90d94fb5e82a74a8c0d5144db14 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 10 Oct 2018 12:48:22 +0200 Subject: [PATCH 175/212] Add few more elide properties to ensure text doesnt' overlap --- plugins/PostProcessingPlugin/PostProcessingPlugin.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml index 22555562c0..d492e06462 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml @@ -62,6 +62,7 @@ UM.Dialog anchors.right: parent.right anchors.rightMargin: base.textMargin font: UM.Theme.getFont("large") + elide: Text.ElideRight } ListView { @@ -276,6 +277,7 @@ UM.Dialog anchors.leftMargin: base.textMargin anchors.right: parent.right anchors.rightMargin: base.textMargin + elide: Text.ElideRight height: 20 * screenScaleFactor font: UM.Theme.getFont("large") color: UM.Theme.getColor("text") From 4c6744b6fc75a3a9403bdd8c98664c807b8c597b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 10 Oct 2018 14:28:50 +0200 Subject: [PATCH 176/212] Code style: Space around binary operators I just looked for lines with interpolation = None because I was looking for another possible bug, but fixing this in the meanwhile too. --- cura/Settings/CuraContainerRegistry.py | 2 +- plugins/3MFReader/ThreeMFWorkspaceReader.py | 4 ++-- plugins/CuraProfileReader/CuraProfileReader.py | 2 +- plugins/LegacyProfileReader/LegacyProfileReader.py | 2 +- .../VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py | 2 +- .../VersionUpgrade25to26/VersionUpgrade25to26.py | 2 +- .../VersionUpgrade30to31/VersionUpgrade30to31.py | 6 +++--- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 962f4162b5..11640adc0f 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -685,7 +685,7 @@ class CuraContainerRegistry(ContainerRegistry): if not os.path.isfile(file_path): continue - parser = configparser.ConfigParser(interpolation=None) + parser = configparser.ConfigParser(interpolation = None) try: parser.read([file_path]) except: diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 36a725d148..429d4ab7d4 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -1012,7 +1012,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): ## Get the list of ID's of all containers in a container stack by partially parsing it's serialized data. def _getContainerIdListFromSerialized(self, serialized): - parser = ConfigParser(interpolation=None, empty_lines_in_values=False) + parser = ConfigParser(interpolation = None, empty_lines_in_values = False) parser.read_string(serialized) container_ids = [] @@ -1033,7 +1033,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): return container_ids def _getMachineNameFromSerializedStack(self, serialized): - parser = ConfigParser(interpolation=None, empty_lines_in_values=False) + parser = ConfigParser(interpolation = None, empty_lines_in_values = False) parser.read_string(serialized) return parser["general"].get("name", "") diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py index 5957b2cecf..11e58dac6d 100644 --- a/plugins/CuraProfileReader/CuraProfileReader.py +++ b/plugins/CuraProfileReader/CuraProfileReader.py @@ -50,7 +50,7 @@ class CuraProfileReader(ProfileReader): # \param profile_id \type{str} The name of the profile. # \return \type{List[Tuple[str,str]]} List of serialized profile strings and matching profile names. def _upgradeProfile(self, serialized, profile_id): - parser = configparser.ConfigParser(interpolation=None) + parser = configparser.ConfigParser(interpolation = None) parser.read_string(serialized) if "general" not in parser: diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 93c15ca8e0..cd577218d5 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -152,7 +152,7 @@ class LegacyProfileReader(ProfileReader): profile.setDirty(True) #Serialise and deserialise in order to perform the version upgrade. - parser = configparser.ConfigParser(interpolation=None) + parser = configparser.ConfigParser(interpolation = None) data = profile.serialize() parser.read_string(data) parser["general"]["version"] = "1" diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py b/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py index 730a62e591..a56f1f807b 100644 --- a/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py @@ -73,7 +73,7 @@ class VersionUpgrade22to24(VersionUpgrade): def __convertVariant(self, variant_path): # Copy the variant to the machine_instances/*_settings.inst.cfg - variant_config = configparser.ConfigParser(interpolation=None) + variant_config = configparser.ConfigParser(interpolation = None) with open(variant_path, "r", encoding = "utf-8") as fhandle: variant_config.read_file(fhandle) diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py b/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py index 2430b35ea0..6643edb765 100644 --- a/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py @@ -117,7 +117,7 @@ class VersionUpgrade25to26(VersionUpgrade): # \param serialised The serialised form of a quality profile. # \param filename The name of the file to upgrade. def upgradeMachineStack(self, serialised, filename): - parser = configparser.ConfigParser(interpolation=None) + parser = configparser.ConfigParser(interpolation = None) parser.read_string(serialised) # NOTE: This is for Custom FDM printers diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index a88ff5ac1c..399eb18b5d 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -84,7 +84,7 @@ class VersionUpgrade30to31(VersionUpgrade): # \param serialised The serialised form of a preferences file. # \param filename The name of the file to upgrade. def upgradePreferences(self, serialised, filename): - parser = configparser.ConfigParser(interpolation=None) + parser = configparser.ConfigParser(interpolation = None) parser.read_string(serialised) # Update version numbers @@ -105,7 +105,7 @@ class VersionUpgrade30to31(VersionUpgrade): # \param serialised The serialised form of the container file. # \param filename The name of the file to upgrade. def upgradeInstanceContainer(self, serialised, filename): - parser = configparser.ConfigParser(interpolation=None) + parser = configparser.ConfigParser(interpolation = None) parser.read_string(serialised) for each_section in ("general", "metadata"): @@ -130,7 +130,7 @@ class VersionUpgrade30to31(VersionUpgrade): # \param serialised The serialised form of a container stack. # \param filename The name of the file to upgrade. def upgradeStack(self, serialised, filename): - parser = configparser.ConfigParser(interpolation=None) + parser = configparser.ConfigParser(interpolation = None) parser.read_string(serialised) for each_section in ("general", "metadata"): From 10b5584ca68457dd25659a3273d9375602667c19 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 10 Oct 2018 16:24:13 +0200 Subject: [PATCH 177/212] [CURA-5483] Support more than just the UM3(E) for the firmware-update-check (add S5 only for now). --- .../FirmwareUpdateChecker.py | 22 +++- .../FirmwareUpdateCheckerJob.py | 103 ++++++++++++++---- 2 files changed, 100 insertions(+), 25 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index f01e8cb276..80a954c1cc 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -12,23 +12,34 @@ from UM.Settings.ContainerRegistry import ContainerRegistry from cura.Settings.GlobalStack import GlobalStack -from .FirmwareUpdateCheckerJob import FirmwareUpdateCheckerJob +from .FirmwareUpdateCheckerJob import FirmwareUpdateCheckerJob, MachineId, get_settings_key_for_machine i18n_catalog = i18nCatalog("cura") - ## This Extension checks for new versions of the firmware based on the latest checked version number. # The plugin is currently only usable for applications maintained by Ultimaker. But it should be relatively easy # to change it to work for other applications. class FirmwareUpdateChecker(Extension): JEDI_VERSION_URL = "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources" + UM_NEW_URL_TEMPLATE = "http://software.ultimaker.com/releases/firmware/{0}/stable/version.txt" + VERSION_URLS_PER_MACHINE = \ + { + MachineId.UM3: [JEDI_VERSION_URL, UM_NEW_URL_TEMPLATE.format(MachineId.UM3.value)], + MachineId.UM3E: [JEDI_VERSION_URL, UM_NEW_URL_TEMPLATE.format(MachineId.UM3E.value)], + MachineId.S5: [UM_NEW_URL_TEMPLATE.format(MachineId.S5.value)] + } + # The 'new'-style URL is the only way to check for S5 firmware, + # and in the future, the UM3 line will also switch over, but for now the old 'JEDI'-style URL is still needed. + # TODO: Parse all of that from a file, because this will be a big mess of large static values which gets worse with each printer. + # See also the to-do in FirmWareCheckerJob. def __init__(self): super().__init__() # Initialize the Preference called `latest_checked_firmware` that stores the last version - # checked for the UM3. In the future if we need to check other printers' firmware - Application.getInstance().getPreferences().addPreference("info/latest_checked_firmware", "") + # checked for each printer. + for machine_id in MachineId: + Application.getInstance().getPreferences().addPreference(get_settings_key_for_machine(machine_id), "") # Listen to a Signal that indicates a change in the list of printers, just if the user has enabled the # 'check for updates' option @@ -68,7 +79,8 @@ class FirmwareUpdateChecker(Extension): Logger.log("i", "A firmware update check is already running, do nothing.") return - self._check_job = FirmwareUpdateCheckerJob(container = container, silent = silent, url = self.JEDI_VERSION_URL, + self._check_job = FirmwareUpdateCheckerJob(container = container, silent = silent, + urls = self.VERSION_URLS_PER_MACHINE, callback = self._onActionTriggered, set_download_url_callback = self._onSetDownloadUrl) self._check_job.start() diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index eadacf2c02..658e820b4b 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -1,10 +1,13 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from enum import Enum, unique + from UM.Application import Application from UM.Message import Message from UM.Logger import Logger from UM.Job import Job +from UM.Version import Version import urllib.request import codecs @@ -12,49 +15,104 @@ import codecs from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") +# For UM-machines, these need to match the unique firmware-ID (also used in the URLs), i.o.t. only define in one place. +@unique +class MachineId(Enum): + UM3 = 9066 + UM3E = 9511 + S5 = 9051 + + +def get_settings_key_for_machine(machine_id: MachineId) -> str: + return "info/latest_checked_firmware_for_{0}".format(machine_id.value) + + +def default_parse_version_response(response: str) -> Version: + raw_str = response.split('\n', 1)[0].rstrip() + return Version(raw_str.split('.')) # Split it into a list; the default parsing of 'single string' is different. + ## This job checks if there is an update available on the provided URL. class FirmwareUpdateCheckerJob(Job): - def __init__(self, container = None, silent = False, url = None, callback = None, set_download_url_callback = None): + MACHINE_PER_NAME = \ + { + "ultimaker 3": MachineId.UM3, + "ultimaker 3 extended": MachineId.UM3E, + "ultimaker s5": MachineId.S5 + } + PARSE_VERSION_URL_PER_MACHINE = \ + { + MachineId.UM3: default_parse_version_response, + MachineId.UM3E: default_parse_version_response, + MachineId.S5: default_parse_version_response + } + REDIRECT_USER_PER_MACHINE = \ + { + MachineId.UM3: "https://ultimaker.com/en/resources/20500-upgrade-firmware", + MachineId.UM3E: "https://ultimaker.com/en/resources/20500-upgrade-firmware", + MachineId.S5: "https://ultimaker.com/en/resources/20500-upgrade-firmware" + } + # TODO: Parse all of that from a file, because this will be a big mess of large static values which gets worse with each printer. + + def __init__(self, container=None, silent=False, urls=None, callback=None, set_download_url_callback=None): super().__init__() self._container = container self.silent = silent - self._url = url + self._urls = urls self._callback = callback self._set_download_url_callback = set_download_url_callback + application_name = Application.getInstance().getApplicationName() + application_version = Application.getInstance().getVersion() + self._headers = {"User-Agent": "%s - %s" % (application_name, application_version)} + + def getUrlResponse(self, url: str) -> str: + request = urllib.request.Request(url, headers=self._headers) + current_version_file = urllib.request.urlopen(request) + reader = codecs.getreader("utf-8") + + return reader(current_version_file).read(firstline=True) + + def getCurrentVersionForMachine(self, machine_id: MachineId) -> Version: + max_version = Version([0, 0, 0]) + + machine_urls = self._urls.get(machine_id) + parse_function = self.PARSE_VERSION_URL_PER_MACHINE.get(machine_id) + if machine_urls is not None and parse_function is not None: + for url in machine_urls: + version = parse_function(self.getUrlResponse(url)) + if version > max_version: + max_version = version + + if max_version < Version([0, 0, 1]): + Logger.log('w', "MachineID {0} not handled!".format(repr(machine_id))) + + return max_version + def run(self): - if not self._url: + if not self._urls or self._urls is None: Logger.log("e", "Can not check for a new release. URL not set!") return try: - application_name = Application.getInstance().getApplicationName() - headers = {"User-Agent": "%s - %s" % (application_name, Application.getInstance().getVersion())} - request = urllib.request.Request(self._url, headers = headers) - current_version_file = urllib.request.urlopen(request) - reader = codecs.getreader("utf-8") - # get machine name from the definition container machine_name = self._container.definition.getName() machine_name_parts = machine_name.lower().split(" ") # If it is not None, then we compare between the checked_version and the current_version - # Now we just do that if the active printer is Ultimaker 3 or Ultimaker 3 Extended or any - # other Ultimaker 3 that will come in the future - if len(machine_name_parts) >= 2 and machine_name_parts[:2] == ["ultimaker", "3"]: - Logger.log("i", "You have a UM3 in printer list. Let's check the firmware!") + machine_id = self.MACHINE_PER_NAME.get(machine_name.lower()) + if machine_id is not None: + Logger.log("i", "You have a {0} in the printer list. Let's check the firmware!".format(machine_name)) - # Nothing to parse, just get the string - # TODO: In the future may be done by parsing a JSON file with diferent version for each printer model - current_version = reader(current_version_file).readline().rstrip() + current_version = self.getCurrentVersionForMachine(machine_id) # If it is the first time the version is checked, the checked_version is '' - checked_version = Application.getInstance().getPreferences().getValue("info/latest_checked_firmware") + setting_key_str = get_settings_key_for_machine(machine_id) + checked_version = Application.getInstance().getPreferences().getValue(setting_key_str) # If the checked_version is '', it's because is the first time we check firmware and in this case # we will not show the notification, but we will store it for the next time - Application.getInstance().getPreferences().setValue("info/latest_checked_firmware", current_version) + Application.getInstance().getPreferences().setValue(setting_key_str, current_version) Logger.log("i", "Reading firmware version of %s: checked = %s - latest = %s", machine_name, checked_version, current_version) # The first time we want to store the current version, the notification will not be shown, @@ -78,12 +136,17 @@ class FirmwareUpdateCheckerJob(Job): button_style=Message.ActionButtonStyle.LINK, button_align=Message.ActionButtonStyle.BUTTON_ALIGN_LEFT) - # If we do this in a cool way, the download url should be available in the JSON file if self._set_download_url_callback: - self._set_download_url_callback("https://ultimaker.com/en/resources/20500-upgrade-firmware") + redirect = self.REDIRECT_USER_PER_MACHINE.get(machine_id) + if redirect is not None: + self._set_download_url_callback(redirect) + else: + Logger.log('w', "No callback-url for firmware of {0}".format(repr(machine_id))) message.actionTriggered.connect(self._callback) message.show() + else: + Logger.log('i', "No machine with name {0} in list of firmware to check.".format(repr(machine_id))) except Exception as e: Logger.log("w", "Failed to check for new version: %s", e) From 487ef52c6616b8f15af9d7cd3140eaff5e46fbcb Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 10 Oct 2018 16:52:47 +0200 Subject: [PATCH 178/212] Warn on error and continue on encountering 'future-proof' (now) or old (later) version-URLs. --- .../FirmwareUpdateCheckerJob.py | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 658e820b4b..40546d4a05 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -10,6 +10,7 @@ from UM.Job import Job from UM.Version import Version import urllib.request +from urllib.error import URLError import codecs from UM.i18n import i18nCatalog @@ -62,16 +63,20 @@ class FirmwareUpdateCheckerJob(Job): self._callback = callback self._set_download_url_callback = set_download_url_callback - application_name = Application.getInstance().getApplicationName() - application_version = Application.getInstance().getVersion() - self._headers = {"User-Agent": "%s - %s" % (application_name, application_version)} + self._headers = {} # Don't set headers yet. def getUrlResponse(self, url: str) -> str: - request = urllib.request.Request(url, headers=self._headers) - current_version_file = urllib.request.urlopen(request) - reader = codecs.getreader("utf-8") + result = "0.0.0" - return reader(current_version_file).read(firstline=True) + try: + request = urllib.request.Request(url, headers=self._headers) + current_version_file = urllib.request.urlopen(request) + reader = codecs.getreader("utf-8") + result = reader(current_version_file).read(firstline=True) + except URLError: + Logger.log('w', "Could not reach '{0}', if this URL is old, consider removal.".format(url)) + + return result def getCurrentVersionForMachine(self, machine_id: MachineId) -> Version: max_version = Version([0, 0, 0]) @@ -95,6 +100,10 @@ class FirmwareUpdateCheckerJob(Job): return try: + application_name = Application.getInstance().getApplicationName() + application_version = Application.getInstance().getVersion() + self._headers = {"User-Agent": "%s - %s" % (application_name, application_version)} + # get machine name from the definition container machine_name = self._container.definition.getName() machine_name_parts = machine_name.lower().split(" ") From d8ed3d607403e34205dd46da300f2feaef82b2b0 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 11 Oct 2018 14:56:07 +0200 Subject: [PATCH 179/212] Check the whole list for firmware-updates instead of just the first added container. --- plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py | 7 ++++--- plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index 80a954c1cc..459d29265d 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -49,6 +49,7 @@ class FirmwareUpdateChecker(Extension): self._download_url = None self._check_job = None + self._name_cache = [] ## Callback for the message that is spawned when there is a new version. def _onActionTriggered(self, message, action): @@ -74,10 +75,10 @@ class FirmwareUpdateChecker(Extension): # \param silent type(boolean) Suppresses messages other than "new version found" messages. # This is used when checking for a new firmware version at startup. def checkFirmwareVersion(self, container = None, silent = False): - # Do not run multiple check jobs in parallel - if self._check_job is not None: - Logger.log("i", "A firmware update check is already running, do nothing.") + container_name = container.definition.getName() + if container_name in self._name_cache: return + self._name_cache.append(container_name) self._check_job = FirmwareUpdateCheckerJob(container = container, silent = silent, urls = self.VERSION_URLS_PER_MACHINE, diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 40546d4a05..14a40e3cce 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -34,6 +34,7 @@ def default_parse_version_response(response: str) -> Version: ## This job checks if there is an update available on the provided URL. + class FirmwareUpdateCheckerJob(Job): MACHINE_PER_NAME = \ { @@ -155,7 +156,7 @@ class FirmwareUpdateCheckerJob(Job): message.actionTriggered.connect(self._callback) message.show() else: - Logger.log('i', "No machine with name {0} in list of firmware to check.".format(repr(machine_id))) + Logger.log('i', "No machine with name {0} in list of firmware to check.".format(machine_name)) except Exception as e: Logger.log("w", "Failed to check for new version: %s", e) From 12999f48c848359e6ed33d8997bb9c193a63ae30 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 11 Oct 2018 15:27:04 +0200 Subject: [PATCH 180/212] FirmwareUpdateCheckerJob: Move introduced hardcoded values to static variables. --- .../FirmwareUpdateCheckerJob.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 14a40e3cce..41710e7e86 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -34,8 +34,11 @@ def default_parse_version_response(response: str) -> Version: ## This job checks if there is an update available on the provided URL. - class FirmwareUpdateCheckerJob(Job): + STRING_ZERO_VERSION = "0.0.0" + STRING_EPSILON_VERSION = "0.0.1" + ZERO_VERSION = Version(STRING_ZERO_VERSION) + EPSILON_VERSION = Version(STRING_EPSILON_VERSION) MACHINE_PER_NAME = \ { "ultimaker 3": MachineId.UM3, @@ -67,7 +70,7 @@ class FirmwareUpdateCheckerJob(Job): self._headers = {} # Don't set headers yet. def getUrlResponse(self, url: str) -> str: - result = "0.0.0" + result = self.STRING_ZERO_VERSION try: request = urllib.request.Request(url, headers=self._headers) @@ -80,7 +83,7 @@ class FirmwareUpdateCheckerJob(Job): return result def getCurrentVersionForMachine(self, machine_id: MachineId) -> Version: - max_version = Version([0, 0, 0]) + max_version = self.ZERO_VERSION machine_urls = self._urls.get(machine_id) parse_function = self.PARSE_VERSION_URL_PER_MACHINE.get(machine_id) @@ -90,7 +93,7 @@ class FirmwareUpdateCheckerJob(Job): if version > max_version: max_version = version - if max_version < Version([0, 0, 1]): + if max_version < self.EPSILON_VERSION: Logger.log('w', "MachineID {0} not handled!".format(repr(machine_id))) return max_version @@ -107,7 +110,6 @@ class FirmwareUpdateCheckerJob(Job): # get machine name from the definition container machine_name = self._container.definition.getName() - machine_name_parts = machine_name.lower().split(" ") # If it is not None, then we compare between the checked_version and the current_version machine_id = self.MACHINE_PER_NAME.get(machine_name.lower()) @@ -118,7 +120,7 @@ class FirmwareUpdateCheckerJob(Job): # If it is the first time the version is checked, the checked_version is '' setting_key_str = get_settings_key_for_machine(machine_id) - checked_version = Application.getInstance().getPreferences().getValue(setting_key_str) + checked_version = Version(Application.getInstance().getPreferences().getValue(setting_key_str)) # If the checked_version is '', it's because is the first time we check firmware and in this case # we will not show the notification, but we will store it for the next time From 6c2791f38240992465014969b7d0fb9c6335dfa6 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 11 Oct 2018 17:16:01 +0200 Subject: [PATCH 181/212] Parse the firmware-update-check lookup-tables from a (new) .json instead of hardcoded. --- .../FirmwareUpdateChecker.py | 47 +++++++----- .../FirmwareUpdateCheckerJob.py | 73 ++++++++++--------- .../resources/machines.json | 36 +++++++++ 3 files changed, 101 insertions(+), 55 deletions(-) create mode 100644 plugins/FirmwareUpdateChecker/resources/machines.json diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index 459d29265d..1736bb228a 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -1,18 +1,20 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import json, os from PyQt5.QtCore import QUrl from PyQt5.QtGui import QDesktopServices from UM.Extension import Extension from UM.Application import Application from UM.Logger import Logger +from UM.PluginRegistry import PluginRegistry from UM.i18n import i18nCatalog from UM.Settings.ContainerRegistry import ContainerRegistry from cura.Settings.GlobalStack import GlobalStack -from .FirmwareUpdateCheckerJob import FirmwareUpdateCheckerJob, MachineId, get_settings_key_for_machine +from .FirmwareUpdateCheckerJob import FirmwareUpdateCheckerJob, get_settings_key_for_machine i18n_catalog = i18nCatalog("cura") @@ -20,38 +22,23 @@ i18n_catalog = i18nCatalog("cura") # The plugin is currently only usable for applications maintained by Ultimaker. But it should be relatively easy # to change it to work for other applications. class FirmwareUpdateChecker(Extension): - JEDI_VERSION_URL = "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources" - UM_NEW_URL_TEMPLATE = "http://software.ultimaker.com/releases/firmware/{0}/stable/version.txt" - VERSION_URLS_PER_MACHINE = \ - { - MachineId.UM3: [JEDI_VERSION_URL, UM_NEW_URL_TEMPLATE.format(MachineId.UM3.value)], - MachineId.UM3E: [JEDI_VERSION_URL, UM_NEW_URL_TEMPLATE.format(MachineId.UM3E.value)], - MachineId.S5: [UM_NEW_URL_TEMPLATE.format(MachineId.S5.value)] - } - # The 'new'-style URL is the only way to check for S5 firmware, - # and in the future, the UM3 line will also switch over, but for now the old 'JEDI'-style URL is still needed. - # TODO: Parse all of that from a file, because this will be a big mess of large static values which gets worse with each printer. - # See also the to-do in FirmWareCheckerJob. def __init__(self): super().__init__() - # Initialize the Preference called `latest_checked_firmware` that stores the last version - # checked for each printer. - for machine_id in MachineId: - Application.getInstance().getPreferences().addPreference(get_settings_key_for_machine(machine_id), "") - # Listen to a Signal that indicates a change in the list of printers, just if the user has enabled the # 'check for updates' option Application.getInstance().getPreferences().addPreference("info/automatic_update_check", True) if Application.getInstance().getPreferences().getValue("info/automatic_update_check"): ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) + self._late_init = True # Init some things after creation, since we need the path from the plugin-mgr. self._download_url = None self._check_job = None self._name_cache = [] ## Callback for the message that is spawned when there is a new version. + # TODO: Set the right download URL for each message! def _onActionTriggered(self, message, action): if action == "download": if self._download_url is not None: @@ -68,6 +55,25 @@ class FirmwareUpdateChecker(Extension): def _onJobFinished(self, *args, **kwargs): self._check_job = None + def lateInit(self): + self._late_init = False + + # Open the .json file with the needed lookup-lists for each machine(/model) and retrieve 'raw' json. + self._machines_json = None + json_path = os.path.join(PluginRegistry.getInstance().getPluginPath("FirmwareUpdateChecker"), + "resources/machines.json") + with open(json_path, "r", encoding="utf-8") as json_file: + self._machines_json = json.load(json_file).get("machines") + if self._machines_json is None: + Logger.log('e', "Missing or inaccessible: {0}".format(json_path)) + return + + # Initialize the Preference called `latest_checked_firmware` that stores the last version + # checked for each printer. + for machine_json in self._machines_json: + machine_id = machine_json.get("id") + Application.getInstance().getPreferences().addPreference(get_settings_key_for_machine(machine_id), "") + ## Connect with software.ultimaker.com, load latest.version and check version info. # If the version info is different from the current version, spawn a message to # allow the user to download it. @@ -75,13 +81,16 @@ class FirmwareUpdateChecker(Extension): # \param silent type(boolean) Suppresses messages other than "new version found" messages. # This is used when checking for a new firmware version at startup. def checkFirmwareVersion(self, container = None, silent = False): + if self._late_init: + self.lateInit() + container_name = container.definition.getName() if container_name in self._name_cache: return self._name_cache.append(container_name) self._check_job = FirmwareUpdateCheckerJob(container = container, silent = silent, - urls = self.VERSION_URLS_PER_MACHINE, + machines_json = self._machines_json, callback = self._onActionTriggered, set_download_url_callback = self._onSetDownloadUrl) self._check_job.start() diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 41710e7e86..336b954f5e 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -16,16 +16,9 @@ import codecs from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") -# For UM-machines, these need to match the unique firmware-ID (also used in the URLs), i.o.t. only define in one place. -@unique -class MachineId(Enum): - UM3 = 9066 - UM3E = 9511 - S5 = 9051 - -def get_settings_key_for_machine(machine_id: MachineId) -> str: - return "info/latest_checked_firmware_for_{0}".format(machine_id.value) +def get_settings_key_for_machine(machine_id: int) -> str: + return "info/latest_checked_firmware_for_{0}".format(machine_id) def default_parse_version_response(response: str) -> Version: @@ -39,31 +32,39 @@ class FirmwareUpdateCheckerJob(Job): STRING_EPSILON_VERSION = "0.0.1" ZERO_VERSION = Version(STRING_ZERO_VERSION) EPSILON_VERSION = Version(STRING_EPSILON_VERSION) - MACHINE_PER_NAME = \ - { - "ultimaker 3": MachineId.UM3, - "ultimaker 3 extended": MachineId.UM3E, - "ultimaker s5": MachineId.S5 - } - PARSE_VERSION_URL_PER_MACHINE = \ - { - MachineId.UM3: default_parse_version_response, - MachineId.UM3E: default_parse_version_response, - MachineId.S5: default_parse_version_response - } - REDIRECT_USER_PER_MACHINE = \ - { - MachineId.UM3: "https://ultimaker.com/en/resources/20500-upgrade-firmware", - MachineId.UM3E: "https://ultimaker.com/en/resources/20500-upgrade-firmware", - MachineId.S5: "https://ultimaker.com/en/resources/20500-upgrade-firmware" - } - # TODO: Parse all of that from a file, because this will be a big mess of large static values which gets worse with each printer. + JSON_NAME_TO_VERSION_PARSE_FUNCTION = {"default": default_parse_version_response} - def __init__(self, container=None, silent=False, urls=None, callback=None, set_download_url_callback=None): + def __init__(self, container=None, silent=False, machines_json=None, callback=None, set_download_url_callback=None): super().__init__() self._container = container self.silent = silent - self._urls = urls + + # Parse all the needed lookup-tables from the '.json' file(s) in the resources folder. + # TODO: This should not be here when the merge to master is done, as it will be repeatedly recreated. + # It should be a separate object this constructor receives instead. + self._machine_ids = [] + self._machine_per_name = {} + self._parse_version_url_per_machine = {} + self._check_urls_per_machine = {} + self._redirect_user_per_machine = {} + try: + for machine_json in machines_json: + machine_id = machine_json.get("id") + machine_name = machine_json.get("name") + self._machine_ids.append(machine_id) + self._machine_per_name[machine_name] = machine_id + version_parse_function = self.JSON_NAME_TO_VERSION_PARSE_FUNCTION.get(machine_json.get("version_parser")) + if version_parse_function is None: + Logger.log('w', "No version-parse-function specified for machine {0}.".format(machine_name)) + version_parse_function = default_parse_version_response # Use default instead if nothing is found. + self._parse_version_url_per_machine[machine_id] = version_parse_function + self._check_urls_per_machine[machine_id] = [] # Multiple check-urls: see '_comment' in the .json file. + for check_url in machine_json.get("check_urls"): + self._check_urls_per_machine[machine_id].append(check_url) + self._redirect_user_per_machine[machine_id] = machine_json.get("update_url") + except: + Logger.log('e', "Couldn't parse firmware-update-check loopup-lists from file.") + self._callback = callback self._set_download_url_callback = set_download_url_callback @@ -82,11 +83,11 @@ class FirmwareUpdateCheckerJob(Job): return result - def getCurrentVersionForMachine(self, machine_id: MachineId) -> Version: + def getCurrentVersionForMachine(self, machine_id: int) -> Version: max_version = self.ZERO_VERSION - machine_urls = self._urls.get(machine_id) - parse_function = self.PARSE_VERSION_URL_PER_MACHINE.get(machine_id) + machine_urls = self._check_urls_per_machine.get(machine_id) + parse_function = self._parse_version_url_per_machine.get(machine_id) if machine_urls is not None and parse_function is not None: for url in machine_urls: version = parse_function(self.getUrlResponse(url)) @@ -99,7 +100,7 @@ class FirmwareUpdateCheckerJob(Job): return max_version def run(self): - if not self._urls or self._urls is None: + if not self._machine_ids or self._machine_ids is None: Logger.log("e", "Can not check for a new release. URL not set!") return @@ -112,7 +113,7 @@ class FirmwareUpdateCheckerJob(Job): machine_name = self._container.definition.getName() # If it is not None, then we compare between the checked_version and the current_version - machine_id = self.MACHINE_PER_NAME.get(machine_name.lower()) + machine_id = self._machine_per_name.get(machine_name.lower()) if machine_id is not None: Logger.log("i", "You have a {0} in the printer list. Let's check the firmware!".format(machine_name)) @@ -150,7 +151,7 @@ class FirmwareUpdateCheckerJob(Job): # If we do this in a cool way, the download url should be available in the JSON file if self._set_download_url_callback: - redirect = self.REDIRECT_USER_PER_MACHINE.get(machine_id) + redirect = self._redirect_user_per_machine.get(machine_id) if redirect is not None: self._set_download_url_callback(redirect) else: diff --git a/plugins/FirmwareUpdateChecker/resources/machines.json b/plugins/FirmwareUpdateChecker/resources/machines.json new file mode 100644 index 0000000000..5dc9aadbbf --- /dev/null +++ b/plugins/FirmwareUpdateChecker/resources/machines.json @@ -0,0 +1,36 @@ +{ + "_comment": "Multiple 'update_urls': The 'new'-style URL is the only way to check for S5 firmware, and in the future, the UM3 line will also switch over, but for now the old 'JEDI'-style URL is still needed.", + + "machines": + [ + { + "id": 9066, + "name": "ultimaker 3", + "check_urls": + [ + "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources", + "http://software.ultimaker.com/releases/firmware/9066/stable/version.txt" + ], + "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware", + "version_parser": "default" + }, + { + "id": 9511, + "name": "ultimaker 3 extended", + "check_urls": + [ + "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources", + "http://software.ultimaker.com/releases/firmware/9511/stable/version.txt" + ], + "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware", + "version_parser": "default" + }, + { + "id": 9051, + "name": "ultimaker s5", + "check_urls": ["http://software.ultimaker.com/releases/firmware/9051/stable/version.txt"], + "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware", + "version_parser": "default" + } + ] +} From 472d012c08f8c28a8eba29cf65baa50fa802aeda Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 11 Oct 2018 17:52:06 +0200 Subject: [PATCH 182/212] Move firmware-update-checker json-parsing to its own class (also don't repeat parsing each time). --- .../FirmwareUpdateChecker.py | 17 ++--- .../FirmwareUpdateCheckerJob.py | 51 +++----------- .../FirmwareUpdateCheckerLookup.py | 67 +++++++++++++++++++ 3 files changed, 81 insertions(+), 54 deletions(-) create mode 100644 plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index 1736bb228a..223cf2d433 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -15,6 +15,7 @@ from UM.Settings.ContainerRegistry import ContainerRegistry from cura.Settings.GlobalStack import GlobalStack from .FirmwareUpdateCheckerJob import FirmwareUpdateCheckerJob, get_settings_key_for_machine +from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup i18n_catalog = i18nCatalog("cura") @@ -58,20 +59,12 @@ class FirmwareUpdateChecker(Extension): def lateInit(self): self._late_init = False - # Open the .json file with the needed lookup-lists for each machine(/model) and retrieve 'raw' json. - self._machines_json = None - json_path = os.path.join(PluginRegistry.getInstance().getPluginPath("FirmwareUpdateChecker"), - "resources/machines.json") - with open(json_path, "r", encoding="utf-8") as json_file: - self._machines_json = json.load(json_file).get("machines") - if self._machines_json is None: - Logger.log('e', "Missing or inaccessible: {0}".format(json_path)) - return + self._lookups = FirmwareUpdateCheckerLookup(os.path.join(PluginRegistry.getInstance().getPluginPath( + "FirmwareUpdateChecker"), "resources/machines.json")) # Initialize the Preference called `latest_checked_firmware` that stores the last version # checked for each printer. - for machine_json in self._machines_json: - machine_id = machine_json.get("id") + for machine_id in self._lookups.getMachineIds(): Application.getInstance().getPreferences().addPreference(get_settings_key_for_machine(machine_id), "") ## Connect with software.ultimaker.com, load latest.version and check version info. @@ -90,7 +83,7 @@ class FirmwareUpdateChecker(Extension): self._name_cache.append(container_name) self._check_job = FirmwareUpdateCheckerJob(container = container, silent = silent, - machines_json = self._machines_json, + lookups = self._lookups, callback = self._onActionTriggered, set_download_url_callback = self._onSetDownloadUrl) self._check_job.start() diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 336b954f5e..6d72e130b2 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -1,8 +1,6 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from enum import Enum, unique - from UM.Application import Application from UM.Message import Message from UM.Logger import Logger @@ -13,6 +11,8 @@ import urllib.request from urllib.error import URLError import codecs +from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup + from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") @@ -21,53 +21,20 @@ def get_settings_key_for_machine(machine_id: int) -> str: return "info/latest_checked_firmware_for_{0}".format(machine_id) -def default_parse_version_response(response: str) -> Version: - raw_str = response.split('\n', 1)[0].rstrip() - return Version(raw_str.split('.')) # Split it into a list; the default parsing of 'single string' is different. - - ## This job checks if there is an update available on the provided URL. class FirmwareUpdateCheckerJob(Job): STRING_ZERO_VERSION = "0.0.0" STRING_EPSILON_VERSION = "0.0.1" ZERO_VERSION = Version(STRING_ZERO_VERSION) EPSILON_VERSION = Version(STRING_EPSILON_VERSION) - JSON_NAME_TO_VERSION_PARSE_FUNCTION = {"default": default_parse_version_response} - def __init__(self, container=None, silent=False, machines_json=None, callback=None, set_download_url_callback=None): + def __init__(self, container=None, silent=False, lookups:FirmwareUpdateCheckerLookup=None, callback=None, set_download_url_callback=None): super().__init__() self._container = container self.silent = silent - - # Parse all the needed lookup-tables from the '.json' file(s) in the resources folder. - # TODO: This should not be here when the merge to master is done, as it will be repeatedly recreated. - # It should be a separate object this constructor receives instead. - self._machine_ids = [] - self._machine_per_name = {} - self._parse_version_url_per_machine = {} - self._check_urls_per_machine = {} - self._redirect_user_per_machine = {} - try: - for machine_json in machines_json: - machine_id = machine_json.get("id") - machine_name = machine_json.get("name") - self._machine_ids.append(machine_id) - self._machine_per_name[machine_name] = machine_id - version_parse_function = self.JSON_NAME_TO_VERSION_PARSE_FUNCTION.get(machine_json.get("version_parser")) - if version_parse_function is None: - Logger.log('w', "No version-parse-function specified for machine {0}.".format(machine_name)) - version_parse_function = default_parse_version_response # Use default instead if nothing is found. - self._parse_version_url_per_machine[machine_id] = version_parse_function - self._check_urls_per_machine[machine_id] = [] # Multiple check-urls: see '_comment' in the .json file. - for check_url in machine_json.get("check_urls"): - self._check_urls_per_machine[machine_id].append(check_url) - self._redirect_user_per_machine[machine_id] = machine_json.get("update_url") - except: - Logger.log('e', "Couldn't parse firmware-update-check loopup-lists from file.") - self._callback = callback self._set_download_url_callback = set_download_url_callback - + self._lookups = lookups self._headers = {} # Don't set headers yet. def getUrlResponse(self, url: str) -> str: @@ -86,8 +53,8 @@ class FirmwareUpdateCheckerJob(Job): def getCurrentVersionForMachine(self, machine_id: int) -> Version: max_version = self.ZERO_VERSION - machine_urls = self._check_urls_per_machine.get(machine_id) - parse_function = self._parse_version_url_per_machine.get(machine_id) + machine_urls = self._lookups.getCheckUrlsFor(machine_id) + parse_function = self._lookups.getParseVersionUrlFor(machine_id) if machine_urls is not None and parse_function is not None: for url in machine_urls: version = parse_function(self.getUrlResponse(url)) @@ -100,7 +67,7 @@ class FirmwareUpdateCheckerJob(Job): return max_version def run(self): - if not self._machine_ids or self._machine_ids is None: + if self._lookups is None: Logger.log("e", "Can not check for a new release. URL not set!") return @@ -113,7 +80,7 @@ class FirmwareUpdateCheckerJob(Job): machine_name = self._container.definition.getName() # If it is not None, then we compare between the checked_version and the current_version - machine_id = self._machine_per_name.get(machine_name.lower()) + machine_id = self._lookups.getMachineByName(machine_name.lower()) if machine_id is not None: Logger.log("i", "You have a {0} in the printer list. Let's check the firmware!".format(machine_name)) @@ -151,7 +118,7 @@ class FirmwareUpdateCheckerJob(Job): # If we do this in a cool way, the download url should be available in the JSON file if self._set_download_url_callback: - redirect = self._redirect_user_per_machine.get(machine_id) + redirect = self._lookups.getRedirectUseror(machine_id) if redirect is not None: self._set_download_url_callback(redirect) else: diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py new file mode 100644 index 0000000000..62d43553c1 --- /dev/null +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py @@ -0,0 +1,67 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +import json, os + +from UM.Logger import Logger +from UM.Version import Version + +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("cura") + +def default_parse_version_response(response: str) -> Version: + raw_str = response.split('\n', 1)[0].rstrip() + return Version(raw_str.split('.')) # Split it into a list; the default parsing of 'single string' is different. + + +class FirmwareUpdateCheckerLookup: + JSON_NAME_TO_VERSION_PARSE_FUNCTION = {"default": default_parse_version_response} + + def __init__(self, json_path): + # Open the .json file with the needed lookup-lists for each machine(/model) and retrieve 'raw' json. + machines_json = None + with open(json_path, "r", encoding="utf-8") as json_file: + machines_json = json.load(json_file).get("machines") + if machines_json is None: + Logger.log('e', "Missing or inaccessible: {0}".format(json_path)) + return + + # Parse all the needed lookup-tables from the '.json' file(s) in the resources folder. + self._machine_ids = [] + self._machine_per_name = {} + self._parse_version_url_per_machine = {} + self._check_urls_per_machine = {} + self._redirect_user_per_machine = {} + try: + for machine_json in machines_json: + machine_id = machine_json.get("id") + machine_name = machine_json.get("name") + self._machine_ids.append(machine_id) + self._machine_per_name[machine_name] = machine_id + version_parse_function = \ + self.JSON_NAME_TO_VERSION_PARSE_FUNCTION.get(machine_json.get("version_parser")) + if version_parse_function is None: + Logger.log('w', "No version-parse-function specified for machine {0}.".format(machine_name)) + version_parse_function = default_parse_version_response # Use default instead if nothing is found. + self._parse_version_url_per_machine[machine_id] = version_parse_function + self._check_urls_per_machine[machine_id] = [] # Multiple check-urls: see '_comment' in the .json file. + for check_url in machine_json.get("check_urls"): + self._check_urls_per_machine[machine_id].append(check_url) + self._redirect_user_per_machine[machine_id] = machine_json.get("update_url") + except: + Logger.log('e', "Couldn't parse firmware-update-check loopup-lists from file.") + + def getMachineIds(self) -> [int]: + return self._machine_ids + + def getMachineByName(self, machine_name: str) -> int: + return self._machine_per_name.get(machine_name) + + def getParseVersionUrlFor(self, machine_id: int) -> str: + return self._parse_version_url_per_machine.get(machine_id) + + def getCheckUrlsFor(self, machine_id: int) -> [str]: + return self._check_urls_per_machine.get(machine_id) + + def getRedirectUseror(self, machine_id: int) -> str: + return self._redirect_user_per_machine.get(machine_id) From 4ecac6e27f71b9b8e6cd65aa8e96cc816c7e5428 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 11 Oct 2018 18:24:07 +0200 Subject: [PATCH 183/212] Set the right firmware-download-URL in the actual update-firmware-message. --- .../FirmwareUpdateChecker.py | 26 +++++++++---------- .../FirmwareUpdateCheckerJob.py | 19 +++----------- .../FirmwareUpdateCheckerLookup.py | 7 ++++- 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index 223cf2d433..90590fc5a2 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -14,8 +14,8 @@ from UM.Settings.ContainerRegistry import ContainerRegistry from cura.Settings.GlobalStack import GlobalStack -from .FirmwareUpdateCheckerJob import FirmwareUpdateCheckerJob, get_settings_key_for_machine -from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup +from .FirmwareUpdateCheckerJob import FirmwareUpdateCheckerJob +from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, get_settings_key_for_machine i18n_catalog = i18nCatalog("cura") @@ -39,14 +39,15 @@ class FirmwareUpdateChecker(Extension): self._name_cache = [] ## Callback for the message that is spawned when there is a new version. - # TODO: Set the right download URL for each message! def _onActionTriggered(self, message, action): - if action == "download": - if self._download_url is not None: - QDesktopServices.openUrl(QUrl(self._download_url)) - - def _onSetDownloadUrl(self, download_url): - self._download_url = download_url + try: + download_url = self._lookups.getRedirectUserFor(int(action)) + if download_url is not None: + QDesktopServices.openUrl(QUrl(download_url)) + else: + Logger.log('e', "Can't find URL for {0}".format(action)) + except: + Logger.log('e', "Don't know what to do with {0}".format(action)) def _onContainerAdded(self, container): # Only take care when a new GlobalStack was added @@ -56,7 +57,7 @@ class FirmwareUpdateChecker(Extension): def _onJobFinished(self, *args, **kwargs): self._check_job = None - def lateInit(self): + def doLateInit(self): self._late_init = False self._lookups = FirmwareUpdateCheckerLookup(os.path.join(PluginRegistry.getInstance().getPluginPath( @@ -75,7 +76,7 @@ class FirmwareUpdateChecker(Extension): # This is used when checking for a new firmware version at startup. def checkFirmwareVersion(self, container = None, silent = False): if self._late_init: - self.lateInit() + self.doLateInit() container_name = container.definition.getName() if container_name in self._name_cache: @@ -84,7 +85,6 @@ class FirmwareUpdateChecker(Extension): self._check_job = FirmwareUpdateCheckerJob(container = container, silent = silent, lookups = self._lookups, - callback = self._onActionTriggered, - set_download_url_callback = self._onSetDownloadUrl) + callback = self._onActionTriggered) self._check_job.start() self._check_job.finished.connect(self._onJobFinished) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 6d72e130b2..342287ca76 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -11,16 +11,12 @@ import urllib.request from urllib.error import URLError import codecs -from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup +from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, get_settings_key_for_machine from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") -def get_settings_key_for_machine(machine_id: int) -> str: - return "info/latest_checked_firmware_for_{0}".format(machine_id) - - ## This job checks if there is an update available on the provided URL. class FirmwareUpdateCheckerJob(Job): STRING_ZERO_VERSION = "0.0.0" @@ -28,12 +24,12 @@ class FirmwareUpdateCheckerJob(Job): ZERO_VERSION = Version(STRING_ZERO_VERSION) EPSILON_VERSION = Version(STRING_EPSILON_VERSION) - def __init__(self, container=None, silent=False, lookups:FirmwareUpdateCheckerLookup=None, callback=None, set_download_url_callback=None): + def __init__(self, container=None, silent=False, lookups:FirmwareUpdateCheckerLookup=None, callback=None): super().__init__() self._container = container self.silent = silent self._callback = callback - self._set_download_url_callback = set_download_url_callback + self._lookups = lookups self._headers = {} # Don't set headers yet. @@ -109,20 +105,13 @@ class FirmwareUpdateCheckerJob(Job): "@info:title The %s gets replaced with the printer name.", "New %s firmware available") % machine_name) - message.addAction("download", + message.addAction(machine_id, i18n_catalog.i18nc("@action:button", "How to update"), "[no_icon]", "[no_description]", button_style=Message.ActionButtonStyle.LINK, button_align=Message.ActionButtonStyle.BUTTON_ALIGN_LEFT) - # If we do this in a cool way, the download url should be available in the JSON file - if self._set_download_url_callback: - redirect = self._lookups.getRedirectUseror(machine_id) - if redirect is not None: - self._set_download_url_callback(redirect) - else: - Logger.log('w', "No callback-url for firmware of {0}".format(repr(machine_id))) message.actionTriggered.connect(self._callback) message.show() else: diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py index 62d43553c1..f2c9082f76 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py @@ -9,6 +9,11 @@ from UM.Version import Version from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") + +def get_settings_key_for_machine(machine_id: int) -> str: + return "info/latest_checked_firmware_for_{0}".format(machine_id) + + def default_parse_version_response(response: str) -> Version: raw_str = response.split('\n', 1)[0].rstrip() return Version(raw_str.split('.')) # Split it into a list; the default parsing of 'single string' is different. @@ -63,5 +68,5 @@ class FirmwareUpdateCheckerLookup: def getCheckUrlsFor(self, machine_id: int) -> [str]: return self._check_urls_per_machine.get(machine_id) - def getRedirectUseror(self, machine_id: int) -> str: + def getRedirectUserFor(self, machine_id: int) -> str: return self._redirect_user_per_machine.get(machine_id) From 6a50487bf0c2a0226650fbb96cd2bf3d0fd28db6 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 11 Oct 2018 19:16:10 +0200 Subject: [PATCH 184/212] Catch the one that got away --- plugins/USBPrinting/AvrFirmwareUpdater.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py index b8650e9208..56e3f99c23 100644 --- a/plugins/USBPrinting/AvrFirmwareUpdater.py +++ b/plugins/USBPrinting/AvrFirmwareUpdater.py @@ -22,7 +22,7 @@ class AvrFirmwareUpdater(FirmwareUpdater): def _updateFirmware(self) -> None: try: - hex_file = intelHex.readHex(self._firmware_location) + hex_file = intelHex.readHex(self._firmware_file) assert len(hex_file) > 0 except (FileNotFoundError, AssertionError): Logger.log("e", "Unable to read provided hex file. Could not update firmware.") From f2b50c748c1aea35e61de119fb3a08a28afdb295 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 11 Oct 2018 21:54:27 +0200 Subject: [PATCH 185/212] Fix typing in the FirmwareUpdateChecker plugin. --- .../FirmwareUpdateChecker.py | 14 +++++---- .../FirmwareUpdateCheckerJob.py | 5 ++-- .../FirmwareUpdateCheckerLookup.py | 30 ++++++++++--------- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index 90590fc5a2..71bdd0bc23 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -1,10 +1,12 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import json, os +import os from PyQt5.QtCore import QUrl from PyQt5.QtGui import QDesktopServices +from typing import List + from UM.Extension import Extension from UM.Application import Application from UM.Logger import Logger @@ -19,12 +21,13 @@ from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, get_settin i18n_catalog = i18nCatalog("cura") + ## This Extension checks for new versions of the firmware based on the latest checked version number. # The plugin is currently only usable for applications maintained by Ultimaker. But it should be relatively easy # to change it to work for other applications. class FirmwareUpdateChecker(Extension): - def __init__(self): + def __init__(self) -> None: super().__init__() # Listen to a Signal that indicates a change in the list of printers, just if the user has enabled the @@ -36,7 +39,8 @@ class FirmwareUpdateChecker(Extension): self._late_init = True # Init some things after creation, since we need the path from the plugin-mgr. self._download_url = None self._check_job = None - self._name_cache = [] + self._name_cache = [] # type: List[str] + self._lookups = None ## Callback for the message that is spawned when there is a new version. def _onActionTriggered(self, message, action): @@ -46,8 +50,8 @@ class FirmwareUpdateChecker(Extension): QDesktopServices.openUrl(QUrl(download_url)) else: Logger.log('e', "Can't find URL for {0}".format(action)) - except: - Logger.log('e', "Don't know what to do with {0}".format(action)) + except Exception as ex: + Logger.log('e', "Don't know what to do with '{0}' because {1}".format(action, ex)) def _onContainerAdded(self, container): # Only take care when a new GlobalStack was added diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 342287ca76..d186cbb4e4 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -9,6 +9,7 @@ from UM.Version import Version import urllib.request from urllib.error import URLError +from typing import Dict import codecs from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, get_settings_key_for_machine @@ -24,14 +25,14 @@ class FirmwareUpdateCheckerJob(Job): ZERO_VERSION = Version(STRING_ZERO_VERSION) EPSILON_VERSION = Version(STRING_EPSILON_VERSION) - def __init__(self, container=None, silent=False, lookups:FirmwareUpdateCheckerLookup=None, callback=None): + def __init__(self, container, silent, lookups: FirmwareUpdateCheckerLookup, callback) -> None: super().__init__() self._container = container self.silent = silent self._callback = callback self._lookups = lookups - self._headers = {} # Don't set headers yet. + self._headers = {} # type:Dict[str, str] # Don't set headers yet. def getUrlResponse(self, url: str) -> str: result = self.STRING_ZERO_VERSION diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py index f2c9082f76..f6d7a24da0 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py @@ -1,7 +1,9 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import json, os +import json + +from typing import Callable, Dict, List, Optional from UM.Logger import Logger from UM.Version import Version @@ -22,7 +24,7 @@ def default_parse_version_response(response: str) -> Version: class FirmwareUpdateCheckerLookup: JSON_NAME_TO_VERSION_PARSE_FUNCTION = {"default": default_parse_version_response} - def __init__(self, json_path): + def __init__(self, json_path) -> None: # Open the .json file with the needed lookup-lists for each machine(/model) and retrieve 'raw' json. machines_json = None with open(json_path, "r", encoding="utf-8") as json_file: @@ -32,11 +34,11 @@ class FirmwareUpdateCheckerLookup: return # Parse all the needed lookup-tables from the '.json' file(s) in the resources folder. - self._machine_ids = [] - self._machine_per_name = {} - self._parse_version_url_per_machine = {} - self._check_urls_per_machine = {} - self._redirect_user_per_machine = {} + self._machine_ids = [] # type:List[int] + self._machine_per_name = {} # type:Dict[str, int] + self._parse_version_url_per_machine = {} # type:Dict[int, Callable] + self._check_urls_per_machine = {} # type:Dict[int, List[str]] + self._redirect_user_per_machine = {} # type:Dict[int, str] try: for machine_json in machines_json: machine_id = machine_json.get("id") @@ -53,20 +55,20 @@ class FirmwareUpdateCheckerLookup: for check_url in machine_json.get("check_urls"): self._check_urls_per_machine[machine_id].append(check_url) self._redirect_user_per_machine[machine_id] = machine_json.get("update_url") - except: - Logger.log('e', "Couldn't parse firmware-update-check loopup-lists from file.") + except Exception as ex: + Logger.log('e', "Couldn't parse firmware-update-check loopup-lists from file because {0}.".format(ex)) - def getMachineIds(self) -> [int]: + def getMachineIds(self) -> List[int]: return self._machine_ids - def getMachineByName(self, machine_name: str) -> int: + def getMachineByName(self, machine_name: str) -> Optional[int]: return self._machine_per_name.get(machine_name) - def getParseVersionUrlFor(self, machine_id: int) -> str: + def getParseVersionUrlFor(self, machine_id: int) -> Optional[Callable]: return self._parse_version_url_per_machine.get(machine_id) - def getCheckUrlsFor(self, machine_id: int) -> [str]: + def getCheckUrlsFor(self, machine_id: int) -> Optional[List[str]]: return self._check_urls_per_machine.get(machine_id) - def getRedirectUserFor(self, machine_id: int) -> str: + def getRedirectUserFor(self, machine_id: int) -> Optional[str]: return self._redirect_user_per_machine.get(machine_id) From 69cef98c3041244bc9edb77ffe3f8c85f517ba19 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 12 Oct 2018 10:11:46 +0200 Subject: [PATCH 186/212] FirmwareUpdateChecker: Small fixes (typing and lowercase input). --- plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py | 5 ++--- plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index d186cbb4e4..09be95597b 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -39,9 +39,8 @@ class FirmwareUpdateCheckerJob(Job): try: request = urllib.request.Request(url, headers=self._headers) - current_version_file = urllib.request.urlopen(request) - reader = codecs.getreader("utf-8") - result = reader(current_version_file).read(firstline=True) + response = urllib.request.urlopen(request) + result = response.read().decode('utf-8') except URLError: Logger.log('w', "Could not reach '{0}', if this URL is old, consider removal.".format(url)) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py index f6d7a24da0..2e97a8869d 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py @@ -42,7 +42,7 @@ class FirmwareUpdateCheckerLookup: try: for machine_json in machines_json: machine_id = machine_json.get("id") - machine_name = machine_json.get("name") + machine_name = machine_json.get("name").lower() # Lower in case upper-case char are added to the json. self._machine_ids.append(machine_id) self._machine_per_name[machine_name] = machine_id version_parse_function = \ From f7bef851db0ab01d2bbd832ab3b466e17049661f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 12 Oct 2018 11:09:46 +0200 Subject: [PATCH 187/212] Remove code duplication for recreate network timer --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index d9c5707a03..f7c7f5d233 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -130,9 +130,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): # We need to check if the manager needs to be re-created. If we don't, we get some issues when OSX goes to # sleep. if time_since_last_response > self._recreate_network_manager_time: - if self._last_manager_create_time is None: - self._createNetworkManager() - elif time() - self._last_manager_create_time > self._recreate_network_manager_time: + if self._last_manager_create_time is None or time() - self._last_manager_create_time > self._recreate_network_manager_time: self._createNetworkManager() assert(self._manager is not None) elif self._connection_state == ConnectionState.closed: From ad80ea6dd47fdff1a67db98a66afa9e29202f031 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 12 Oct 2018 11:16:24 +0200 Subject: [PATCH 188/212] fix: limit to extruder of top/bottom polygon connector --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 305d841175..9da27f5040 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1221,7 +1221,7 @@ "type": "bool", "default_value": false, "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern == 'concentric'", - "limit_to_extruder": "infill_extruder_nr", + "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true }, "skin_angles": From 3c626453a69c3c66c76540d8ca2035a396c58b74 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 12 Oct 2018 11:28:13 +0200 Subject: [PATCH 189/212] Fix spelling --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 9da27f5040..f17dd63c0a 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1217,7 +1217,7 @@ "connect_skin_polygons": { "label": "Connect Top/Bottom Polygons", - "description": "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happend midway over infill this feature can reduce the top surface quality.", + "description": "Connect top/bottom skin paths where they run next to each other. For the concentric pattern enabling this setting greatly reduces the travel time, but because the connections can happen midway over infill this feature can reduce the top surface quality.", "type": "bool", "default_value": false, "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern == 'concentric'", From 85b835118dc91d829f7f5c31eb2b6b254f023d92 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 12 Oct 2018 13:24:09 +0200 Subject: [PATCH 190/212] Log which firmware file you're about to upload Kind of critical information, really. Contributes to issue CURA-5749. --- plugins/USBPrinting/USBPrinterOutputDevice.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 36c5321180..769820d6d0 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -59,9 +59,9 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._all_baud_rates = [115200, 250000, 230400, 57600, 38400, 19200, 9600] # Instead of using a timer, we really need the update to be as a thread, as reading from serial can block. - self._update_thread = Thread(target=self._update, daemon = True) + self._update_thread = Thread(target = self._update, daemon = True) - self._update_firmware_thread = Thread(target=self._updateFirmware, daemon = True) + self._update_firmware_thread = Thread(target = self._updateFirmware, daemon = True) self._last_temperature_request = None # type: Optional[int] @@ -160,6 +160,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if self._connection_state != ConnectionState.closed: self.close() + Logger.log("i", "Uploading hex file from: {firmware_location}".format(firmware_location = self._firmware_location)) try: hex_file = intelHex.readHex(self._firmware_location) assert len(hex_file) > 0 From 287689a073befd0d4da7612d26810410b1a03ae0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 12 Oct 2018 13:25:34 +0200 Subject: [PATCH 191/212] Don't cache the automatic firmware name The QML property was not updated when you change the printer. By not caching it, it gets the current printer's firmware file upon clicking the button. Simple and effective, and not that tough on computational power that it needs caching. Contributes to issue CURA-5749. --- .../UltimakerMachineActions/UpgradeFirmwareMachineAction.qml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml index ed771d2a04..fff7d2c46f 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Ultimaker B.V. +// Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -58,7 +58,6 @@ Cura.MachineAction anchors.horizontalCenter: parent.horizontalCenter width: childrenRect.width spacing: UM.Theme.getSize("default_margin").width - property var firmwareName: Cura.USBPrinterManager.getDefaultFirmwareName() Button { id: autoUpgradeButton @@ -66,7 +65,7 @@ Cura.MachineAction enabled: parent.firmwareName != "" && activeOutputDevice onClicked: { - activeOutputDevice.updateFirmware(parent.firmwareName) + activeOutputDevice.updateFirmware(Cura.USBPrinterManager.getDefaultFirmwareName()) } } Button From 99fc372b32058287e4113c211231458f1d129fae Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 12 Oct 2018 14:55:13 +0200 Subject: [PATCH 192/212] Update printer information when switching global container stacks This was just evaluated once during the creating of a USB connection. But you can switch out the printer without breaking/making a USB connection, so in that case we have to update it here. Contributes to issue CURA-5749. --- cura/PrinterOutput/PrinterOutputModel.py | 2 +- plugins/USBPrinting/USBPrinterOutputDevice.py | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index f009a33178..cc9463baec 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -172,7 +172,7 @@ class PrinterOutputModel(QObject): def getController(self): return self._controller - @pyqtProperty(str, notify=nameChanged) + @pyqtProperty(str, notify = nameChanged) def name(self): return self._name diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 769820d6d0..b61a62adc0 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -273,14 +273,18 @@ class USBPrinterOutputDevice(PrinterOutputDevice): except SerialException: Logger.log("w", "An exception occured while trying to create serial connection") return - container_stack = CuraApplication.getInstance().getGlobalContainerStack() - num_extruders = container_stack.getProperty("machine_extruder_count", "value") - # Ensure that a printer is created. - self._printers = [PrinterOutputModel(output_controller=GenericOutputController(self), number_of_extruders=num_extruders)] - self._printers[0].updateName(container_stack.getName()) + CuraApplication.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged) + self._onGlobalContainerStackChanged() self.setConnectionState(ConnectionState.connected) self._update_thread.start() + def _onGlobalContainerStackChanged(self): + container_stack = CuraApplication.getInstance().getGlobalContainerStack() + num_extruders = container_stack.getProperty("machine_extruder_count", "value") + #Ensure that a printer is created. + self._printers = [PrinterOutputModel(output_controller = GenericOutputController(self), number_of_extruders = num_extruders)] + self._printers[0].updateName(container_stack.getName()) + def close(self): super().close() if self._serial is not None: From 9e4fcd820eaf67cf431c2e2fe9a3957d6c14d4f9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 12 Oct 2018 14:56:27 +0200 Subject: [PATCH 193/212] Update outputDevice when the global container changed And directly link the active printer name to it, so that that also gets updated. With the property var it just gets evaluated upon creating the rectangle. Contributes to issue CURA-5749. --- resources/qml/PrintMonitor.qml | 2 +- resources/qml/PrinterOutput/OutputDeviceHeader.qml | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 3bfcea7025..12e95d1e89 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -44,7 +44,7 @@ Column Repeater { id: extrudersRepeater - model: activePrinter!=null ? activePrinter.extruders : null + model: activePrinter != null ? activePrinter.extruders : null ExtruderBox { diff --git a/resources/qml/PrinterOutput/OutputDeviceHeader.qml b/resources/qml/PrinterOutput/OutputDeviceHeader.qml index 03e6d78699..b5ed1b7b4e 100644 --- a/resources/qml/PrinterOutput/OutputDeviceHeader.qml +++ b/resources/qml/PrinterOutput/OutputDeviceHeader.qml @@ -14,11 +14,19 @@ Item implicitHeight: Math.floor(childrenRect.height + UM.Theme.getSize("default_margin").height * 2) property var outputDevice: null + Connections + { + target: Cura.MachineManager + onGlobalContainerChanged: + { + outputDevice = Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null; + } + } + Rectangle { height: childrenRect.height color: UM.Theme.getColor("setting_category") - property var activePrinter: outputDevice != null ? outputDevice.activePrinter : null Label { @@ -28,7 +36,7 @@ Item anchors.left: parent.left anchors.top: parent.top anchors.margins: UM.Theme.getSize("default_margin").width - text: outputDevice != null ? activePrinter.name : "" + text: outputDevice != null ? outputDevice.activePrinter.name : "" } Label From 6ac10db58248a3e0492b112ab816f39a9278a24f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 12 Oct 2018 15:37:43 +0200 Subject: [PATCH 194/212] Code style: Use double quotes for strings Contributes to issue CURA-5483. --- .../FirmwareUpdateChecker.py | 8 ++++---- .../FirmwareUpdateCheckerJob.py | 12 ++++++------ .../FirmwareUpdateCheckerLookup.py | 16 ++++++++-------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index 71bdd0bc23..e030d8f796 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import os @@ -31,7 +31,7 @@ class FirmwareUpdateChecker(Extension): super().__init__() # Listen to a Signal that indicates a change in the list of printers, just if the user has enabled the - # 'check for updates' option + # "check for updates" option Application.getInstance().getPreferences().addPreference("info/automatic_update_check", True) if Application.getInstance().getPreferences().getValue("info/automatic_update_check"): ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) @@ -49,9 +49,9 @@ class FirmwareUpdateChecker(Extension): if download_url is not None: QDesktopServices.openUrl(QUrl(download_url)) else: - Logger.log('e', "Can't find URL for {0}".format(action)) + Logger.log("e", "Can't find URL for {0}".format(action)) except Exception as ex: - Logger.log('e', "Don't know what to do with '{0}' because {1}".format(action, ex)) + Logger.log("e", "Don't know what to do with '{0}' because {1}".format(action, ex)) def _onContainerAdded(self, container): # Only take care when a new GlobalStack was added diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 09be95597b..41cc2358c1 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -40,9 +40,9 @@ class FirmwareUpdateCheckerJob(Job): try: request = urllib.request.Request(url, headers=self._headers) response = urllib.request.urlopen(request) - result = response.read().decode('utf-8') + result = response.read().decode("utf-8") except URLError: - Logger.log('w', "Could not reach '{0}', if this URL is old, consider removal.".format(url)) + Logger.log("w", "Could not reach '{0}', if this URL is old, consider removal.".format(url)) return result @@ -58,7 +58,7 @@ class FirmwareUpdateCheckerJob(Job): max_version = version if max_version < self.EPSILON_VERSION: - Logger.log('w', "MachineID {0} not handled!".format(repr(machine_id))) + Logger.log("w", "MachineID {0} not handled!".format(repr(machine_id))) return max_version @@ -82,11 +82,11 @@ class FirmwareUpdateCheckerJob(Job): current_version = self.getCurrentVersionForMachine(machine_id) - # If it is the first time the version is checked, the checked_version is '' + # If it is the first time the version is checked, the checked_version is "" setting_key_str = get_settings_key_for_machine(machine_id) checked_version = Version(Application.getInstance().getPreferences().getValue(setting_key_str)) - # If the checked_version is '', it's because is the first time we check firmware and in this case + # If the checked_version is "", it's because is the first time we check firmware and in this case # we will not show the notification, but we will store it for the next time Application.getInstance().getPreferences().setValue(setting_key_str, current_version) Logger.log("i", "Reading firmware version of %s: checked = %s - latest = %s", machine_name, checked_version, current_version) @@ -115,7 +115,7 @@ class FirmwareUpdateCheckerJob(Job): message.actionTriggered.connect(self._callback) message.show() else: - Logger.log('i', "No machine with name {0} in list of firmware to check.".format(machine_name)) + Logger.log("i", "No machine with name {0} in list of firmware to check.".format(machine_name)) except Exception as e: Logger.log("w", "Failed to check for new version: %s", e) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py index 2e97a8869d..ec8e7cc073 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py @@ -17,23 +17,23 @@ def get_settings_key_for_machine(machine_id: int) -> str: def default_parse_version_response(response: str) -> Version: - raw_str = response.split('\n', 1)[0].rstrip() - return Version(raw_str.split('.')) # Split it into a list; the default parsing of 'single string' is different. + raw_str = response.split("\n", 1)[0].rstrip() + return Version(raw_str.split(".")) # Split it into a list; the default parsing of "single string" is different. class FirmwareUpdateCheckerLookup: JSON_NAME_TO_VERSION_PARSE_FUNCTION = {"default": default_parse_version_response} def __init__(self, json_path) -> None: - # Open the .json file with the needed lookup-lists for each machine(/model) and retrieve 'raw' json. + # Open the .json file with the needed lookup-lists for each machine(/model) and retrieve "raw" json. machines_json = None with open(json_path, "r", encoding="utf-8") as json_file: machines_json = json.load(json_file).get("machines") if machines_json is None: - Logger.log('e', "Missing or inaccessible: {0}".format(json_path)) + Logger.log("e", "Missing or inaccessible: {0}".format(json_path)) return - # Parse all the needed lookup-tables from the '.json' file(s) in the resources folder. + # Parse all the needed lookup-tables from the ".json" file(s) in the resources folder. self._machine_ids = [] # type:List[int] self._machine_per_name = {} # type:Dict[str, int] self._parse_version_url_per_machine = {} # type:Dict[int, Callable] @@ -48,15 +48,15 @@ class FirmwareUpdateCheckerLookup: version_parse_function = \ self.JSON_NAME_TO_VERSION_PARSE_FUNCTION.get(machine_json.get("version_parser")) if version_parse_function is None: - Logger.log('w', "No version-parse-function specified for machine {0}.".format(machine_name)) + Logger.log("w", "No version-parse-function specified for machine {0}.".format(machine_name)) version_parse_function = default_parse_version_response # Use default instead if nothing is found. self._parse_version_url_per_machine[machine_id] = version_parse_function - self._check_urls_per_machine[machine_id] = [] # Multiple check-urls: see '_comment' in the .json file. + self._check_urls_per_machine[machine_id] = [] # Multiple check-urls: see "_comment" in the .json file. for check_url in machine_json.get("check_urls"): self._check_urls_per_machine[machine_id].append(check_url) self._redirect_user_per_machine[machine_id] = machine_json.get("update_url") except Exception as ex: - Logger.log('e', "Couldn't parse firmware-update-check loopup-lists from file because {0}.".format(ex)) + Logger.log("e", "Couldn't parse firmware-update-check loopup-lists from file because {0}.".format(ex)) def getMachineIds(self) -> List[int]: return self._machine_ids From e3b05f086740b0faba00d13a21ab5d3a23a0c224 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 12 Oct 2018 16:46:39 +0200 Subject: [PATCH 195/212] Code style: Spaces around binary operators Also removed the unused machines_json value. Contributes to issue CURA-5483. --- .../FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py | 10 +++++----- .../FirmwareUpdateCheckerLookup.py | 3 +-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 41cc2358c1..ee5eaac25b 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -38,7 +38,7 @@ class FirmwareUpdateCheckerJob(Job): result = self.STRING_ZERO_VERSION try: - request = urllib.request.Request(url, headers=self._headers) + request = urllib.request.Request(url, headers = self._headers) response = urllib.request.urlopen(request) result = response.read().decode("utf-8") except URLError: @@ -100,8 +100,8 @@ class FirmwareUpdateCheckerJob(Job): message = Message(i18n_catalog.i18nc( "@info Don't translate {machine_name}, since it gets replaced by a printer name!", "New features are available for your {machine_name}! It is recommended to update the firmware on your printer.").format( - machine_name=machine_name), - title=i18n_catalog.i18nc( + machine_name = machine_name), + title = i18n_catalog.i18nc( "@info:title The %s gets replaced with the printer name.", "New %s firmware available") % machine_name) @@ -109,8 +109,8 @@ class FirmwareUpdateCheckerJob(Job): i18n_catalog.i18nc("@action:button", "How to update"), "[no_icon]", "[no_description]", - button_style=Message.ActionButtonStyle.LINK, - button_align=Message.ActionButtonStyle.BUTTON_ALIGN_LEFT) + button_style = Message.ActionButtonStyle.LINK, + button_align = Message.ActionButtonStyle.BUTTON_ALIGN_LEFT) message.actionTriggered.connect(self._callback) message.show() diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py index ec8e7cc073..e283d58b2b 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py @@ -26,8 +26,7 @@ class FirmwareUpdateCheckerLookup: def __init__(self, json_path) -> None: # Open the .json file with the needed lookup-lists for each machine(/model) and retrieve "raw" json. - machines_json = None - with open(json_path, "r", encoding="utf-8") as json_file: + with open(json_path, "r", encoding = "utf-8") as json_file: machines_json = json.load(json_file).get("machines") if machines_json is None: Logger.log("e", "Missing or inaccessible: {0}".format(json_path)) From 1b7055f0f39f339f8bd1d4801203732ed8b1d318 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 12 Oct 2018 17:03:48 +0200 Subject: [PATCH 196/212] Fix spelling of error message Loopup -> Lookup. Contributes to issue CURA-5483. --- plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py index e283d58b2b..6d96ee36bb 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py @@ -55,7 +55,7 @@ class FirmwareUpdateCheckerLookup: self._check_urls_per_machine[machine_id].append(check_url) self._redirect_user_per_machine[machine_id] = machine_json.get("update_url") except Exception as ex: - Logger.log("e", "Couldn't parse firmware-update-check loopup-lists from file because {0}.".format(ex)) + Logger.log("e", "Couldn't parse firmware-update-check lookup-lists from file because {0}.".format(ex)) def getMachineIds(self) -> List[int]: return self._machine_ids From 6cf2e89f6b37b5d077d20b8e8dae2dd81c97c18c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Sat, 13 Oct 2018 16:40:26 +0200 Subject: [PATCH 197/212] Document CameraImageProvider Makes it easier than looking up the Qt documentation online. --- cura/CameraImageProvider.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/cura/CameraImageProvider.py b/cura/CameraImageProvider.py index 6a07f6b029..edb0f205c7 100644 --- a/cura/CameraImageProvider.py +++ b/cura/CameraImageProvider.py @@ -1,15 +1,26 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + from PyQt5.QtGui import QImage from PyQt5.QtQuick import QQuickImageProvider from PyQt5.QtCore import QSize from UM.Application import Application - +## Creates screenshots of the current scene. class CameraImageProvider(QQuickImageProvider): def __init__(self): super().__init__(QQuickImageProvider.Image) ## Request a new image. + # + # The image will be taken using the current camera position. + # Only the actual objects in the scene will get rendered. Not the build + # plate and such! + # \param id The ID for the image to create. This is the requested image + # source, with the "image:" scheme and provider identifier removed. It's + # a Qt thing, they'll provide this parameter. + # \param size The dimensions of the image to scale to. def requestImage(self, id, size): for output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): try: From 60408c14bcac5aac9ac8b623f1d455b06032cd09 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Sat, 13 Oct 2018 19:21:22 +0200 Subject: [PATCH 198/212] FirmwareUpdateChecker: Small refactors due to code review. --- .../FirmwareUpdateChecker.py | 33 ++++++++++--------- .../FirmwareUpdateCheckerJob.py | 6 ++-- .../FirmwareUpdateCheckerLookup.py | 10 +++--- .../resources/machines.json | 2 +- 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index e030d8f796..61604ff78b 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -5,19 +5,20 @@ import os from PyQt5.QtCore import QUrl from PyQt5.QtGui import QDesktopServices -from typing import List +from typing import Set from UM.Extension import Extension from UM.Application import Application from UM.Logger import Logger from UM.PluginRegistry import PluginRegistry +from UM.Qt.QtApplication import QtApplication from UM.i18n import i18nCatalog from UM.Settings.ContainerRegistry import ContainerRegistry from cura.Settings.GlobalStack import GlobalStack from .FirmwareUpdateCheckerJob import FirmwareUpdateCheckerJob -from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, get_settings_key_for_machine +from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, getSettingsKeyForMachine i18n_catalog = i18nCatalog("cura") @@ -36,22 +37,23 @@ class FirmwareUpdateChecker(Extension): if Application.getInstance().getPreferences().getValue("info/automatic_update_check"): ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) - self._late_init = True # Init some things after creation, since we need the path from the plugin-mgr. + # Partly initialize after creation, since we need our own path from the plugin-manager. self._download_url = None self._check_job = None - self._name_cache = [] # type: List[str] + self._checked_printer_names = [] # type: Set[str] self._lookups = None + QtApplication.pluginsLoaded.connect(self._onPluginsLoaded) ## Callback for the message that is spawned when there is a new version. def _onActionTriggered(self, message, action): - try: download_url = self._lookups.getRedirectUserFor(int(action)) if download_url is not None: - QDesktopServices.openUrl(QUrl(download_url)) + if QDesktopServices.openUrl(QUrl(download_url)): + Logger.log("i", "Redirected browser to {0} to show newly available firmware.".format(download_url)) + else: + Logger.log("e", "Can't reach URL: {0}".format(download_url)) else: Logger.log("e", "Can't find URL for {0}".format(action)) - except Exception as ex: - Logger.log("e", "Don't know what to do with '{0}' because {1}".format(action, ex)) def _onContainerAdded(self, container): # Only take care when a new GlobalStack was added @@ -61,8 +63,9 @@ class FirmwareUpdateChecker(Extension): def _onJobFinished(self, *args, **kwargs): self._check_job = None - def doLateInit(self): - self._late_init = False + def _onPluginsLoaded(self): + if self._lookups is not None: + return self._lookups = FirmwareUpdateCheckerLookup(os.path.join(PluginRegistry.getInstance().getPluginPath( "FirmwareUpdateChecker"), "resources/machines.json")) @@ -70,7 +73,7 @@ class FirmwareUpdateChecker(Extension): # Initialize the Preference called `latest_checked_firmware` that stores the last version # checked for each printer. for machine_id in self._lookups.getMachineIds(): - Application.getInstance().getPreferences().addPreference(get_settings_key_for_machine(machine_id), "") + Application.getInstance().getPreferences().addPreference(getSettingsKeyForMachine(machine_id), "") ## Connect with software.ultimaker.com, load latest.version and check version info. # If the version info is different from the current version, spawn a message to @@ -79,13 +82,13 @@ class FirmwareUpdateChecker(Extension): # \param silent type(boolean) Suppresses messages other than "new version found" messages. # This is used when checking for a new firmware version at startup. def checkFirmwareVersion(self, container = None, silent = False): - if self._late_init: - self.doLateInit() + if self._lookups is None: + self._onPluginsLoaded() container_name = container.definition.getName() - if container_name in self._name_cache: + if container_name in self._checked_printer_names: return - self._name_cache.append(container_name) + self._checked_printer_names.append(container_name) self._check_job = FirmwareUpdateCheckerJob(container = container, silent = silent, lookups = self._lookups, diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index ee5eaac25b..5bb9d076b6 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -12,7 +12,7 @@ from urllib.error import URLError from typing import Dict import codecs -from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, get_settings_key_for_machine +from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, getSettingsKeyForMachine from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") @@ -78,12 +78,12 @@ class FirmwareUpdateCheckerJob(Job): # If it is not None, then we compare between the checked_version and the current_version machine_id = self._lookups.getMachineByName(machine_name.lower()) if machine_id is not None: - Logger.log("i", "You have a {0} in the printer list. Let's check the firmware!".format(machine_name)) + Logger.log("i", "You have a(n) {0} in the printer list. Let's check the firmware!".format(machine_name)) current_version = self.getCurrentVersionForMachine(machine_id) # If it is the first time the version is checked, the checked_version is "" - setting_key_str = get_settings_key_for_machine(machine_id) + setting_key_str = getSettingsKeyForMachine(machine_id) checked_version = Version(Application.getInstance().getPreferences().getValue(setting_key_str)) # If the checked_version is "", it's because is the first time we check firmware and in this case diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py index 6d96ee36bb..ceecef61ba 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py @@ -12,17 +12,17 @@ from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") -def get_settings_key_for_machine(machine_id: int) -> str: +def getSettingsKeyForMachine(machine_id: int) -> str: return "info/latest_checked_firmware_for_{0}".format(machine_id) -def default_parse_version_response(response: str) -> Version: +def defaultParseVersionResponse(response: str) -> Version: raw_str = response.split("\n", 1)[0].rstrip() - return Version(raw_str.split(".")) # Split it into a list; the default parsing of "single string" is different. + return Version(raw_str) class FirmwareUpdateCheckerLookup: - JSON_NAME_TO_VERSION_PARSE_FUNCTION = {"default": default_parse_version_response} + JSON_NAME_TO_VERSION_PARSE_FUNCTION = {"default": defaultParseVersionResponse} def __init__(self, json_path) -> None: # Open the .json file with the needed lookup-lists for each machine(/model) and retrieve "raw" json. @@ -48,7 +48,7 @@ class FirmwareUpdateCheckerLookup: self.JSON_NAME_TO_VERSION_PARSE_FUNCTION.get(machine_json.get("version_parser")) if version_parse_function is None: Logger.log("w", "No version-parse-function specified for machine {0}.".format(machine_name)) - version_parse_function = default_parse_version_response # Use default instead if nothing is found. + version_parse_function = defaultParseVersionResponse # Use default instead if nothing is found. self._parse_version_url_per_machine[machine_id] = version_parse_function self._check_urls_per_machine[machine_id] = [] # Multiple check-urls: see "_comment" in the .json file. for check_url in machine_json.get("check_urls"): diff --git a/plugins/FirmwareUpdateChecker/resources/machines.json b/plugins/FirmwareUpdateChecker/resources/machines.json index 5dc9aadbbf..ee072f75c3 100644 --- a/plugins/FirmwareUpdateChecker/resources/machines.json +++ b/plugins/FirmwareUpdateChecker/resources/machines.json @@ -1,5 +1,5 @@ { - "_comment": "Multiple 'update_urls': The 'new'-style URL is the only way to check for S5 firmware, and in the future, the UM3 line will also switch over, but for now the old 'JEDI'-style URL is still needed.", + "_comment": "There are multiple 'check_urls', because sometimes an URL is about to be phased out, and it's useful to have a new 'future-proof' one at the ready.", "machines": [ From 8c71a8855c9f80ce0beb5daad6bd643633db010b Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Sat, 13 Oct 2018 19:36:11 +0200 Subject: [PATCH 199/212] FirmwareUpdateChecker: Remove superfluous 'version_parser' as a setting, since it broke lean principles. --- .../FirmwareUpdateCheckerJob.py | 9 ++++++--- .../FirmwareUpdateCheckerLookup.py | 12 ------------ .../FirmwareUpdateChecker/resources/machines.json | 9 +++------ 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 5bb9d076b6..a873f17d61 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -46,14 +46,17 @@ class FirmwareUpdateCheckerJob(Job): return result + def parseVersionResponse(self, response: str) -> Version: + raw_str = response.split("\n", 1)[0].rstrip() + return Version(raw_str) + def getCurrentVersionForMachine(self, machine_id: int) -> Version: max_version = self.ZERO_VERSION machine_urls = self._lookups.getCheckUrlsFor(machine_id) - parse_function = self._lookups.getParseVersionUrlFor(machine_id) - if machine_urls is not None and parse_function is not None: + if machine_urls is not None: for url in machine_urls: - version = parse_function(self.getUrlResponse(url)) + version = self.parseVersionResponse(self.getUrlResponse(url)) if version > max_version: max_version = version diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py index ceecef61ba..4813e3ecbb 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py @@ -16,13 +16,7 @@ def getSettingsKeyForMachine(machine_id: int) -> str: return "info/latest_checked_firmware_for_{0}".format(machine_id) -def defaultParseVersionResponse(response: str) -> Version: - raw_str = response.split("\n", 1)[0].rstrip() - return Version(raw_str) - - class FirmwareUpdateCheckerLookup: - JSON_NAME_TO_VERSION_PARSE_FUNCTION = {"default": defaultParseVersionResponse} def __init__(self, json_path) -> None: # Open the .json file with the needed lookup-lists for each machine(/model) and retrieve "raw" json. @@ -44,12 +38,6 @@ class FirmwareUpdateCheckerLookup: machine_name = machine_json.get("name").lower() # Lower in case upper-case char are added to the json. self._machine_ids.append(machine_id) self._machine_per_name[machine_name] = machine_id - version_parse_function = \ - self.JSON_NAME_TO_VERSION_PARSE_FUNCTION.get(machine_json.get("version_parser")) - if version_parse_function is None: - Logger.log("w", "No version-parse-function specified for machine {0}.".format(machine_name)) - version_parse_function = defaultParseVersionResponse # Use default instead if nothing is found. - self._parse_version_url_per_machine[machine_id] = version_parse_function self._check_urls_per_machine[machine_id] = [] # Multiple check-urls: see "_comment" in the .json file. for check_url in machine_json.get("check_urls"): self._check_urls_per_machine[machine_id].append(check_url) diff --git a/plugins/FirmwareUpdateChecker/resources/machines.json b/plugins/FirmwareUpdateChecker/resources/machines.json index ee072f75c3..d9eaad0abf 100644 --- a/plugins/FirmwareUpdateChecker/resources/machines.json +++ b/plugins/FirmwareUpdateChecker/resources/machines.json @@ -11,8 +11,7 @@ "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources", "http://software.ultimaker.com/releases/firmware/9066/stable/version.txt" ], - "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware", - "version_parser": "default" + "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware" }, { "id": 9511, @@ -22,15 +21,13 @@ "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources", "http://software.ultimaker.com/releases/firmware/9511/stable/version.txt" ], - "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware", - "version_parser": "default" + "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware" }, { "id": 9051, "name": "ultimaker s5", "check_urls": ["http://software.ultimaker.com/releases/firmware/9051/stable/version.txt"], - "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware", - "version_parser": "default" + "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware" } ] } From 931143ceaabe02f88bd4f0eca7357ed494733c0c Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Sat, 13 Oct 2018 20:05:20 +0200 Subject: [PATCH 200/212] Added FirmwareUpdateCheckerMessage, so no variables have to be hidden in the action of a plain Message. --- .../FirmwareUpdateChecker.py | 11 ++++--- .../FirmwareUpdateCheckerJob.py | 19 ++---------- .../FirmwareUpdateCheckerLookup.py | 1 - .../FirmwareUpdateCheckerMessage.py | 31 +++++++++++++++++++ 4 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index 61604ff78b..8c0ea1bea2 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -19,6 +19,7 @@ from cura.Settings.GlobalStack import GlobalStack from .FirmwareUpdateCheckerJob import FirmwareUpdateCheckerJob from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, getSettingsKeyForMachine +from .FirmwareUpdateCheckerMessage import FirmwareUpdateCheckerMessage i18n_catalog = i18nCatalog("cura") @@ -40,20 +41,22 @@ class FirmwareUpdateChecker(Extension): # Partly initialize after creation, since we need our own path from the plugin-manager. self._download_url = None self._check_job = None - self._checked_printer_names = [] # type: Set[str] + self._checked_printer_names = set() # type: Set[str] self._lookups = None QtApplication.pluginsLoaded.connect(self._onPluginsLoaded) ## Callback for the message that is spawned when there is a new version. def _onActionTriggered(self, message, action): - download_url = self._lookups.getRedirectUserFor(int(action)) + if action == FirmwareUpdateCheckerMessage.STR_ACTION_DOWNLOAD: + machine_id = message.getMachineId() + download_url = self._lookups.getRedirectUserFor(machine_id) if download_url is not None: if QDesktopServices.openUrl(QUrl(download_url)): Logger.log("i", "Redirected browser to {0} to show newly available firmware.".format(download_url)) else: Logger.log("e", "Can't reach URL: {0}".format(download_url)) else: - Logger.log("e", "Can't find URL for {0}".format(action)) + Logger.log("e", "Can't find URL for {0}".format(machine_id)) def _onContainerAdded(self, container): # Only take care when a new GlobalStack was added @@ -88,7 +91,7 @@ class FirmwareUpdateChecker(Extension): container_name = container.definition.getName() if container_name in self._checked_printer_names: return - self._checked_printer_names.append(container_name) + self._checked_printer_names.add(container_name) self._check_job = FirmwareUpdateCheckerJob(container = container, silent = silent, lookups = self._lookups, diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index a873f17d61..f39f4c8cea 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -10,9 +10,9 @@ from UM.Version import Version import urllib.request from urllib.error import URLError from typing import Dict -import codecs from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, getSettingsKeyForMachine +from .FirmwareUpdateCheckerMessage import FirmwareUpdateCheckerMessage from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") @@ -99,22 +99,7 @@ class FirmwareUpdateCheckerJob(Job): # notify the user when no new firmware version is available. if (checked_version != "") and (checked_version != current_version): Logger.log("i", "SHOWING FIRMWARE UPDATE MESSAGE") - - message = Message(i18n_catalog.i18nc( - "@info Don't translate {machine_name}, since it gets replaced by a printer name!", - "New features are available for your {machine_name}! It is recommended to update the firmware on your printer.").format( - machine_name = machine_name), - title = i18n_catalog.i18nc( - "@info:title The %s gets replaced with the printer name.", - "New %s firmware available") % machine_name) - - message.addAction(machine_id, - i18n_catalog.i18nc("@action:button", "How to update"), - "[no_icon]", - "[no_description]", - button_style = Message.ActionButtonStyle.LINK, - button_align = Message.ActionButtonStyle.BUTTON_ALIGN_LEFT) - + message = FirmwareUpdateCheckerMessage(machine_id, machine_name) message.actionTriggered.connect(self._callback) message.show() else: diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py index 4813e3ecbb..ff4e9ce73d 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py @@ -6,7 +6,6 @@ import json from typing import Callable, Dict, List, Optional from UM.Logger import Logger -from UM.Version import Version from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py new file mode 100644 index 0000000000..0f13796c29 --- /dev/null +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py @@ -0,0 +1,31 @@ + +from UM.i18n import i18nCatalog +from UM.Message import Message + +i18n_catalog = i18nCatalog("cura") + + +# Make a separate class, since we need an extra field: The machine-id that this message is about. +class FirmwareUpdateCheckerMessage(Message): + STR_ACTION_DOWNLOAD = "download" + + def __init__(self, machine_id: int, machine_name: str) -> None: + super().__init__(i18n_catalog.i18nc( + "@info Don't translate {machine_name}, since it gets replaced by a printer name!", + "New features are available for your {machine_name}! It is recommended to update the firmware on your printer.").format( + machine_name=machine_name), + title=i18n_catalog.i18nc( + "@info:title The %s gets replaced with the printer name.", + "New %s firmware available") % machine_name) + + self._machine_id = machine_id + + self.addAction(self.STR_ACTION_DOWNLOAD, + i18n_catalog.i18nc("@action:button", "How to update"), + "[no_icon]", + "[no_description]", + button_style=Message.ActionButtonStyle.LINK, + button_align=Message.ActionButtonStyle.BUTTON_ALIGN_LEFT) + + def getMachineId(self) -> int: + return self._machine_id From 2e3abbc9044c82e5dc858f52e34d027b0cbee10c Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Sat, 13 Oct 2018 21:55:33 +0200 Subject: [PATCH 201/212] Put the firmware-update meta-data in the 'normal' printer definitions and make the code handle that. --- .../FirmwareUpdateChecker.py | 31 +++------- .../FirmwareUpdateCheckerJob.py | 30 ++++++---- .../FirmwareUpdateCheckerLookup.py | 57 ++++++------------- .../FirmwareUpdateCheckerMessage.py | 6 +- .../resources/machines.json | 33 ----------- resources/definitions/ultimaker3.def.json | 11 +++- .../definitions/ultimaker3_extended.def.json | 11 +++- resources/definitions/ultimaker_s5.def.json | 7 ++- 8 files changed, 73 insertions(+), 113 deletions(-) delete mode 100644 plugins/FirmwareUpdateChecker/resources/machines.json diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index 8c0ea1bea2..415931b7ec 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -10,15 +10,12 @@ from typing import Set from UM.Extension import Extension from UM.Application import Application from UM.Logger import Logger -from UM.PluginRegistry import PluginRegistry -from UM.Qt.QtApplication import QtApplication from UM.i18n import i18nCatalog from UM.Settings.ContainerRegistry import ContainerRegistry from cura.Settings.GlobalStack import GlobalStack from .FirmwareUpdateCheckerJob import FirmwareUpdateCheckerJob -from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, getSettingsKeyForMachine from .FirmwareUpdateCheckerMessage import FirmwareUpdateCheckerMessage i18n_catalog = i18nCatalog("cura") @@ -38,18 +35,14 @@ class FirmwareUpdateChecker(Extension): if Application.getInstance().getPreferences().getValue("info/automatic_update_check"): ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) - # Partly initialize after creation, since we need our own path from the plugin-manager. - self._download_url = None self._check_job = None self._checked_printer_names = set() # type: Set[str] - self._lookups = None - QtApplication.pluginsLoaded.connect(self._onPluginsLoaded) ## Callback for the message that is spawned when there is a new version. def _onActionTriggered(self, message, action): if action == FirmwareUpdateCheckerMessage.STR_ACTION_DOWNLOAD: machine_id = message.getMachineId() - download_url = self._lookups.getRedirectUserFor(machine_id) + download_url = message.getDownloadUrl() if download_url is not None: if QDesktopServices.openUrl(QUrl(download_url)): Logger.log("i", "Redirected browser to {0} to show newly available firmware.".format(download_url)) @@ -66,18 +59,6 @@ class FirmwareUpdateChecker(Extension): def _onJobFinished(self, *args, **kwargs): self._check_job = None - def _onPluginsLoaded(self): - if self._lookups is not None: - return - - self._lookups = FirmwareUpdateCheckerLookup(os.path.join(PluginRegistry.getInstance().getPluginPath( - "FirmwareUpdateChecker"), "resources/machines.json")) - - # Initialize the Preference called `latest_checked_firmware` that stores the last version - # checked for each printer. - for machine_id in self._lookups.getMachineIds(): - Application.getInstance().getPreferences().addPreference(getSettingsKeyForMachine(machine_id), "") - ## Connect with software.ultimaker.com, load latest.version and check version info. # If the version info is different from the current version, spawn a message to # allow the user to download it. @@ -85,16 +66,18 @@ class FirmwareUpdateChecker(Extension): # \param silent type(boolean) Suppresses messages other than "new version found" messages. # This is used when checking for a new firmware version at startup. def checkFirmwareVersion(self, container = None, silent = False): - if self._lookups is None: - self._onPluginsLoaded() - container_name = container.definition.getName() if container_name in self._checked_printer_names: return self._checked_printer_names.add(container_name) + metadata = container.definition.getMetaData().get("firmware_update_info") + if metadata is None: + Logger.log("i", "No machine with name {0} in list of firmware to check.".format(container_name)) + return + self._check_job = FirmwareUpdateCheckerJob(container = container, silent = silent, - lookups = self._lookups, + machine_name = container_name, metadata = metadata, callback = self._onActionTriggered) self._check_job.start() self._check_job.finished.connect(self._onJobFinished) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index f39f4c8cea..2e15208336 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -9,7 +9,7 @@ from UM.Version import Version import urllib.request from urllib.error import URLError -from typing import Dict +from typing import Dict, Optional from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, getSettingsKeyForMachine from .FirmwareUpdateCheckerMessage import FirmwareUpdateCheckerMessage @@ -25,13 +25,15 @@ class FirmwareUpdateCheckerJob(Job): ZERO_VERSION = Version(STRING_ZERO_VERSION) EPSILON_VERSION = Version(STRING_EPSILON_VERSION) - def __init__(self, container, silent, lookups: FirmwareUpdateCheckerLookup, callback) -> None: + def __init__(self, container, silent, machine_name, metadata, callback) -> None: super().__init__() self._container = container self.silent = silent self._callback = callback - self._lookups = lookups + self._machine_name = machine_name + self._metadata = metadata + self._lookups = None # type:Optional[FirmwareUpdateCheckerLookup] self._headers = {} # type:Dict[str, str] # Don't set headers yet. def getUrlResponse(self, url: str) -> str: @@ -50,10 +52,12 @@ class FirmwareUpdateCheckerJob(Job): raw_str = response.split("\n", 1)[0].rstrip() return Version(raw_str) - def getCurrentVersionForMachine(self, machine_id: int) -> Version: + def getCurrentVersion(self) -> Version: max_version = self.ZERO_VERSION + if self._lookups is None: + return max_version - machine_urls = self._lookups.getCheckUrlsFor(machine_id) + machine_urls = self._lookups.getCheckUrls() if machine_urls is not None: for url in machine_urls: version = self.parseVersionResponse(self.getUrlResponse(url)) @@ -61,16 +65,20 @@ class FirmwareUpdateCheckerJob(Job): max_version = version if max_version < self.EPSILON_VERSION: - Logger.log("w", "MachineID {0} not handled!".format(repr(machine_id))) + Logger.log("w", "MachineID {0} not handled!".format(self._lookups.getMachineName())) return max_version def run(self): if self._lookups is None: - Logger.log("e", "Can not check for a new release. URL not set!") - return + self._lookups = FirmwareUpdateCheckerLookup(self._machine_name, self._metadata) try: + # Initialize a Preference that stores the last version checked for this printer. + Application.getInstance().getPreferences().addPreference( + getSettingsKeyForMachine(self._lookups.getMachineId()), "") + + # Get headers application_name = Application.getInstance().getApplicationName() application_version = Application.getInstance().getVersion() self._headers = {"User-Agent": "%s - %s" % (application_name, application_version)} @@ -79,11 +87,11 @@ class FirmwareUpdateCheckerJob(Job): machine_name = self._container.definition.getName() # If it is not None, then we compare between the checked_version and the current_version - machine_id = self._lookups.getMachineByName(machine_name.lower()) + machine_id = self._lookups.getMachineId() if machine_id is not None: Logger.log("i", "You have a(n) {0} in the printer list. Let's check the firmware!".format(machine_name)) - current_version = self.getCurrentVersionForMachine(machine_id) + current_version = self.getCurrentVersion() # If it is the first time the version is checked, the checked_version is "" setting_key_str = getSettingsKeyForMachine(machine_id) @@ -99,7 +107,7 @@ class FirmwareUpdateCheckerJob(Job): # notify the user when no new firmware version is available. if (checked_version != "") and (checked_version != current_version): Logger.log("i", "SHOWING FIRMWARE UPDATE MESSAGE") - message = FirmwareUpdateCheckerMessage(machine_id, machine_name) + message = FirmwareUpdateCheckerMessage(machine_id, machine_name, self._lookups.getRedirectUserUrl()) message.actionTriggered.connect(self._callback) message.show() else: diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py index ff4e9ce73d..a21ad3f0e5 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerLookup.py @@ -1,11 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import json - -from typing import Callable, Dict, List, Optional - -from UM.Logger import Logger +from typing import List, Optional from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") @@ -17,44 +13,23 @@ def getSettingsKeyForMachine(machine_id: int) -> str: class FirmwareUpdateCheckerLookup: - def __init__(self, json_path) -> None: - # Open the .json file with the needed lookup-lists for each machine(/model) and retrieve "raw" json. - with open(json_path, "r", encoding = "utf-8") as json_file: - machines_json = json.load(json_file).get("machines") - if machines_json is None: - Logger.log("e", "Missing or inaccessible: {0}".format(json_path)) - return - + def __init__(self, machine_name, machine_json) -> None: # Parse all the needed lookup-tables from the ".json" file(s) in the resources folder. - self._machine_ids = [] # type:List[int] - self._machine_per_name = {} # type:Dict[str, int] - self._parse_version_url_per_machine = {} # type:Dict[int, Callable] - self._check_urls_per_machine = {} # type:Dict[int, List[str]] - self._redirect_user_per_machine = {} # type:Dict[int, str] - try: - for machine_json in machines_json: - machine_id = machine_json.get("id") - machine_name = machine_json.get("name").lower() # Lower in case upper-case char are added to the json. - self._machine_ids.append(machine_id) - self._machine_per_name[machine_name] = machine_id - self._check_urls_per_machine[machine_id] = [] # Multiple check-urls: see "_comment" in the .json file. - for check_url in machine_json.get("check_urls"): - self._check_urls_per_machine[machine_id].append(check_url) - self._redirect_user_per_machine[machine_id] = machine_json.get("update_url") - except Exception as ex: - Logger.log("e", "Couldn't parse firmware-update-check lookup-lists from file because {0}.".format(ex)) + self._machine_id = machine_json.get("id") + self._machine_name = machine_name.lower() # Lower in-case upper-case chars are added to the original json. + self._check_urls = [] # type:List[str] + for check_url in machine_json.get("check_urls"): + self._check_urls.append(check_url) + self._redirect_user = machine_json.get("update_url") - def getMachineIds(self) -> List[int]: - return self._machine_ids + def getMachineId(self) -> Optional[int]: + return self._machine_id - def getMachineByName(self, machine_name: str) -> Optional[int]: - return self._machine_per_name.get(machine_name) + def getMachineName(self) -> Optional[int]: + return self._machine_name - def getParseVersionUrlFor(self, machine_id: int) -> Optional[Callable]: - return self._parse_version_url_per_machine.get(machine_id) + def getCheckUrls(self) -> Optional[List[str]]: + return self._check_urls - def getCheckUrlsFor(self, machine_id: int) -> Optional[List[str]]: - return self._check_urls_per_machine.get(machine_id) - - def getRedirectUserFor(self, machine_id: int) -> Optional[str]: - return self._redirect_user_per_machine.get(machine_id) + def getRedirectUserUrl(self) -> Optional[str]: + return self._redirect_user diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py index 0f13796c29..d509c432b4 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py @@ -9,7 +9,7 @@ i18n_catalog = i18nCatalog("cura") class FirmwareUpdateCheckerMessage(Message): STR_ACTION_DOWNLOAD = "download" - def __init__(self, machine_id: int, machine_name: str) -> None: + def __init__(self, machine_id: int, machine_name: str, download_url: str) -> None: super().__init__(i18n_catalog.i18nc( "@info Don't translate {machine_name}, since it gets replaced by a printer name!", "New features are available for your {machine_name}! It is recommended to update the firmware on your printer.").format( @@ -19,6 +19,7 @@ class FirmwareUpdateCheckerMessage(Message): "New %s firmware available") % machine_name) self._machine_id = machine_id + self._download_url = download_url self.addAction(self.STR_ACTION_DOWNLOAD, i18n_catalog.i18nc("@action:button", "How to update"), @@ -29,3 +30,6 @@ class FirmwareUpdateCheckerMessage(Message): def getMachineId(self) -> int: return self._machine_id + + def getDownloadUrl(self) -> str: + return self._download_url diff --git a/plugins/FirmwareUpdateChecker/resources/machines.json b/plugins/FirmwareUpdateChecker/resources/machines.json deleted file mode 100644 index d9eaad0abf..0000000000 --- a/plugins/FirmwareUpdateChecker/resources/machines.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "_comment": "There are multiple 'check_urls', because sometimes an URL is about to be phased out, and it's useful to have a new 'future-proof' one at the ready.", - - "machines": - [ - { - "id": 9066, - "name": "ultimaker 3", - "check_urls": - [ - "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources", - "http://software.ultimaker.com/releases/firmware/9066/stable/version.txt" - ], - "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware" - }, - { - "id": 9511, - "name": "ultimaker 3 extended", - "check_urls": - [ - "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources", - "http://software.ultimaker.com/releases/firmware/9511/stable/version.txt" - ], - "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware" - }, - { - "id": 9051, - "name": "ultimaker s5", - "check_urls": ["http://software.ultimaker.com/releases/firmware/9051/stable/version.txt"], - "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware" - } - ] -} diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index b1daa6b780..f5e31890f6 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -24,7 +24,16 @@ }, "first_start_actions": [ "DiscoverUM3Action" ], "supported_actions": [ "DiscoverUM3Action" ], - "supports_usb_connection": false + "supports_usb_connection": false, + "firmware_update_info": { + "id": 9066, + "check_urls": + [ + "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources", + "http://software.ultimaker.com/releases/firmware/9066/stable/version.txt" + ], + "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware" + } }, diff --git a/resources/definitions/ultimaker3_extended.def.json b/resources/definitions/ultimaker3_extended.def.json index eb3cda9320..d13857e428 100644 --- a/resources/definitions/ultimaker3_extended.def.json +++ b/resources/definitions/ultimaker3_extended.def.json @@ -23,7 +23,16 @@ "1": "ultimaker3_extended_extruder_right" }, "first_start_actions": [ "DiscoverUM3Action" ], - "supported_actions": [ "DiscoverUM3Action" ] + "supported_actions": [ "DiscoverUM3Action" ], + "firmware_update_info": { + "id": 9511, + "check_urls": + [ + "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources", + "http://software.ultimaker.com/releases/firmware/9511/stable/version.txt" + ], + "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware" + } }, "overrides": { diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index 2e634787af..6195933869 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -30,7 +30,12 @@ "first_start_actions": [ "DiscoverUM3Action" ], "supported_actions": [ "DiscoverUM3Action" ], "supports_usb_connection": false, - "weight": -1 + "weight": -1, + "firmware_update_info": { + "id": 9051, + "check_urls": ["http://software.ultimaker.com/releases/firmware/9051/stable/version.txt"], + "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware" + } }, "overrides": { From e747219bbec338736eb8ce683e15cf1cfbb77511 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 15 Oct 2018 01:30:36 +0200 Subject: [PATCH 202/212] Let Makerbot Replicator use Replicator's X3G variant --- resources/definitions/makerbotreplicator.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/makerbotreplicator.def.json b/resources/definitions/makerbotreplicator.def.json index 1770b7a979..3b02215e74 100644 --- a/resources/definitions/makerbotreplicator.def.json +++ b/resources/definitions/makerbotreplicator.def.json @@ -6,6 +6,7 @@ "visible": true, "author": "Ultimaker", "manufacturer": "MakerBot", + "machine_x3g_variant": "r1", "file_formats": "application/x3g", "platform_offset": [ 0, 0, 0], "machine_extruder_trains": From 73de7209477ea675475da5f6bd753fb6deeebba3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Oct 2018 09:27:53 +0200 Subject: [PATCH 203/212] Change material diameter to 1.75 for monoprice machines CURA-5817 --- .../extruders/monoprice_select_mini_v1_extruder_0.def.json | 2 +- .../extruders/monoprice_select_mini_v2_extruder_0.def.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/extruders/monoprice_select_mini_v1_extruder_0.def.json b/resources/extruders/monoprice_select_mini_v1_extruder_0.def.json index eef47c9b6f..e4a899d7af 100644 --- a/resources/extruders/monoprice_select_mini_v1_extruder_0.def.json +++ b/resources/extruders/monoprice_select_mini_v1_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/monoprice_select_mini_v2_extruder_0.def.json b/resources/extruders/monoprice_select_mini_v2_extruder_0.def.json index e0899304dd..b727cfce1f 100644 --- a/resources/extruders/monoprice_select_mini_v2_extruder_0.def.json +++ b/resources/extruders/monoprice_select_mini_v2_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } From 02efd7a1f5a312ea4124a45025ac2dc3bdac99da Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 15 Oct 2018 13:55:47 +0200 Subject: [PATCH 204/212] Correct some printers to use 1.75mm filament This should fix some underextrusion problems... Hmm. Sources: * https://alya3dp.com/pages/teknik-ozellikler * https://www.creality3d.cn/creality-cr-10-s4-3d-printer-p00098p1.html * https://www.creality3d.cn/creality-cr-10-s5-3d-printer-p00099p1.html * https://3dprint.com/3643/german-repraps-neo-3d-printer-now-available-in-the-us-uk/ * https://somosmaker.com/pegasus-impresora-3d/ * http://www.3dmaker.vn/3d-printer-3dmaker-starter/?lang=en# (assuming the filaments they sell on that website are compatible) * https://makezine.com/product-review/printrbot-play/ I could not find a source for the Deltabot, but got that information from here: https://github.com/Ultimaker/Cura/issues/4573 Contributes to issue CURA-5817. --- resources/extruders/alya3dp_extruder_0.def.json | 2 +- resources/extruders/creality_cr10s4_extruder_0.def.json | 2 +- resources/extruders/creality_cr10s5_extruder_0.def.json | 2 +- resources/extruders/deltabot_extruder_0.def.json | 2 +- resources/extruders/grr_neo_extruder_0.def.json | 2 +- resources/extruders/kupido_extruder_0.def.json | 2 +- resources/extruders/makeR_pegasus_extruder_0.def.json | 2 +- resources/extruders/maker_starter_extruder_0.def.json | 2 +- resources/extruders/printrbot_play_heated_extruder_0.def.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/extruders/alya3dp_extruder_0.def.json b/resources/extruders/alya3dp_extruder_0.def.json index e34db5dfbf..3676f01ad2 100644 --- a/resources/extruders/alya3dp_extruder_0.def.json +++ b/resources/extruders/alya3dp_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/creality_cr10s4_extruder_0.def.json b/resources/extruders/creality_cr10s4_extruder_0.def.json index 9afe1cee35..8a40c6431f 100644 --- a/resources/extruders/creality_cr10s4_extruder_0.def.json +++ b/resources/extruders/creality_cr10s4_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/creality_cr10s5_extruder_0.def.json b/resources/extruders/creality_cr10s5_extruder_0.def.json index fed86eb2b5..98b701ae2e 100644 --- a/resources/extruders/creality_cr10s5_extruder_0.def.json +++ b/resources/extruders/creality_cr10s5_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/deltabot_extruder_0.def.json b/resources/extruders/deltabot_extruder_0.def.json index 43fce74fa5..e13d6a6ee3 100644 --- a/resources/extruders/deltabot_extruder_0.def.json +++ b/resources/extruders/deltabot_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.5 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/grr_neo_extruder_0.def.json b/resources/extruders/grr_neo_extruder_0.def.json index 9fe86d9eed..6d76c90796 100644 --- a/resources/extruders/grr_neo_extruder_0.def.json +++ b/resources/extruders/grr_neo_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.5 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/kupido_extruder_0.def.json b/resources/extruders/kupido_extruder_0.def.json index d93395e667..ef988d4fde 100644 --- a/resources/extruders/kupido_extruder_0.def.json +++ b/resources/extruders/kupido_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/makeR_pegasus_extruder_0.def.json b/resources/extruders/makeR_pegasus_extruder_0.def.json index 8d2a98340a..e37891abde 100644 --- a/resources/extruders/makeR_pegasus_extruder_0.def.json +++ b/resources/extruders/makeR_pegasus_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/maker_starter_extruder_0.def.json b/resources/extruders/maker_starter_extruder_0.def.json index 5c60e536b7..ee94250248 100644 --- a/resources/extruders/maker_starter_extruder_0.def.json +++ b/resources/extruders/maker_starter_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/printrbot_play_heated_extruder_0.def.json b/resources/extruders/printrbot_play_heated_extruder_0.def.json index ba8bc5c34c..0a3eeb3d06 100644 --- a/resources/extruders/printrbot_play_heated_extruder_0.def.json +++ b/resources/extruders/printrbot_play_heated_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } From d7a7cf3003f7ebe55d45b41c1ce20717b5c7d865 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 15 Oct 2018 13:55:47 +0200 Subject: [PATCH 205/212] Correct some printers to use 1.75mm filament This should fix some underextrusion problems... Hmm. Sources: * https://alya3dp.com/pages/teknik-ozellikler * https://www.creality3d.cn/creality-cr-10-s4-3d-printer-p00098p1.html * https://www.creality3d.cn/creality-cr-10-s5-3d-printer-p00099p1.html * https://3dprint.com/3643/german-repraps-neo-3d-printer-now-available-in-the-us-uk/ * https://somosmaker.com/pegasus-impresora-3d/ * http://www.3dmaker.vn/3d-printer-3dmaker-starter/?lang=en# (assuming the filaments they sell on that website are compatible) * https://makezine.com/product-review/printrbot-play/ I could not find a source for the Deltabot, but got that information from here: https://github.com/Ultimaker/Cura/issues/4573 Contributes to issue CURA-5817. --- resources/extruders/alya3dp_extruder_0.def.json | 2 +- resources/extruders/creality_cr10s4_extruder_0.def.json | 2 +- resources/extruders/creality_cr10s5_extruder_0.def.json | 2 +- resources/extruders/deltabot_extruder_0.def.json | 2 +- resources/extruders/grr_neo_extruder_0.def.json | 2 +- resources/extruders/kupido_extruder_0.def.json | 2 +- resources/extruders/makeR_pegasus_extruder_0.def.json | 2 +- resources/extruders/maker_starter_extruder_0.def.json | 2 +- resources/extruders/printrbot_play_heated_extruder_0.def.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/extruders/alya3dp_extruder_0.def.json b/resources/extruders/alya3dp_extruder_0.def.json index e34db5dfbf..3676f01ad2 100644 --- a/resources/extruders/alya3dp_extruder_0.def.json +++ b/resources/extruders/alya3dp_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/creality_cr10s4_extruder_0.def.json b/resources/extruders/creality_cr10s4_extruder_0.def.json index 9afe1cee35..8a40c6431f 100644 --- a/resources/extruders/creality_cr10s4_extruder_0.def.json +++ b/resources/extruders/creality_cr10s4_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/creality_cr10s5_extruder_0.def.json b/resources/extruders/creality_cr10s5_extruder_0.def.json index fed86eb2b5..98b701ae2e 100644 --- a/resources/extruders/creality_cr10s5_extruder_0.def.json +++ b/resources/extruders/creality_cr10s5_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/deltabot_extruder_0.def.json b/resources/extruders/deltabot_extruder_0.def.json index 43fce74fa5..e13d6a6ee3 100644 --- a/resources/extruders/deltabot_extruder_0.def.json +++ b/resources/extruders/deltabot_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.5 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/grr_neo_extruder_0.def.json b/resources/extruders/grr_neo_extruder_0.def.json index 9fe86d9eed..6d76c90796 100644 --- a/resources/extruders/grr_neo_extruder_0.def.json +++ b/resources/extruders/grr_neo_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.5 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/kupido_extruder_0.def.json b/resources/extruders/kupido_extruder_0.def.json index d93395e667..ef988d4fde 100644 --- a/resources/extruders/kupido_extruder_0.def.json +++ b/resources/extruders/kupido_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/makeR_pegasus_extruder_0.def.json b/resources/extruders/makeR_pegasus_extruder_0.def.json index 8d2a98340a..e37891abde 100644 --- a/resources/extruders/makeR_pegasus_extruder_0.def.json +++ b/resources/extruders/makeR_pegasus_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/maker_starter_extruder_0.def.json b/resources/extruders/maker_starter_extruder_0.def.json index 5c60e536b7..ee94250248 100644 --- a/resources/extruders/maker_starter_extruder_0.def.json +++ b/resources/extruders/maker_starter_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } diff --git a/resources/extruders/printrbot_play_heated_extruder_0.def.json b/resources/extruders/printrbot_play_heated_extruder_0.def.json index ba8bc5c34c..0a3eeb3d06 100644 --- a/resources/extruders/printrbot_play_heated_extruder_0.def.json +++ b/resources/extruders/printrbot_play_heated_extruder_0.def.json @@ -11,6 +11,6 @@ "overrides": { "extruder_nr": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 2.85 } + "material_diameter": { "default_value": 1.75 } } } From 56a383814b78bc6dc9d7349381a4a4b23d286edc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 15 Oct 2018 14:48:18 +0200 Subject: [PATCH 206/212] Code style: Spaces around binary operators Contributes to issue CURA-5483. --- .../FirmwareUpdateCheckerMessage.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py index d509c432b4..fd56c101a0 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py @@ -1,3 +1,5 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. from UM.i18n import i18nCatalog from UM.Message import Message @@ -13,8 +15,8 @@ class FirmwareUpdateCheckerMessage(Message): super().__init__(i18n_catalog.i18nc( "@info Don't translate {machine_name}, since it gets replaced by a printer name!", "New features are available for your {machine_name}! It is recommended to update the firmware on your printer.").format( - machine_name=machine_name), - title=i18n_catalog.i18nc( + machine_name = machine_name), + title = i18n_catalog.i18nc( "@info:title The %s gets replaced with the printer name.", "New %s firmware available") % machine_name) @@ -25,8 +27,8 @@ class FirmwareUpdateCheckerMessage(Message): i18n_catalog.i18nc("@action:button", "How to update"), "[no_icon]", "[no_description]", - button_style=Message.ActionButtonStyle.LINK, - button_align=Message.ActionButtonStyle.BUTTON_ALIGN_LEFT) + button_style = Message.ActionButtonStyle.LINK, + button_align = Message.ActionButtonStyle.BUTTON_ALIGN_LEFT) def getMachineId(self) -> int: return self._machine_id From 53dc28db891f1d49d4cd6662468fb8f68c272175 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 15 Oct 2018 15:12:42 +0200 Subject: [PATCH 207/212] Change URL of firmware update page for Ultimaker 3 and S5 I just got word of a new page to read up about the firmware update. Apparently we now have to link to this one. Contributes to issue CURA-5483. --- plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py | 2 +- resources/definitions/ultimaker3.def.json | 2 +- resources/definitions/ultimaker3_extended.def.json | 2 +- resources/definitions/ultimaker_s5.def.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 2e15208336..4c60b95824 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from UM.Application import Application diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index f5e31890f6..72756de2a5 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -32,7 +32,7 @@ "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources", "http://software.ultimaker.com/releases/firmware/9066/stable/version.txt" ], - "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware" + "update_url": "https://ultimaker.com/firmware" } }, diff --git a/resources/definitions/ultimaker3_extended.def.json b/resources/definitions/ultimaker3_extended.def.json index d13857e428..68f26969b7 100644 --- a/resources/definitions/ultimaker3_extended.def.json +++ b/resources/definitions/ultimaker3_extended.def.json @@ -31,7 +31,7 @@ "http://software.ultimaker.com/jedi/releases/latest.version?utm_source=cura&utm_medium=software&utm_campaign=resources", "http://software.ultimaker.com/releases/firmware/9511/stable/version.txt" ], - "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware" + "update_url": "https://ultimaker.com/firmware" } }, diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index 6195933869..310765dbc3 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -34,7 +34,7 @@ "firmware_update_info": { "id": 9051, "check_urls": ["http://software.ultimaker.com/releases/firmware/9051/stable/version.txt"], - "update_url": "https://ultimaker.com/en/resources/20500-upgrade-firmware" + "update_url": "https://ultimaker.com/firmware" } }, From 6eb8b754903f3fe1db5baa55ad90305fda94de38 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 16 Oct 2018 11:31:33 +0200 Subject: [PATCH 208/212] Update typing and fixed the bug it exposes. --- cura/Settings/SettingInheritanceManager.py | 61 ++++++++++++++-------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/cura/Settings/SettingInheritanceManager.py b/cura/Settings/SettingInheritanceManager.py index 9cd24558b7..12b541c3d8 100644 --- a/cura/Settings/SettingInheritanceManager.py +++ b/cura/Settings/SettingInheritanceManager.py @@ -1,6 +1,6 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import List +from typing import List, Optional, TYPE_CHECKING from PyQt5.QtCore import QObject, QTimer, pyqtProperty, pyqtSignal from UM.FlameProfiler import pyqtSlot @@ -20,13 +20,18 @@ from UM.Settings.SettingInstance import InstanceState from cura.Settings.ExtruderManager import ExtruderManager +if TYPE_CHECKING: + from cura.Settings.ExtruderStack import ExtruderStack + from UM.Settings.SettingDefinition import SettingDefinition + + class SettingInheritanceManager(QObject): - def __init__(self, parent = None): + def __init__(self, parent = None) -> None: super().__init__(parent) Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) - self._global_container_stack = None - self._settings_with_inheritance_warning = [] - self._active_container_stack = None + self._global_container_stack = None # type: Optional[ContainerStack] + self._settings_with_inheritance_warning = [] # type: List[str] + self._active_container_stack = None # type: Optional[ExtruderStack] self._onGlobalContainerChanged() ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged) @@ -41,7 +46,9 @@ class SettingInheritanceManager(QObject): ## Get the keys of all children settings with an override. @pyqtSlot(str, result = "QStringList") - def getChildrenKeysWithOverride(self, key): + def getChildrenKeysWithOverride(self, key: str) -> List[str]: + if self._global_container_stack is None: + return [] definitions = self._global_container_stack.definition.findDefinitions(key=key) if not definitions: Logger.log("w", "Could not find definition for key [%s]", key) @@ -53,9 +60,11 @@ class SettingInheritanceManager(QObject): return result @pyqtSlot(str, str, result = "QStringList") - def getOverridesForExtruder(self, key, extruder_index): - result = [] + def getOverridesForExtruder(self, key: str, extruder_index: str) -> List[str]: + if self._global_container_stack is None: + return [] + result = [] # type: List[str] extruder_stack = ExtruderManager.getInstance().getExtruderStack(extruder_index) if not extruder_stack: Logger.log("w", "Unable to find extruder for current machine with index %s", extruder_index) @@ -73,16 +82,16 @@ class SettingInheritanceManager(QObject): return result @pyqtSlot(str) - def manualRemoveOverride(self, key): + def manualRemoveOverride(self, key: str) -> None: if key in self._settings_with_inheritance_warning: self._settings_with_inheritance_warning.remove(key) self.settingsWithIntheritanceChanged.emit() @pyqtSlot() - def forceUpdate(self): + def forceUpdate(self) -> None: self._update() - def _onActiveExtruderChanged(self): + def _onActiveExtruderChanged(self) -> None: new_active_stack = ExtruderManager.getInstance().getActiveExtruderStack() if not new_active_stack: self._active_container_stack = None @@ -94,13 +103,14 @@ class SettingInheritanceManager(QObject): self._active_container_stack.containersChanged.disconnect(self._onContainersChanged) self._active_container_stack = new_active_stack - self._active_container_stack.propertyChanged.connect(self._onPropertyChanged) - self._active_container_stack.containersChanged.connect(self._onContainersChanged) + if self._active_container_stack is not None: + self._active_container_stack.propertyChanged.connect(self._onPropertyChanged) + self._active_container_stack.containersChanged.connect(self._onContainersChanged) self._update() # Ensure that the settings_with_inheritance_warning list is populated. - def _onPropertyChanged(self, key, property_name): + def _onPropertyChanged(self, key: str, property_name: str) -> None: if (property_name == "value" or property_name == "enabled") and self._global_container_stack: - definitions = self._global_container_stack.definition.findDefinitions(key = key) + definitions = self._global_container_stack.definition.findDefinitions(key = key) # type: List["SettingDefinition"] if not definitions: return @@ -139,7 +149,7 @@ class SettingInheritanceManager(QObject): if settings_with_inheritance_warning_changed: self.settingsWithIntheritanceChanged.emit() - def _recursiveCheck(self, definition): + def _recursiveCheck(self, definition: "SettingDefinition") -> bool: for child in definition.children: if child.key in self._settings_with_inheritance_warning: return True @@ -149,7 +159,7 @@ class SettingInheritanceManager(QObject): return False @pyqtProperty("QVariantList", notify = settingsWithIntheritanceChanged) - def settingsWithInheritanceWarning(self): + def settingsWithInheritanceWarning(self) -> List[str]: return self._settings_with_inheritance_warning ## Check if a setting has an inheritance function that is overwritten @@ -157,9 +167,14 @@ class SettingInheritanceManager(QObject): has_setting_function = False if not stack: stack = self._active_container_stack - if not stack: #No active container stack yet! + if not stack: # No active container stack yet! return False - containers = [] # type: List[ContainerInterface] + + if self._active_container_stack is None: + return False + all_keys = self._active_container_stack.getAllKeys() + + containers = [] # type: List[ContainerInterface] ## Check if the setting has a user state. If not, it is never overwritten. has_user_state = stack.getProperty(key, "state") == InstanceState.User @@ -190,8 +205,8 @@ class SettingInheritanceManager(QObject): has_setting_function = isinstance(value, SettingFunction) if has_setting_function: for setting_key in value.getUsedSettingKeys(): - if setting_key in self._active_container_stack.getAllKeys(): - break # We found an actual setting. So has_setting_function can remain true + if setting_key in all_keys: + break # We found an actual setting. So has_setting_function can remain true else: # All of the setting_keys turned out to not be setting keys at all! # This can happen due enum keys also being marked as settings. @@ -205,7 +220,7 @@ class SettingInheritanceManager(QObject): break # There is a setting function somewhere, stop looking deeper. return has_setting_function and has_non_function_value - def _update(self): + def _update(self) -> None: self._settings_with_inheritance_warning = [] # Reset previous data. # Make sure that the GlobalStack is not None. sometimes the globalContainerChanged signal gets here late. @@ -226,7 +241,7 @@ class SettingInheritanceManager(QObject): # Notify others that things have changed. self.settingsWithIntheritanceChanged.emit() - def _onGlobalContainerChanged(self): + def _onGlobalContainerChanged(self) -> None: if self._global_container_stack: self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged) self._global_container_stack.containersChanged.disconnect(self._onContainersChanged) From 4a0808378b9a224cde179b95c8326343b33a5202 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 16 Oct 2018 13:23:35 +0200 Subject: [PATCH 209/212] Allow whitespaces in the job name. Fixes #4530. --- resources/qml/JobSpecs.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml index 31ca84d66e..1a5b604886 100644 --- a/resources/qml/JobSpecs.qml +++ b/resources/qml/JobSpecs.qml @@ -86,7 +86,7 @@ Item { printJobTextfield.focus = false; } validator: RegExpValidator { - regExp: /^[^\\ \/ \*\?\|\[\]]*$/ + regExp: /^[^\\\/\*\?\|\[\]]*$/ } style: TextFieldStyle{ textColor: UM.Theme.getColor("text_scene"); From 25000e8a6b9232bebdb4565463dcd41e347aeb4c Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 16 Oct 2018 13:05:15 +0200 Subject: [PATCH 210/212] Fix typo's. [CURA-5760] Feature support brim. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 22491417ab..138e1adcc5 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4613,7 +4613,7 @@ "brim_replaces_support": { "label": "Brim Replaces Support", - "description": "Enforce brim to be printed around the model even if that space would otherwise be occupied by support. This replaces some regions fo the first layer of supprot by brim regions.", + "description": "Enforce brim to be printed around the model even if that space would otherwise be occupied by support. This replaces some regions of the first layer of support by brim regions.", "type": "bool", "default_value": true, "enabled": "resolveOrValue('adhesion_type') == 'brim' and support_enable", From 20fa7f4dd8c55c32547c5157f5d7b9f94ea16af9 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 16 Oct 2018 16:47:05 +0200 Subject: [PATCH 211/212] Display retractions lines for the loaded Gcode files CURA-5769 --- plugins/GCodeReader/FlavorParser.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index eb19853748..1dc20d5602 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -44,6 +44,7 @@ class FlavorParser: self._extruder_offsets = {} # type: Dict[int, List[float]] # Offsets for multi extruders. key is index, value is [x-offset, y-offset] self._current_layer_thickness = 0.2 # default self._filament_diameter = 2.85 # default + self._previous_extrusion_value = 0 # keep track of the filament retractions CuraApplication.getInstance().getPreferences().addPreference("gcodereader/show_caution", True) @@ -182,6 +183,7 @@ class FlavorParser: new_extrusion_value = params.e if self._is_absolute_extrusion else e[self._extruder_number] + params.e if new_extrusion_value > e[self._extruder_number]: path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], self._layer_type]) # extrusion + self._previous_extrusion_value = new_extrusion_value else: path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) # retraction e[self._extruder_number] = new_extrusion_value @@ -191,6 +193,12 @@ class FlavorParser: if z > self._previous_z and (z - self._previous_z < 1.5): self._current_layer_thickness = z - self._previous_z # allow a tiny overlap self._previous_z = z + elif self._previous_extrusion_value > e[self._extruder_number]: + path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) + + # This case only for initial start, for the first coordinate in GCode + elif e[self._extruder_number] == 0 and self._previous_extrusion_value == 0: + path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) else: path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveCombingType]) return self._position(x, y, z, f, e) @@ -235,6 +243,7 @@ class FlavorParser: position.e) def processGCode(self, G: int, line: str, position: Position, path: List[List[Union[float, int]]]) -> Position: + self.previous_extrusion_value = 0 func = getattr(self, "_gCode%s" % G, None) line = line.split(";", 1)[0] # Remove comments (if any) if func is not None: From a7be605b9d3c1cd52bb7323373237f7c7554411d Mon Sep 17 00:00:00 2001 From: alekseisasin Date: Wed, 17 Oct 2018 09:50:22 +0200 Subject: [PATCH 212/212] Typing error in CI CURA-5769 --- plugins/GCodeReader/FlavorParser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index 1dc20d5602..9ba1deb410 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -44,7 +44,7 @@ class FlavorParser: self._extruder_offsets = {} # type: Dict[int, List[float]] # Offsets for multi extruders. key is index, value is [x-offset, y-offset] self._current_layer_thickness = 0.2 # default self._filament_diameter = 2.85 # default - self._previous_extrusion_value = 0 # keep track of the filament retractions + self._previous_extrusion_value = 0.0 # keep track of the filament retractions CuraApplication.getInstance().getPreferences().addPreference("gcodereader/show_caution", True) @@ -243,7 +243,7 @@ class FlavorParser: position.e) def processGCode(self, G: int, line: str, position: Position, path: List[List[Union[float, int]]]) -> Position: - self.previous_extrusion_value = 0 + self._previous_extrusion_value = 0.0 func = getattr(self, "_gCode%s" % G, None) line = line.split(";", 1)[0] # Remove comments (if any) if func is not None: