Merge branch 'maintenance' into devel
Conflicts: CHANGELOG.md docs/api/fileops.rst src/octoprint/plugins/virtual_printer/virtual.py src/octoprint/server/api/files.py src/octoprint/static/css/octoprint.css src/octoprint/static/js/app/dataupdater.js src/octoprint/static/js/app/main.js src/octoprint/static/js/app/viewmodels/files.js src/octoprint/static/js/app/viewmodels/settings.js src/octoprint/templates/sidebar/state.jinja2 src/octoprint/util/comm.py
This commit is contained in:
commit
aae01fe81b
31 changed files with 1395 additions and 621 deletions
|
|
@ -16,11 +16,11 @@ rc
|
|||
HEAD
|
||||
\(detached.*
|
||||
|
||||
# maintenance is currently the branch for preparation of maintenance release 1.2.14
|
||||
# maintenance is currently the branch for preparation of maintenance release 1.2.15
|
||||
# so are any fix/... and improve/... branches
|
||||
maintenance 1.2.14 cb2e0d449f607bbc89c7ad13c983a0cf11bbfdee pep440-dev
|
||||
fix/.* 1.2.14 cb2e0d449f607bbc89c7ad13c983a0cf11bbfdee pep440-dev
|
||||
improve/.* 1.2.14 cb2e0d449f607bbc89c7ad13c983a0cf11bbfdee pep440-dev
|
||||
maintenance 1.2.15 14969e5508b7b66f38abaf0f96bb7dc5b9ebe929 pep440-dev
|
||||
fix/.* 1.2.15 14969e5508b7b66f38abaf0f96bb7dc5b9ebe929 pep440-dev
|
||||
improve/.* 1.2.15 14969e5508b7b66f38abaf0f96bb7dc5b9ebe929 pep440-dev
|
||||
|
||||
# every other branch is a development branch and thus gets resolved to 1.3.0-dev for now
|
||||
.* 1.3.0 198d3450d94be1a2 pep440-dev
|
||||
|
|
|
|||
37
CHANGELOG.md
37
CHANGELOG.md
|
|
@ -74,6 +74,43 @@
|
|||
* [#1047](https://github.com/foosel/OctoPrint/issues/1047) - Fixed 90 degree
|
||||
webcam rotation for iOS Safari.
|
||||
|
||||
## 1.2.14 (2016-07-28)
|
||||
|
||||
### Improvements
|
||||
|
||||
* [#935](https://github.com/foosel/OctoPrint/issues/935) - Support alternative source file types and target extensions in [SlicerPlugins](http://docs.octoprint.org/en/master/plugins/mixins.html#slicerplugin).
|
||||
* [#1393](https://github.com/foosel/OctoPrint/issues/1393) - Added dedicated sub commands on the job API to pause and resume a print job (instead of only offering a toggle option).
|
||||
* Better "upload error" message with a list of supported extensions (instead of hardcoded ones)
|
||||
* Use fuzzy times for print time estimation from GCODE analysis
|
||||
* Allow M23 "File opened" response with no filename (RepRapPro)
|
||||
* Allow intermediary startup page to forward query parameters and fragments from initial call to actual web frontend
|
||||
* More error resilience when rendering templates (e.g. from plugins)
|
||||
* Make sure that all bytes of a line to send to the printer have actually been sent
|
||||
* "Tickle" printer when encountering a communication timeout while idle
|
||||
* Report `CLOSED`/`CLOSED_WITH_ERROR` states as "Offline" in frontend for more consistency with startup `NONE` state which already was reported as "Offline"
|
||||
* Another attempt at a saner print time estimation: Force linear (way less accurate) estimate if calculation of more accurate version takes too long, sanity check calculated estimate and use linear estimate if it looks wrong, improved threshold values for calculation. Read [the second half of this post on the mailing list](https://groups.google.com/forum/#!msg/octoprint/WWpm1FCUkAs/X3HomTM5DgAJ) on why accurate print time estimation is so difficult to achieve.
|
||||
* Display print job progress percentage on progress bar.
|
||||
* Added an indicator for print time left prediction accuracy and explanation of its origin as tooltip.
|
||||
* Improved visual distinction of "State" sidebar panel info clusters.
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* [#1385](https://github.com/foosel/OctoPrint/issues/1385) - Send all non-protocol messages from printer to clients.
|
||||
* [#1388](https://github.com/foosel/OctoPrint/issues/1388) - Track consecutive timeouts even when idle and disconnect from printer when it's not responding any longer.
|
||||
* [#1391](https://github.com/foosel/OctoPrint/issues/1391) - Only use the first value from the X-Scheme header for the reverse proxy setup. Otherwise there could be problems when multiple reverse proxies were configured chained together, each adding their own header to the mix.
|
||||
* [#1407](https://github.com/foosel/OctoPrint/issues/1407) - If a file is uploaded with the "print" flag set to true, make sure to clear that flag after the print job has been triggered so that now all following uploaded or selected files will start printing on their own.
|
||||
* [#1409](https://github.com/foosel/OctoPrint/issues/1409) - Don't report a communication timeout after a heatup triggered by a print from SD.
|
||||
* Fixed scrolling to freshly uploaded files, also now highlighting the file entry for better visibility.
|
||||
* Fixed overeager preemptive caching of invalid protocols.
|
||||
* Fix modal background of update confirmation not vanishing
|
||||
* Ensure log entries and messages from printer are sent to frontend already converted to utf-8. Otherwise even one line in the log that can't be converted automatically without error can cause updates from the backend to not arrive.
|
||||
* Report correct printer state including error strings even after disconnecting
|
||||
* While printing, be sure to read the next line from file and send that if the current line was filtered
|
||||
* Small fixes in the GCODE analysis
|
||||
* Small fixes in the documentation
|
||||
|
||||
([Commits](https://github.com/foosel/OctoPrint/compare/1.2.13...1.2.14))
|
||||
|
||||
## 1.2.13 (2016-06-16)
|
||||
|
||||
### Bug Fixes
|
||||
|
|
|
|||
|
|
@ -7,34 +7,37 @@ thanks to everyone who contributed!
|
|||
## Patreon Patrons
|
||||
|
||||
* 3D Moniak
|
||||
* alephobjects
|
||||
* alephobjects
|
||||
* Andrew Moorby
|
||||
* Arnljot Arntsen
|
||||
* Aurelio Bernal Ramírez
|
||||
* Bart Zudell
|
||||
* Brad Jackson
|
||||
* Brad Mooneyham
|
||||
* Brent Fiegle
|
||||
* Brian E. Tyler
|
||||
* Charles Mitchell
|
||||
* Christian Petropolis
|
||||
* COLLE+McVOY
|
||||
* CreativeTools
|
||||
* COLLE+McVOY
|
||||
* CreativeTools
|
||||
* D Brian Kimmel
|
||||
* DeltaMaker 3D Printers
|
||||
* Doug Johnson
|
||||
* E3D BigBox
|
||||
* Erik de Bruijn
|
||||
* Ernesto Martinez
|
||||
* Exovite
|
||||
* Exovite
|
||||
* Frank Sander
|
||||
* georgeroblesjr
|
||||
* georgeroblesjr
|
||||
* Gregor Luetolf
|
||||
* J. Eckert
|
||||
* Jason Galarneau
|
||||
* Joe Korzeniewski
|
||||
* Joshua Gregory
|
||||
* Kaile Riser
|
||||
* Kale Stedman
|
||||
* Kevin Freeheart
|
||||
* Kazuhiro Ogura
|
||||
* Korneel Bullens
|
||||
* Kyle Gress
|
||||
* Makespace Madrid
|
||||
* Mark Lane
|
||||
|
|
@ -43,18 +46,20 @@ thanks to everyone who contributed!
|
|||
* Masayoshi Mitsui
|
||||
* Michael McDargh
|
||||
* Miguel Angel Salmeron
|
||||
* Mikey
|
||||
* Mikey
|
||||
* Miles Flavel
|
||||
* Mohammed Khorakiwala
|
||||
* Noe Ruiz
|
||||
* Paul Generes
|
||||
* Peter Grace
|
||||
* Peter Schmehl
|
||||
* PRINT3Dforum.com
|
||||
* Roger Strolz
|
||||
* Roy Cortes
|
||||
* Samer Najia
|
||||
* SD3D
|
||||
* SD3D
|
||||
* Shane Ekerbicer
|
||||
* Simon
|
||||
* Simon Hallam
|
||||
* Stefan Krister
|
||||
* stefi davis
|
||||
* Steven Pearson
|
||||
|
|
@ -63,4 +68,4 @@ thanks to everyone who contributed!
|
|||
* Thomas Sanladerer
|
||||
* Trent Shumay
|
||||
|
||||
and 734 more wonderful people pledging on the [Patreon campaign](https://patreon.com/foosel)!
|
||||
and 844 more wonderful people pledging on the [Patreon campaign](https://patreon.com/foosel)!
|
||||
|
|
@ -442,7 +442,7 @@ Issue a file command
|
|||
}
|
||||
|
||||
|
||||
:param location: The target location on which to delete the file, either ``local`` (for OctoPrint's ``uploads``
|
||||
:param location: The target location on which to send the command for is located, either ``local`` (for OctoPrint's ``uploads``
|
||||
folder) or ``sdcard`` for the printer's SD card (if available)
|
||||
:param path: The path of the file for which to issue the command
|
||||
:json string command: The command to issue for the file, currently only ``select`` is supported
|
||||
|
|
|
|||
|
|
@ -244,6 +244,9 @@ The following settings are only relevant to you if you want to do OctoPrint deve
|
|||
# be fully rerendered on request to / on the server.
|
||||
enabled: true
|
||||
|
||||
# Whether to enable the preemptive cache
|
||||
preemptive: true
|
||||
|
||||
# Settings for stylesheet preference. OctoPrint will prefer to use the stylesheet type
|
||||
# specified here. Usually (on a production install) that will be the compiled css (default).
|
||||
# Developers may specify less here too.
|
||||
|
|
@ -260,6 +263,9 @@ The following settings are only relevant to you if you want to do OctoPrint deve
|
|||
# set to false, no minification will take place either.
|
||||
minify: true
|
||||
|
||||
# Whether to delete generated web assets on server startup (forcing a regeneration)
|
||||
clean_on_startup: true
|
||||
|
||||
# Settings for the virtual printer
|
||||
virtualPrinter:
|
||||
|
||||
|
|
@ -321,6 +327,10 @@ The following settings are only relevant to you if you want to do OctoPrint deve
|
|||
# < ok T0:34.3/220.0 T1:23.5/0.0 B:43.2/0.0
|
||||
repetierStyleTargetTemperature: false
|
||||
|
||||
# If enabled, uses repetier style resends, sending multiple resends for the same line
|
||||
# to make sure nothing gets lost on the line
|
||||
repetierStyleResends: false
|
||||
|
||||
# If enabled, reports the first extruder in M105 responses as T instead of T0
|
||||
#
|
||||
# True: > M105
|
||||
|
|
@ -348,9 +358,54 @@ The following settings are only relevant to you if you want to do OctoPrint deve
|
|||
# side will block
|
||||
rxBuffer: 64
|
||||
|
||||
# Size of
|
||||
# Size of simulated command buffer
|
||||
commandBuffer: 4
|
||||
|
||||
# Whether to support the M112 command with simulated kill
|
||||
supportM112: true
|
||||
|
||||
# Whether to send messages received via M117 back as "echo:" lines
|
||||
echoOnM117: true
|
||||
|
||||
# Whether to simulate broken M29 behaviour (missing ok after response)
|
||||
brokenM29: true
|
||||
|
||||
.. _sec-configuration-config_yaml-estimation:
|
||||
|
||||
Estimation
|
||||
----------
|
||||
|
||||
The following settings provide parameters for estimators within OctoPrint. Currently only
|
||||
the estimation of the left print time during an active job utilizes this section.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
estimation:
|
||||
# Parameters for the print time estmation during an ongoing print job
|
||||
printTime:
|
||||
# Until which percentage to do a weighted mixture of statistical duration (analysis or
|
||||
# past prints) with the result from the calculated estimate if that's already available.
|
||||
# Utilized to compensate for the fact that the earlier in a print job, the least accuracy
|
||||
# even a stable calculated estimate provides.
|
||||
statsWeighingUntil: 0.5
|
||||
|
||||
# Range the assumed percentage (based on current estimated statistical, calculated or mixed
|
||||
# total vs elapsed print time so far) needs to be around the actual percentage for the
|
||||
# result to be used
|
||||
validityRange: 0.15
|
||||
|
||||
# If no estimate could be calculated until this percentage and no statistical data is available,
|
||||
# use dumb linear estimate
|
||||
forceDumbFromPercent: 0.3
|
||||
|
||||
# If no estimate could be calculated until this many minutes into the print and no statistical
|
||||
# data is available, use dumb linear estimate
|
||||
forceDumbAfterMin: 30
|
||||
|
||||
# Average fluctuation between individual calculated estimates to consider in stable range. Seconds
|
||||
# of difference.
|
||||
stableThreshold: 60
|
||||
|
||||
.. _sec-configuration-config_yaml-events:
|
||||
|
||||
Events
|
||||
|
|
@ -454,6 +509,16 @@ Use the following settings to enable or disable OctoPrint features:
|
|||
# Whether to enable the keyboard control feature in the control tab
|
||||
keyboardControl: true
|
||||
|
||||
# Whether to actively poll the watched folder (true) or to rely on the OS's file system
|
||||
# notifications instead (false)
|
||||
pollWatched: false
|
||||
|
||||
# Whether to ignore identical resends from the printer (true, repetier) or not (false)
|
||||
ignoreIdenticalResends: false
|
||||
|
||||
# If ignoredIdenticalResends is true, how many consecutive identical resends to ignore
|
||||
identicalResendsCount: 7
|
||||
|
||||
.. _sec-configuration-config_yaml-folder:
|
||||
|
||||
Folder
|
||||
|
|
@ -645,8 +710,24 @@ Use the following settings to configure the serial connection to the printer:
|
|||
# Command to send in order to initiate a handshake with the printer.
|
||||
# Defaults to "M110 N0" which simply resets the line numbers in the firmware and which
|
||||
# should be acknowledged with a simple "ok".
|
||||
helloCommand:
|
||||
- M110 N0
|
||||
helloCommand: M110 N0
|
||||
|
||||
# Whether to disconnect on errors or not
|
||||
disconnectOnErrors: true
|
||||
|
||||
# Whether to completely ignore errors from the firmware or not
|
||||
ignoreErrorsFromFirmware: false
|
||||
|
||||
# Whether to log resends to octoprint.log or not. Invaluable debug tool without performance
|
||||
# impact, leave on if possible please
|
||||
logResends: true
|
||||
|
||||
# Whether to support resends without follow-up ok or not
|
||||
supportResendsWithoutOk: false
|
||||
|
||||
# Whether to "manually" trigger an ok for M29 (a lot of versions of this command are buggy and
|
||||
# the responds skips on the ok)
|
||||
triggerOkForM29: true
|
||||
|
||||
.. _sec-configuration-config_yaml-server:
|
||||
|
||||
|
|
@ -741,6 +822,27 @@ Use the following settings to configure the server:
|
|||
# Command to shut down the system OctoPrint is running on, defaults to being unset
|
||||
systemShutdownCommand: sudo shutdown -h now
|
||||
|
||||
# Settings of when to display what disk space warning
|
||||
diskspace:
|
||||
|
||||
# Threshold (bytes) after which to consider disk space becoming sparse,
|
||||
# defaults to 500MB
|
||||
warning: 63488000
|
||||
|
||||
# Threshold (bytes) after which to consider disk space becoming critical,
|
||||
# defaults to 200MB
|
||||
critical: 209715200
|
||||
|
||||
# Configuration of the preemptive cache
|
||||
preemptiveCache:
|
||||
|
||||
# which server paths to exclude from the preemptive cache
|
||||
exceptions:
|
||||
- /some/path
|
||||
|
||||
# How many days to leave unused entries in the preemptive cache config
|
||||
until: 7
|
||||
|
||||
|
||||
.. note::
|
||||
|
||||
|
|
|
|||
2
setup.py
2
setup.py
|
|
@ -23,7 +23,7 @@ INSTALL_REQUIRES = [
|
|||
"Flask-Principal>=0.3.5,<0.4",
|
||||
"Flask-Babel>=0.9,<0.10",
|
||||
"Flask-Assets>=0.10,<0.11",
|
||||
"Flask-Markdown>=0.3,<0.4",
|
||||
"markdown>=2.6.4,<2.7",
|
||||
"pyserial>=2.7,<2.8",
|
||||
"netaddr>=0.7.17,<0.8",
|
||||
"watchdog>=0.8.3,<0.9",
|
||||
|
|
|
|||
|
|
@ -97,6 +97,8 @@ class VirtualPrinter(object):
|
|||
|
||||
self._incoming_lock = threading.RLock()
|
||||
|
||||
self._debug_awol = False
|
||||
self._debug_sleep = None
|
||||
self._sleepAfterNext = dict()
|
||||
self._sleepAfter = dict()
|
||||
|
||||
|
|
@ -485,6 +487,8 @@ class VirtualPrinter(object):
|
|||
|
||||
dont_answer
|
||||
| Will not acknowledge the next command.
|
||||
go_awol
|
||||
| Will completely stop replying
|
||||
trigger_resend_lineno
|
||||
| Triggers a resend error with a line number mismatch
|
||||
trigger_resend_checksum
|
||||
|
|
@ -518,7 +522,10 @@ class VirtualPrinter(object):
|
|||
elif data == "drop_connection":
|
||||
self._debug_drop_connection = True
|
||||
elif data == "maxtemp_error":
|
||||
self.outgoing.put("Error: MAXTEMP triggered!")
|
||||
self._output("Error: MAXTEMP triggered!")
|
||||
elif data == "go_awol":
|
||||
self._output("// Going AWOL")
|
||||
self._debug_awol = True
|
||||
else:
|
||||
try:
|
||||
sleep_match = VirtualPrinter.sleep_regex.match(data)
|
||||
|
|
@ -529,7 +536,7 @@ class VirtualPrinter(object):
|
|||
if sleep_match is not None:
|
||||
interval = int(sleep_match.group(1))
|
||||
self._send("// sleeping for {interval} seconds".format(interval=interval))
|
||||
time.sleep(interval)
|
||||
self._debug_sleep = interval
|
||||
elif sleep_after_match is not None:
|
||||
command = sleep_after_match.group(1)
|
||||
interval = int(sleep_after_match.group(2))
|
||||
|
|
@ -769,7 +776,7 @@ class VirtualPrinter(object):
|
|||
try:
|
||||
handle = open(file, "w")
|
||||
except:
|
||||
self.outgoing.put("error writing to file")
|
||||
self._output("error writing to file")
|
||||
if handle is not None:
|
||||
try:
|
||||
handle.close()
|
||||
|
|
@ -789,7 +796,7 @@ class VirtualPrinter(object):
|
|||
self._writingToSdHandle = None
|
||||
self._writingToSd = False
|
||||
self._selectedSdFile = None
|
||||
self.outgoing.put("Done saving file")
|
||||
self._output("Done saving file")
|
||||
|
||||
def _sdPrintingWorker(self):
|
||||
self._selectedSdFilePos = 0
|
||||
|
|
@ -827,7 +834,7 @@ class VirtualPrinter(object):
|
|||
self._sdPrintingSemaphore.clear()
|
||||
self._selectedSdFilePos = 0
|
||||
self._sdPrinter = None
|
||||
self.outgoing.put("Done printing file")
|
||||
self._output("Done printing file")
|
||||
|
||||
def _waitForHeatup(self, heater):
|
||||
delta = 1
|
||||
|
|
@ -838,12 +845,12 @@ class VirtualPrinter(object):
|
|||
toolNum = int(heater[len("tool"):])
|
||||
while not self._killed and (self.temp[toolNum] < self.targetTemp[toolNum] - delta or self.temp[toolNum] > self.targetTemp[toolNum] + delta):
|
||||
self._simulateTemps(delta=delta)
|
||||
self.outgoing.put("T:%0.2f" % self.temp[toolNum])
|
||||
self._output("T:%0.2f" % self.temp[toolNum])
|
||||
time.sleep(delay)
|
||||
elif heater == "bed":
|
||||
while not self._killed and (self.bedTemp < self.bedTargetTemp - delta or self.bedTemp > self.bedTargetTemp + delta):
|
||||
self._simulateTemps(delta=delta)
|
||||
self.outgoing.put("B:%0.2f" % self.bedTemp)
|
||||
self._output("B:%0.2f" % self.bedTemp)
|
||||
time.sleep(delay)
|
||||
except AttributeError:
|
||||
if self.outgoing is not None:
|
||||
|
|
@ -890,7 +897,17 @@ class VirtualPrinter(object):
|
|||
|
||||
self._logger.info("Closing down buffer loop")
|
||||
|
||||
def _output(self, line):
|
||||
try:
|
||||
self.outgoing.put(line)
|
||||
except:
|
||||
if self.outgoing is None:
|
||||
pass
|
||||
|
||||
def write(self, data):
|
||||
if self._debug_awol:
|
||||
return len(data)
|
||||
|
||||
if self._debug_drop_connection:
|
||||
self._logger.info("Debug drop of connection requested, raising SerialTimeoutException")
|
||||
raise SerialTimeoutException()
|
||||
|
|
@ -913,15 +930,40 @@ class VirtualPrinter(object):
|
|||
raise SerialTimeoutException()
|
||||
|
||||
def readline(self):
|
||||
if self._debug_awol:
|
||||
time.sleep(self._read_timeout)
|
||||
return ""
|
||||
|
||||
if self._debug_drop_connection:
|
||||
raise SerialTimeoutException()
|
||||
|
||||
if self._debug_sleep > 0:
|
||||
# if we are supposed to sleep, we sleep not longer than the read timeout
|
||||
# (and then on the next call sleep again if there's time to sleep left)
|
||||
sleep_for = min(self._debug_sleep, self._read_timeout)
|
||||
self._debug_sleep -= sleep_for
|
||||
time.sleep(sleep_for)
|
||||
|
||||
if self._debug_sleep > 0:
|
||||
# we slept the full read timeout, return an empty line
|
||||
return ""
|
||||
|
||||
# otherwise our left over timeout is the read timeout minus what we already
|
||||
# slept for
|
||||
timeout = self._read_timeout - sleep_for
|
||||
|
||||
else:
|
||||
# use the full read timeout as timeout
|
||||
timeout = self._read_timeout
|
||||
|
||||
try:
|
||||
line = self.outgoing.get(timeout=self._read_timeout)
|
||||
# fetch a line from the queue, wait no longer than timeout
|
||||
line = self.outgoing.get(timeout=timeout)
|
||||
self._seriallog.info(">>> {}".format(line.strip()))
|
||||
self.outgoing.task_done()
|
||||
return line
|
||||
except queue.Empty:
|
||||
# queue empty? return empty line
|
||||
return ""
|
||||
|
||||
def close(self):
|
||||
|
|
@ -961,7 +1003,8 @@ class CharCountingQueue(queue.Queue):
|
|||
try:
|
||||
if not self._will_it_fit(item) and partial:
|
||||
space_left = self.maxsize - self._qsize()
|
||||
item = item[:space_left]
|
||||
if space_left:
|
||||
item = item[:space_left]
|
||||
|
||||
if not block:
|
||||
if not self._will_it_fit(item):
|
||||
|
|
|
|||
|
|
@ -72,6 +72,10 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
|
|||
|
||||
self._selectedFile = None
|
||||
self._timeEstimationData = None
|
||||
self._timeEstimationStatsWeighingUntil = settings().getFloat(["estimation", "printTime", "statsWeighingUntil"])
|
||||
self._timeEstimationValidityRange = settings().getFloat(["estimation", "printTime", "validityRange"])
|
||||
self._timeEstimationForceDumbFromPercent = settings().getFloat(["estimation", "printTime", "forceDumbFromPercent"])
|
||||
self._timeEstimationForceDumbAfterMin = settings().getFloat(["estimation", "printTime", "forceDumbAfterMin"])
|
||||
|
||||
# comm
|
||||
self._comm = None
|
||||
|
|
@ -407,20 +411,21 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
|
|||
if self._selectedFile is None:
|
||||
return
|
||||
|
||||
# we are happy if the average of the estimates stays within 60s of the prior one
|
||||
threshold = settings().getFloat(["estimation", "printTime", "stableThreshold"])
|
||||
rolling_window = None
|
||||
threshold = None
|
||||
countdown = None
|
||||
|
||||
if self._selectedFile["sd"]:
|
||||
# we are interesting in a rolling window of roughly the last 15s, so the number of entries has to be derived
|
||||
# by that divided by the sd status polling interval
|
||||
rolling_window = 15 / settings().get(["serial", "timeout", "sdStatus"])
|
||||
|
||||
# we are happy if the average of the estimates stays within 60s of the prior one
|
||||
threshold = 60
|
||||
|
||||
# we are happy when one rolling window has been stable
|
||||
countdown = rolling_window
|
||||
self._timeEstimationData = TimeEstimationHelper(rolling_window=rolling_window, threshold=threshold, countdown=countdown)
|
||||
self._timeEstimationData = TimeEstimationHelper(rolling_window=rolling_window,
|
||||
threshold=threshold,
|
||||
countdown=countdown)
|
||||
|
||||
self._fileManager.delete_recovery_data()
|
||||
|
||||
|
|
@ -614,9 +619,12 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
|
|||
self._currentZ = currentZ
|
||||
self._stateMonitor.set_current_z(self._currentZ)
|
||||
|
||||
def _setState(self, state):
|
||||
def _setState(self, state, state_string=None):
|
||||
if state_string is None:
|
||||
state_string = self.get_state_string()
|
||||
|
||||
self._state = state
|
||||
self._stateMonitor.set_state({"text": self.get_state_string(), "flags": self._getStateFlags()})
|
||||
self._stateMonitor.set_state({"text": state_string, "flags": self._getStateFlags()})
|
||||
|
||||
payload = dict(
|
||||
state_id=self.get_state_id(self._state),
|
||||
|
|
@ -664,22 +672,14 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
|
|||
printTime = self._comm.getPrintTime()
|
||||
cleanedPrintTime = self._comm.getCleanedPrintTime()
|
||||
|
||||
estimatedTotalPrintTime = self._estimateTotalPrintTime(progress, cleanedPrintTime)
|
||||
totalPrintTime = estimatedTotalPrintTime
|
||||
|
||||
if self._selectedFile and "estimatedPrintTime" in self._selectedFile and self._selectedFile["estimatedPrintTime"]:
|
||||
statisticalTotalPrintTime = None
|
||||
statisticalTotalPrintTimeType = None
|
||||
if self._selectedFile and "estimatedPrintTime" in self._selectedFile \
|
||||
and self._selectedFile["estimatedPrintTime"]:
|
||||
statisticalTotalPrintTime = self._selectedFile["estimatedPrintTime"]
|
||||
if progress and cleanedPrintTime:
|
||||
if estimatedTotalPrintTime is None:
|
||||
totalPrintTime = statisticalTotalPrintTime
|
||||
else:
|
||||
if progress < 0.5:
|
||||
sub_progress = progress * 2
|
||||
else:
|
||||
sub_progress = 1.0
|
||||
totalPrintTime = (1 - sub_progress) * statisticalTotalPrintTime + sub_progress * estimatedTotalPrintTime
|
||||
statisticalTotalPrintTimeType = self._selectedFile.get("estimatedPrintTimeType", None)
|
||||
|
||||
printTimeLeft = totalPrintTime - cleanedPrintTime if (totalPrintTime is not None and cleanedPrintTime is not None) else None
|
||||
printTimeLeft, printTimeLeftOrigin = self._estimatePrintTimeLeft(progress, printTime, cleanedPrintTime, statisticalTotalPrintTime, statisticalTotalPrintTimeType)
|
||||
|
||||
if progress is not None:
|
||||
progress_int = int(progress * 100)
|
||||
|
|
@ -690,7 +690,123 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
|
|||
return dict(completion=progress * 100 if progress is not None else None,
|
||||
filepos=filepos,
|
||||
printTime=int(printTime) if printTime is not None else None,
|
||||
printTimeLeft=int(printTimeLeft) if printTimeLeft is not None else None)
|
||||
printTimeLeft=int(printTimeLeft) if printTimeLeft is not None else None,
|
||||
printTimeLeftOrigin=printTimeLeftOrigin)
|
||||
|
||||
def _estimatePrintTimeLeft(self, progress, printTime, cleanedPrintTime, statisticalTotalPrintTime, statisticalTotalPrintTimeType):
|
||||
"""
|
||||
Tries to estimate the print time left for the print job
|
||||
|
||||
This is somewhat horrible since accurate print time estimation is pretty much impossible to
|
||||
achieve, considering that we basically have only two data points (current progress in file and
|
||||
time needed for that so far - former prints or a file analysis might not have happened or simply
|
||||
be completely impossible e.g. if the file is stored on the printer's SD card) and
|
||||
hence can only do a linear estimation of a completely non-linear process. That's a recipe
|
||||
for inaccurate predictions right there. Yay.
|
||||
|
||||
Anyhow, here's how this implementation works. This method gets the current progress in the
|
||||
printed file (percentage based on bytes read vs total bytes), the print time that elapsed,
|
||||
the same print time with the heat up times subtracted (if possible) and if available also
|
||||
some statistical total print time (former prints or a result from the GCODE analysis).
|
||||
|
||||
1. First get an "intelligent" estimate based on the :class:`~octoprint.printer.estimation.TimeEstimationHelper`.
|
||||
That thing tries to detect if the estimation based on our progress and time needed for that becomes
|
||||
stable over time through a rolling window and only returns a result once that appears to be the
|
||||
case.
|
||||
2. If we have any statistical data (former prints or a result from the GCODE analysis)
|
||||
but no intelligent estimate yet, we'll use that for the next step. Otherwise, up to a certain percentage
|
||||
in the print we do a percentage based weighing of the statistical data and the intelligent
|
||||
estimate - the closer to the beginning of the print, the more precedence for the statistical
|
||||
data, the closer to the cut off point, the more precendence for the intelligent estimate. This
|
||||
is our preliminary total print time.
|
||||
3. If the total print time is set, we do a sanity check for it. Based on the total print time
|
||||
estimate and the time we already spent printing, we calculate at what percentage we SHOULD be
|
||||
and compare that to the percentage at which we actually ARE. If it's too far off, our total
|
||||
can't be trusted and we fall back on the dumb estimate. Same if the time we spent printing is
|
||||
already higher than our total estimate.
|
||||
4. If we do NOT have a total print time estimate yet but we've been printing for longer than
|
||||
a configured amount of minutes or are further in the file than a configured percentage, we
|
||||
also use the dumb estimate for now.
|
||||
|
||||
Yes, all this still produces horribly inaccurate results. But we have to do this live during the print and
|
||||
hence can't produce to much computational overhead, we do not have any insight into the firmware implementation
|
||||
with regards to planner setup and acceleration settings, we might not even have access to the printed file's
|
||||
contents and such we need to find something that works "mostly" all of the time without costing too many
|
||||
resources. Feel free to propose a better solution within the above limitations (and I mean that, this solution
|
||||
here makes me unhappy).
|
||||
|
||||
Args:
|
||||
progress (float or None): Current percentage in the printed file
|
||||
printTime (float or None): Print time elapsed so far
|
||||
cleanedPrintTime (float or None): Print time elapsed minus the time needed for getting up to temperature
|
||||
(if detectable).
|
||||
statisticalTotalPrintTime (float or None): Total print time of past prints against same printer profile,
|
||||
or estimated total print time from GCODE analysis.
|
||||
statisticalTotalPrintTimeType (str or None): Type of statistical print time, either "average" (total time
|
||||
of former prints) or "analysis"
|
||||
|
||||
Returns:
|
||||
(2-tuple) estimated print time left or None if not proper estimate could be made at all, origin of estimation
|
||||
"""
|
||||
|
||||
if progress is None or printTime is None or cleanedPrintTime is None:
|
||||
return None
|
||||
|
||||
dumbTotalPrintTime = printTime / progress
|
||||
estimatedTotalPrintTime = self._estimateTotalPrintTime(progress, cleanedPrintTime)
|
||||
totalPrintTime = estimatedTotalPrintTime
|
||||
|
||||
printTimeLeftOrigin = "estimate"
|
||||
if statisticalTotalPrintTime is not None:
|
||||
if estimatedTotalPrintTime is None:
|
||||
# no estimate yet, we'll use the statistical total
|
||||
totalPrintTime = statisticalTotalPrintTime
|
||||
printTimeLeftOrigin = statisticalTotalPrintTimeType
|
||||
|
||||
else:
|
||||
if progress < self._timeEstimationStatsWeighingUntil:
|
||||
# still inside weighing range, use part stats, part current estimate
|
||||
sub_progress = progress * (1 / self._timeEstimationStatsWeighingUntil)
|
||||
if sub_progress > 1.0:
|
||||
sub_progress = 1.0
|
||||
printTimeLeftOrigin = "mixed-" + statisticalTotalPrintTimeType
|
||||
else:
|
||||
# use only the current estimate
|
||||
sub_progress = 1.0
|
||||
printTimeLeftOrigin = "estimate"
|
||||
|
||||
# combine
|
||||
totalPrintTime = (1.0 - sub_progress) * statisticalTotalPrintTime \
|
||||
+ sub_progress * estimatedTotalPrintTime
|
||||
|
||||
printTimeLeft = None
|
||||
if totalPrintTime is not None:
|
||||
# sanity check current total print time estimate
|
||||
assumed_progress = cleanedPrintTime / totalPrintTime
|
||||
min_progress = progress - self._timeEstimationValidityRange
|
||||
max_progress = progress + self._timeEstimationValidityRange
|
||||
|
||||
if min_progress <= assumed_progress <= max_progress and totalPrintTime > cleanedPrintTime:
|
||||
# appears sane, we'll use it
|
||||
printTimeLeft = totalPrintTime - cleanedPrintTime
|
||||
|
||||
else:
|
||||
# too far from the actual progress or negative,
|
||||
# we use the dumb print time instead
|
||||
printTimeLeft = dumbTotalPrintTime - cleanedPrintTime
|
||||
printTimeLeftOrigin = "linear"
|
||||
|
||||
elif progress > self._timeEstimationForceDumbFromPercent or \
|
||||
cleanedPrintTime * 60 >= self._timeEstimationForceDumbAfterMin:
|
||||
# more than x% or y min printed and still no real estimate, ok, we'll use the dumb variant :/
|
||||
printTimeLeft = dumbTotalPrintTime - cleanedPrintTime
|
||||
printTimeLeftOrigin = "linear"
|
||||
|
||||
if printTimeLeft < 0:
|
||||
# shouldn't actually happen, but let's make sure
|
||||
return None, None
|
||||
|
||||
return printTimeLeft, printTimeLeftOrigin
|
||||
|
||||
def _addTemperatureData(self, temp, bedTemp):
|
||||
currentTimeUtc = int(time.time())
|
||||
|
|
@ -781,9 +897,11 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
|
|||
|
||||
if averagePrintTime is not None:
|
||||
self._selectedFile["estimatedPrintTime"] = averagePrintTime
|
||||
self._selectedFile["estimatedPrintTimeType"] = "average"
|
||||
elif estimatedPrintTime is not None:
|
||||
# TODO apply factor which first needs to be tracked!
|
||||
self._selectedFile["estimatedPrintTime"] = estimatedPrintTime
|
||||
self._selectedFile["estimatedPrintTimeType"] = "analysis"
|
||||
|
||||
self._stateMonitor.set_job_data({
|
||||
"file": {
|
||||
|
|
@ -839,6 +957,9 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
|
|||
"""
|
||||
oldState = self._state
|
||||
|
||||
if self._comm is not None:
|
||||
state_string = self._comm.getStateString()
|
||||
|
||||
# forward relevant state changes to gcode manager
|
||||
if oldState == comm.MachineCom.STATE_PRINTING:
|
||||
if self._selectedFile is not None:
|
||||
|
|
@ -858,7 +979,7 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
|
|||
self._printerProfileManager.deselect()
|
||||
eventManager().fire(Events.DISCONNECTED)
|
||||
|
||||
self._setState(state)
|
||||
self._setState(state, state_string=state_string)
|
||||
|
||||
def on_comm_message(self, message):
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ from flask.ext.login import LoginManager, current_user
|
|||
from flask.ext.principal import Principal, Permission, RoleNeed, identity_loaded, UserNeed
|
||||
from flask.ext.babel import Babel, gettext, ngettext
|
||||
from flask.ext.assets import Environment, Bundle
|
||||
from flaskext.markdown import Markdown
|
||||
from babel import Locale
|
||||
from watchdog.observers import Observer
|
||||
from watchdog.observers.polling import PollingObserver
|
||||
|
|
@ -600,7 +599,8 @@ class Server(object):
|
|||
response.headers.add("X-Clacks-Overhead", "GNU Terry Pratchett")
|
||||
return response
|
||||
|
||||
Markdown(app)
|
||||
from octoprint.util.jinja import MarkdownFilter
|
||||
MarkdownFilter(app)
|
||||
|
||||
def _setup_i18n(self, app):
|
||||
global babel
|
||||
|
|
|
|||
|
|
@ -278,7 +278,7 @@ def uploadGcodeFile(target):
|
|||
done = True
|
||||
else:
|
||||
filename = fileProcessingFinished(added_file, fileManager.path_on_disk(FileDestinations.LOCAL, added_file), target)
|
||||
done = True
|
||||
done = not sd
|
||||
|
||||
if userdata is not None:
|
||||
# upload included userdata, add this now to the metadata
|
||||
|
|
|
|||
|
|
@ -98,7 +98,10 @@ def getSettings():
|
|||
"ignoreErrorsFromFirmware": s.getBoolean(["serial", "ignoreErrorsFromFirmware"]),
|
||||
"disconnectOnErrors": s.getBoolean(["serial", "disconnectOnErrors"]),
|
||||
"triggerOkForM29": s.getBoolean(["serial", "triggerOkForM29"]),
|
||||
"supportResendsWithoutOk": s.getBoolean(["serial", "supportResendsWithoutOk"])
|
||||
"supportResendsWithoutOk": s.getBoolean(["serial", "supportResendsWithoutOk"]),
|
||||
"maxTimeoutsIdle": s.getInt(["serial", "maxCommunicationTimeouts", "idle"]),
|
||||
"maxTimeoutsPrinting": s.getInt(["serial", "maxCommunicationTimeouts", "printing"]),
|
||||
"maxTimeoutsLong": s.getInt(["serial", "maxCommunicationTimeouts", "long"])
|
||||
},
|
||||
"folder": {
|
||||
"uploads": s.getBaseFolder("uploads"),
|
||||
|
|
@ -259,6 +262,9 @@ def _saveSettings(data):
|
|||
if "disconnectOnErrors" in data["serial"]: s.setBoolean(["serial", "disconnectOnErrors"], data["serial"]["disconnectOnErrors"])
|
||||
if "triggerOkForM29" in data["serial"]: s.setBoolean(["serial", "triggerOkForM29"], data["serial"]["triggerOkForM29"])
|
||||
if "supportResendsWithoutOk" in data["serial"]: s.setBoolean(["serial", "supportResendsWithoutOk"], data["serial"]["supportResendsWithoutOk"])
|
||||
if "maxTimeoutsIdle" in data["serial"]: s.setInt(["serial", "maxCommunicationTimeouts", "idle"], data["serial"]["maxTimeoutsIdle"])
|
||||
if "maxTimeoutsPrinting" in data["serial"]: s.setInt(["serial", "maxCommunicationTimeouts", "printing"], data["serial"]["maxTimeoutsPrinting"])
|
||||
if "maxTimeoutsLong" in data["serial"]: s.setInt(["serial", "maxCommunicationTimeouts", "long"], data["serial"]["maxTimeoutsLong"])
|
||||
|
||||
oldLog = s.getBoolean(["serial", "log"])
|
||||
if "log" in data["serial"].keys(): s.setBoolean(["serial", "log"], data["serial"]["log"])
|
||||
|
|
|
|||
|
|
@ -907,6 +907,7 @@ def collect_plugin_assets(enable_gcodeviewer=True, preferred_stylesheet="css"):
|
|||
assets["js"] = [
|
||||
'js/app/bindings/allowbindings.js',
|
||||
'js/app/bindings/contextmenu.js',
|
||||
'js/app/bindings/copywidth.js',
|
||||
'js/app/bindings/invisible.js',
|
||||
'js/app/bindings/popover.js',
|
||||
'js/app/bindings/qrcode.js',
|
||||
|
|
|
|||
|
|
@ -94,6 +94,12 @@ default_settings = {
|
|||
"temperatureTargetSet": 2,
|
||||
"sdStatus": 1
|
||||
},
|
||||
"maxCommunicationTimeouts": {
|
||||
"idle": 2,
|
||||
"printing": 5,
|
||||
"long": 5
|
||||
},
|
||||
"maxWritePasses": 5,
|
||||
"additionalPorts": [],
|
||||
"additionalBaudrates": [],
|
||||
"longRunningCommands": ["G4", "G28", "G29", "G30", "G32", "M400", "M226"],
|
||||
|
|
@ -293,6 +299,15 @@ default_settings = {
|
|||
}
|
||||
}
|
||||
},
|
||||
"estimation": {
|
||||
"printTime": {
|
||||
"statsWeighingUntil": 0.5,
|
||||
"validityRange": 0.15,
|
||||
"forceDumbFromPercent": 0.3,
|
||||
"forceDumbAfterMin": 30,
|
||||
"stableThreshold": 60
|
||||
}
|
||||
},
|
||||
"devel": {
|
||||
"stylesheet": "css",
|
||||
"cache": {
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
38
src/octoprint/static/js/app/bindings/copywidth.js
Normal file
38
src/octoprint/static/js/app/bindings/copywidth.js
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
ko.bindingHandlers.copyWidth = {
|
||||
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||||
var node = ko.bindingHandlers.copyWidth._getReferenceNode(element, valueAccessor);
|
||||
ko.bindingHandlers.copyWidth._setWidth(node, element);
|
||||
},
|
||||
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||||
var node = ko.bindingHandlers.copyWidth._getReferenceNode(element, valueAccessor);
|
||||
ko.bindingHandlers.copyWidth._setWidth(node, element);
|
||||
},
|
||||
_setWidth: function(node, element) {
|
||||
var width = node.width();
|
||||
if (!width) return;
|
||||
if ($(element).width() == width) return;
|
||||
element.style.width = width + "px";
|
||||
},
|
||||
_getReferenceNode: function(element, valueAccessor) {
|
||||
var value = ko.utils.unwrapObservable(valueAccessor());
|
||||
if (!value) return;
|
||||
|
||||
var parts = value.split(" ");
|
||||
var node = $(element);
|
||||
while (parts.length > 0) {
|
||||
var part = parts.shift();
|
||||
if (part == ":parent") {
|
||||
node = node.parent();
|
||||
} else {
|
||||
var selector = part;
|
||||
if (parts.length > 0) {
|
||||
selector += " " + parts.join(" ");
|
||||
}
|
||||
node = $(selector, node);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return node;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -177,48 +177,7 @@ function DataUpdater(allViewModels) {
|
|||
|
||||
log.debug("Got event " + type + " with payload: " + JSON.stringify(payload));
|
||||
|
||||
if (type == "SettingsUpdated") {
|
||||
if (payload && payload.hasOwnProperty("config_hash")) {
|
||||
self._configHash = payload.config_hash;
|
||||
}
|
||||
} else if (type == "SlicingStarted") {
|
||||
gcodeUploadProgress.addClass("progress-striped").addClass("active");
|
||||
gcodeUploadProgressBar.css("width", "100%");
|
||||
if (payload.progressAvailable) {
|
||||
gcodeUploadProgressBar.text(_.sprintf(gettext("Slicing ... (%(percentage)d%%)"), {percentage: 0}));
|
||||
} else {
|
||||
gcodeUploadProgressBar.text(gettext("Slicing ..."));
|
||||
}
|
||||
} else if (type == "SlicingDone") {
|
||||
gcodeUploadProgress.removeClass("progress-striped").removeClass("active");
|
||||
gcodeUploadProgressBar.css("width", "0%");
|
||||
gcodeUploadProgressBar.text("");
|
||||
new PNotify({title: gettext("Slicing done"), text: _.sprintf(gettext("Sliced %(stl)s to %(gcode)s, took %(time).2f seconds"), payload), type: "success"});
|
||||
} else if (type == "SlicingCancelled") {
|
||||
gcodeUploadProgress.removeClass("progress-striped").removeClass("active");
|
||||
gcodeUploadProgressBar.css("width", "0%");
|
||||
gcodeUploadProgressBar.text("");
|
||||
} else if (type == "SlicingFailed") {
|
||||
gcodeUploadProgress.removeClass("progress-striped").removeClass("active");
|
||||
gcodeUploadProgressBar.css("width", "0%");
|
||||
gcodeUploadProgressBar.text("");
|
||||
|
||||
html = _.sprintf(gettext("Could not slice %(stl)s to %(gcode)s: %(reason)s"), payload);
|
||||
new PNotify({title: gettext("Slicing failed"), text: html, type: "error", hide: false});
|
||||
} else if (type == "TransferStarted") {
|
||||
gcodeUploadProgress.addClass("progress-striped").addClass("active");
|
||||
gcodeUploadProgressBar.css("width", "100%");
|
||||
gcodeUploadProgressBar.text(gettext("Streaming ..."));
|
||||
} else if (type == "TransferDone") {
|
||||
gcodeUploadProgress.removeClass("progress-striped").removeClass("active");
|
||||
gcodeUploadProgressBar.css("width", "0%");
|
||||
gcodeUploadProgressBar.text("");
|
||||
new PNotify({
|
||||
title: gettext("Streaming done"),
|
||||
text: _.sprintf(gettext("Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds"), payload),
|
||||
type: "success"
|
||||
});
|
||||
} else if (type == "PrintCancelled") {
|
||||
if (type == "PrintCancelled") {
|
||||
if (payload.firmwareError) {
|
||||
new PNotify({
|
||||
title: gettext("Unhandled communication error"),
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@ $(function() {
|
|||
self.allItems = ko.observable(undefined);
|
||||
self.listStyle = ko.observable("folders_files");
|
||||
self.currentPath = ko.observable("");
|
||||
self.uploadProgressText = ko.observable();
|
||||
|
||||
// initialize list helper
|
||||
self.listHelper = new ItemListHelper(
|
||||
|
|
@ -795,10 +796,60 @@ $(function() {
|
|||
self.requestData(undefined, undefined, self.currentPath());
|
||||
};
|
||||
|
||||
self.onEventSlicingStarted = function(payload) {
|
||||
self.uploadProgress
|
||||
.addClass("progress-striped")
|
||||
.addClass("active");
|
||||
self.uploadProgressBar.css("width", "100%");
|
||||
if (payload.progressAvailable) {
|
||||
self.uploadProgressText(_.sprintf(gettext("Slicing ... (%(percentage)d%%)"), {percentage: 0}));
|
||||
} else {
|
||||
self.uploadProgressText(gettext("Slicing ..."));
|
||||
}
|
||||
};
|
||||
|
||||
self.onSlicingProgress = function(slicer, modelPath, machinecodePath, progress) {
|
||||
self.uploadProgressText(_.sprintf(gettext("Slicing ... (%(percentage)d%%)"), {percentage: Math.round(progress)}));
|
||||
};
|
||||
|
||||
self.onEventSlicingCancelled = function(payload) {
|
||||
self.uploadProgress
|
||||
.removeClass("progress-striped")
|
||||
.removeClass("active");
|
||||
self.uploadProgressBar
|
||||
.css("width", "0%");
|
||||
self.uploadProgressText("");
|
||||
};
|
||||
|
||||
self.onEventSlicingDone = function(payload) {
|
||||
self.uploadProgress
|
||||
.removeClass("progress-striped")
|
||||
.removeClass("active");
|
||||
self.uploadProgressBar
|
||||
.css("width", "0%");
|
||||
self.uploadProgressText("");
|
||||
|
||||
new PNotify({
|
||||
title: gettext("Slicing done"),
|
||||
text: _.sprintf(gettext("Sliced %(stl)s to %(gcode)s, took %(time).2f seconds"), payload),
|
||||
type: "success"
|
||||
});
|
||||
|
||||
self.requestData(undefined, undefined, self.currentPath());
|
||||
};
|
||||
|
||||
self.onEventSlicingFailed = function(payload) {
|
||||
self.uploadProgress
|
||||
.removeClass("progress-striped")
|
||||
.removeClass("active");
|
||||
self.uploadProgressBar
|
||||
.css("width", "0%");
|
||||
self.uploadProgressText("");
|
||||
|
||||
var html = _.sprintf(gettext("Could not slice %(stl)s to %(gcode)s: %(reason)s"), payload);
|
||||
new PNotify({title: gettext("Slicing failed"), text: html, type: "error", hide: false});
|
||||
};
|
||||
|
||||
self.onEventMetadataAnalysisFinished = function(payload) {
|
||||
self.requestData(undefined, undefined, self.currentPath());
|
||||
};
|
||||
|
|
@ -807,7 +858,29 @@ $(function() {
|
|||
self.requestData(undefined, undefined, self.currentPath());
|
||||
};
|
||||
|
||||
self.onEventTransferStarted = function(payload) {
|
||||
self.uploadProgress
|
||||
.addClass("progress-striped")
|
||||
.addClass("active");
|
||||
self.uploadProgressBar
|
||||
.css("width", "100%");
|
||||
self.uploadProgressText(gettext("Streaming ..."));
|
||||
};
|
||||
|
||||
self.onEventTransferDone = function(payload) {
|
||||
self.uploadProgress
|
||||
.removeClass("progress-striped")
|
||||
.removeClass("active");
|
||||
self.uploadProgressBar
|
||||
.css("width", "0");
|
||||
self.uploadProgressText("");
|
||||
|
||||
new PNotify({
|
||||
title: gettext("Streaming done"),
|
||||
text: _.sprintf(gettext("Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds"), payload),
|
||||
type: "success"
|
||||
});
|
||||
|
||||
self.requestData(undefined, payload.remote, "sdcard");
|
||||
};
|
||||
|
||||
|
|
@ -858,8 +931,8 @@ $(function() {
|
|||
|
||||
self._setProgressBar = function(percentage, text, active) {
|
||||
self.uploadProgressBar
|
||||
.css("width", percentage + "%")
|
||||
.text(text);
|
||||
.css("width", percentage + "%");
|
||||
self.uploadProgressText(text);
|
||||
|
||||
if (active) {
|
||||
self.uploadProgress
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ $(function() {
|
|||
self.filepos = ko.observable(undefined);
|
||||
self.printTime = ko.observable(undefined);
|
||||
self.printTimeLeft = ko.observable(undefined);
|
||||
self.printTimeLeftOrigin = ko.observable(undefined);
|
||||
self.sd = ko.observable(undefined);
|
||||
self.timelapse = ko.observable(undefined);
|
||||
|
||||
|
|
@ -84,11 +85,61 @@ $(function() {
|
|||
return formatFuzzyEstimation(self.printTimeLeft());
|
||||
}
|
||||
});
|
||||
self.printTimeLeftOriginString = ko.pureComputed(function() {
|
||||
var value = self.printTimeLeftOrigin();
|
||||
switch (value) {
|
||||
case "linear": {
|
||||
return gettext("Based on a linear approximation (accuracy highly dependent on the model)");
|
||||
}
|
||||
case "analysis": {
|
||||
return gettext("Based on the estimate from analysis of file (medium accuracy)");
|
||||
}
|
||||
case "mixed-analysis": {
|
||||
return gettext("Based on a mix of estimate from analysis and calculation (medium accuracy)");
|
||||
}
|
||||
case "average": {
|
||||
return gettext("Based on the average total of past prints of this model with the same printer profile (usually good accuracy)");
|
||||
}
|
||||
case "mixed-average": {
|
||||
return gettext("Based on a mix of average total from past prints and calculation (usually good accuracy)");
|
||||
}
|
||||
case "estimate": {
|
||||
return gettext("Based on the calculated estimate (best accuracy)");
|
||||
}
|
||||
default: {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
});
|
||||
self.printTimeLeftOriginClass = ko.pureComputed(function() {
|
||||
var value = self.printTimeLeftOrigin();
|
||||
switch (value) {
|
||||
default:
|
||||
case "linear": {
|
||||
return "text-error";
|
||||
}
|
||||
case "analysis":
|
||||
case "mixed-analysis": {
|
||||
return "text-warning";
|
||||
}
|
||||
case "average":
|
||||
case "mixed-average":
|
||||
case "estimate": {
|
||||
return "text-success";
|
||||
}
|
||||
}
|
||||
});
|
||||
self.progressString = ko.pureComputed(function() {
|
||||
if (!self.progress())
|
||||
return 0;
|
||||
return self.progress();
|
||||
});
|
||||
self.progressBarString = ko.pureComputed(function() {
|
||||
if (!self.progress()) {
|
||||
return "";
|
||||
}
|
||||
return _.sprintf("%d%%", self.progress());
|
||||
});
|
||||
self.pauseString = ko.pureComputed(function() {
|
||||
if (self.isPaused())
|
||||
return gettext("Continue");
|
||||
|
|
@ -194,6 +245,7 @@ $(function() {
|
|||
self.filepos(data.filepos);
|
||||
self.printTime(data.printTime);
|
||||
self.printTimeLeft(data.printTimeLeft);
|
||||
self.printTimeLeftOrigin(data.printTimeLeftOrigin);
|
||||
};
|
||||
|
||||
self._processZData = function(data) {
|
||||
|
|
|
|||
|
|
@ -155,6 +155,9 @@ $(function() {
|
|||
self.serial_disconnectOnErrors = ko.observable(undefined);
|
||||
self.serial_triggerOkForM29 = ko.observable(undefined);
|
||||
self.serial_supportResendsWithoutOk = ko.observable(undefined);
|
||||
self.serial_maxTimeoutsIdle = ko.observable(undefined);
|
||||
self.serial_maxTimeoutsPrinting = ko.observable(undefined);
|
||||
self.serial_maxTimeoutsLong = ko.observable(undefined);
|
||||
|
||||
self.folder_uploads = ko.observable(undefined);
|
||||
self.folder_timelapse = ko.observable(undefined);
|
||||
|
|
|
|||
|
|
@ -491,6 +491,14 @@ ul.dropdown-menu li a {
|
|||
}
|
||||
}
|
||||
|
||||
/** State sidebar panel */
|
||||
|
||||
#state_wrapper {
|
||||
hr {
|
||||
margin: 5px 0;
|
||||
}
|
||||
}
|
||||
|
||||
/** GCODE file manager */
|
||||
|
||||
#files {
|
||||
|
|
@ -1071,3 +1079,55 @@ _::-webkit-full-page-media, _:future, :root .full-sized-box {
|
|||
input[type=number] {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
// Progress bars with text
|
||||
//
|
||||
// .progress-text-front will also need to have the full width of the enclosing
|
||||
// progress wrapper applied (e.g. via copyWidth knockout binding)
|
||||
|
||||
.progress-text,
|
||||
.progress-text-centered {
|
||||
position: relative;
|
||||
|
||||
.progress-text-front,
|
||||
.progress-text-back {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.progress-text-front {
|
||||
box-sizing: border-box;
|
||||
padding: 0 10px;
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.progress-text-back {
|
||||
position: absolute;
|
||||
font-size: 12px;
|
||||
line-height: 20px;
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
text-align: center;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.bar {
|
||||
position: absolute;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
.progress-text-centered {
|
||||
.progress-text-front {
|
||||
position: absolute;
|
||||
font-size: 12px;
|
||||
line-height: 20px;
|
||||
display: block;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.progress-text-back {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -141,6 +141,24 @@
|
|||
<input type="checkbox" data-bind="checked: serial_supportResendsWithoutOk" id="settings-supportResendsWithoutOk"> {{ _('Simulate an additional `ok` for resend requests') }}
|
||||
</label>
|
||||
</div>
|
||||
<div class="control-group" title="{{ _('Maximum consecutive communication timeouts while idle. More than this and the printer will be considered to be gone. Set to 0 to disable.') }}">
|
||||
<label class="control-label" for="settings-serialMaxTimeoutsIdle">{{ _('Max. consecutive timeouts while idle') }}</label>
|
||||
<div class="controls">
|
||||
<input type="number" min="0" class="input-mini text-right" id="settings-serialMaxTimeoutsIdle" data-bind="value: serial_maxTimeoutsIdle">
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" title="{{ _('Maximum consecutive communication timeouts while printing. More than this and the printer will be considered to be gone. Set to 0 to disable.') }}">
|
||||
<label class="control-label" for="settings-serialMaxTimeoutsPrinting">{{ _('Max. consecutive timeouts while printing') }}</label>
|
||||
<div class="controls">
|
||||
<input type="number" min="0" class="input-mini text-right" id="settings-serialMaxTimeoutsPrinting" data-bind="value: serial_maxTimeoutsPrinting">
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group" title="{{ _('Maximum consecutive communication timeouts while a long running command is active. More than this and the printer will be considered to be gone. Set to 0 to disable.') }}">
|
||||
<label class="control-label" for="settings-serialMaxTimeoutsLong">{{ _('Max. consecutive timeouts during long running commands') }}</label>
|
||||
<div class="controls">
|
||||
<input type="number" min="0" class="input-mini text-right" id="settings-serialMaxTimeoutsLong" data-bind="value: serial_maxTimeoutsLong">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -70,8 +70,11 @@
|
|||
</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div id="gcode_upload_progress" class="progress" style="width: 100%;">
|
||||
<div class="bar" style="width: 0%"></div>
|
||||
<div id="gcode_upload_progress" class="progress progress-text-centered">
|
||||
<span class="progress-text-back" data-bind="text: uploadProgressText"></span>
|
||||
<div class="bar">
|
||||
<span class="progress-text-front" data-bind="copyWidth: ':parent :parent :parent :parent form', text: uploadProgressText"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<small class="muted">{{ _('Hint: You can also drag and drop files on this page to upload them.') }}</small>
|
||||
|
|
|
|||
|
|
@ -1,16 +1,21 @@
|
|||
{{ _('Machine State') }}: <strong data-bind="text: stateString"></strong><br>
|
||||
<hr>
|
||||
{{ _('File') }}: <strong data-bind="text: filename, attr: {title: filepath}"></strong> <strong data-bind="visible: sd">(SD)</strong><br>
|
||||
{{ _('Timelapse') }}: <strong data-bind="text: timelapseString"></strong><br>
|
||||
<!-- ko foreach: filament -->
|
||||
<span data-bind="text: 'Filament (' + name() + '): '"></span><strong data-bind="text: formatFilament(data())"></strong><br>
|
||||
<!-- /ko -->
|
||||
{{ _('Approx. Total Print Time') }}: <strong data-bind="text: estimatedPrintTimeString"></strong><br>
|
||||
<hr>
|
||||
{{ _('Print Time') }}: <strong data-bind="text: printTimeString"></strong><br>
|
||||
{{ _('Print Time Left') }}: <strong data-bind="text: printTimeLeftString"></strong><br>
|
||||
{{ _('Print Time Left') }}: <strong data-bind="text: printTimeLeftString"></strong> <span id="state_printtimeleft_popover" style="display: none" data-bind="visible: printTimeLeftOrigin, attr: {title: printTimeLeftOriginString}, css: printTimeLeftOriginClass">●</span><br>
|
||||
{{ _('Printed') }}: <strong data-bind="text: byteString"></strong><br>
|
||||
|
||||
<div class="progress">
|
||||
<div class="bar" id="job_progressBar" data-bind="style: { width: progressString() + '%' }"></div>
|
||||
<div class="progress progress-text-centered">
|
||||
<span class="progress-text-back" data-bind="text: progressBarString()"></span>
|
||||
<div class="bar" id="job_progressBar" data-bind="style: {width: progressString() + '%'}">
|
||||
<span class="progress-text-front" data-bind="copyWidth: ':parent :parent', text: progressBarString()"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row-fluid print-control" style="display: none;" data-bind="visible: loginState.isUser">
|
||||
|
|
|
|||
|
|
@ -15,8 +15,11 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="progress" >
|
||||
<div class="bar" style="width: 0%;" data-bind="text: ui_progress_text, style: { width: ui_progress_percentage() + '%' }"></div>
|
||||
<div class="progress progress-text-centered">
|
||||
<span class="progress-text-back" data-bind="text: ui_progress_text"></span>
|
||||
<div class="bar" style="width: 0;" data-bind="style: { width: ui_progress_percentage() + '%' }">
|
||||
<span class="progress-text-front" data-bind="copyWidth: ':parent :parent', text: ui_progress_text"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row-fluid">
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -7,8 +7,8 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: OctoPrint\n"
|
||||
"Report-Msgid-Bugs-To: i18n@octoprint.org\n"
|
||||
"POT-Creation-Date: 2016-06-08 11:03+0200\n"
|
||||
"PO-Revision-Date: 2016-06-08 11:04+0100\n"
|
||||
"POT-Creation-Date: 2016-07-28 11:50+0200\n"
|
||||
"PO-Revision-Date: 2016-07-28 12:03+0100\n"
|
||||
"Last-Translator: Gina Häußge <osd@foosel.net>\n"
|
||||
"Language: de\n"
|
||||
"Language-Team: German (http://www.transifex.com/projects/p/octoprint/language/de/)\n"
|
||||
|
|
@ -19,7 +19,7 @@ msgstr ""
|
|||
"Generated-By: Babel 2.2.0\n"
|
||||
"X-Generator: Poedit 1.6.8\n"
|
||||
|
||||
#: src/octoprint/plugins/announcements/__init__.py:85
|
||||
#: src/octoprint/plugins/announcements/__init__.py:89
|
||||
#: src/octoprint/plugins/announcements/templates/announcements.jinja2:4
|
||||
#: src/octoprint/plugins/announcements/templates/announcements_navbar.jinja2:1
|
||||
msgid "Announcements"
|
||||
|
|
@ -56,7 +56,6 @@ msgstr "Zuletzt gelesen"
|
|||
#: src/octoprint/plugins/announcements/templates/announcements.jinja2:43
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:87
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:197
|
||||
#: src/octoprint/templates/dialogs/about.jinja2:51
|
||||
#: src/octoprint/templates/dialogs/settings/appearance.jinja2:96
|
||||
msgid "Close"
|
||||
msgstr "Schließen"
|
||||
|
|
@ -200,7 +199,6 @@ msgstr ""
|
|||
" Tools wie z.B. Repetier Host.\n"
|
||||
|
||||
#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:121
|
||||
#: src/octoprint/templates/dialogs/usersettings.jinja2:46
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:80
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:109
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:151
|
||||
|
|
@ -209,7 +207,6 @@ msgid "Abort"
|
|||
msgstr "Abbrechen"
|
||||
|
||||
#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:122
|
||||
#: src/octoprint/templates/dialogs/usersettings.jinja2:47
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:81
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:110
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:152
|
||||
|
|
@ -479,7 +476,6 @@ msgstr "Gebundled"
|
|||
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:48
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:129
|
||||
#: src/octoprint/templates/index.jinja2:118
|
||||
msgid "Homepage"
|
||||
msgstr "Homepage"
|
||||
|
||||
|
|
@ -620,15 +616,13 @@ msgstr "Repository-Cache TTL"
|
|||
#: src/octoprint/plugins/softwareupdate/templates/softwareupdate.jinja2:26
|
||||
#: src/octoprint/plugins/softwareupdate/templates/softwareupdate_settings.jinja2:101
|
||||
#: src/octoprint/templates/dialogs/confirmation.jinja2:11
|
||||
#: src/octoprint/templates/dialogs/settings.jinja2:52
|
||||
#: src/octoprint/templates/dialogs/slicing.jinja2:50
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:19
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:24
|
||||
msgid "Cancel"
|
||||
msgstr "Abbruch"
|
||||
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:240
|
||||
#: src/octoprint/plugins/softwareupdate/templates/softwareupdate_settings.jinja2:102
|
||||
#: src/octoprint/templates/dialogs/settings.jinja2:53
|
||||
msgid "Save"
|
||||
msgstr "Speichern"
|
||||
|
||||
|
|
@ -905,7 +899,7 @@ msgid "GCode Viewer"
|
|||
msgstr "GCode Viewer"
|
||||
|
||||
#: src/octoprint/server/views.py:146
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:3
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:4
|
||||
msgid "Timelapse"
|
||||
msgstr "Zeitraffer"
|
||||
|
||||
|
|
@ -976,75 +970,34 @@ msgstr "Zugriff"
|
|||
msgid "Interface"
|
||||
msgstr "Interface"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:92
|
||||
#: src/octoprint/static/js/app/dataupdater.js:127
|
||||
#: src/octoprint/static/js/app/dataupdater.js:96
|
||||
#: src/octoprint/static/js/app/dataupdater.js:131
|
||||
#: src/octoprint/static/js/app/helpers.js:451
|
||||
#: src/octoprint/templates/overlays/offline.jinja2:6
|
||||
msgid "Server is offline"
|
||||
msgstr "Der Server ist offline"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:93
|
||||
#: src/octoprint/static/js/app/dataupdater.js:97
|
||||
msgid "The server appears to be offline, at least I'm not getting any response from it. I'll try to reconnect automatically <strong>over the next couple of minutes</strong>, however you are welcome to try a manual reconnect anytime using the button below."
|
||||
msgstr "Der Server scheint offline zu sein, zumindest kann ich mich nicht mit ihm verbinden. Ich werde <strong>in den nächsten Minuten</strong> versuchen mich erneut zu verbinden, aber Du kannst mittels des folgenden Buttons auch jederzeit einen manuellen Verbindungsversuch anstoßen."
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:128
|
||||
#: src/octoprint/static/js/app/dataupdater.js:132
|
||||
msgid "The server appears to be offline, at least I'm not getting any response from it. I <strong>could not reconnect automatically</strong>, but you may try a manual reconnect using the button below."
|
||||
msgstr "Der Server scheint offline zu sein, zumindest kann ich mich nicht mit ihm verbinden. Ich <strong>konnte mich nicht automatisch neu verbinden</strong>, aber Du kannst mittels des folgenden Buttons einen manuellen Verbindungsversuch anstoßen."
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:206
|
||||
#: src/octoprint/static/js/app/dataupdater.js:226
|
||||
#, python-format
|
||||
msgid "Slicing ... (%(percentage)d%%)"
|
||||
msgstr "Slice ... (%(percentage)d%%)"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:228
|
||||
msgid "Slicing ..."
|
||||
msgstr "Slice ..."
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:234
|
||||
msgid "Slicing done"
|
||||
msgstr "Slicing abgeschlossen"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:234
|
||||
#, python-format
|
||||
msgid "Sliced %(stl)s to %(gcode)s, took %(time).2f seconds"
|
||||
msgstr "%(stl)s nach %(gcode)s geslicet, dauerte %(time).2f Sekunden"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:244
|
||||
#, python-format
|
||||
msgid "Could not slice %(stl)s to %(gcode)s: %(reason)s"
|
||||
msgstr "Konnte %(stl)s nicht nach %(gcode)s slicen: %(reason)s"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:245
|
||||
msgid "Slicing failed"
|
||||
msgstr "Slicing fehlgeschlagen"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:249
|
||||
msgid "Streaming ..."
|
||||
msgstr "Streaming ..."
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:255
|
||||
msgid "Streaming done"
|
||||
msgstr "Streaming abgeschlossen"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:256
|
||||
#, python-format
|
||||
msgid "Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds"
|
||||
msgstr "%(local)s nach %(remote)s gestreamt, dauerte %(time).2f Sekunden"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:262
|
||||
#: src/octoprint/static/js/app/dataupdater.js:270
|
||||
#: src/octoprint/static/js/app/dataupdater.js:230
|
||||
#: src/octoprint/static/js/app/dataupdater.js:238
|
||||
msgid "Unhandled communication error"
|
||||
msgstr "Unbehandelter Kommunikationsfehler"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:263
|
||||
#: src/octoprint/static/js/app/dataupdater.js:231
|
||||
#, python-format
|
||||
msgid "There was an unhandled error while talking to the printer. Due to that the ongoing print job was cancelled. Error: %(firmwareError)s"
|
||||
msgstr "Es gab einen unbehandelten Fehler bei der Kommunikation mit dem Drucker. Daher wurder der laufende Druckauftrag abgebrochen. Fehler: %(firmwareError)s"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:271
|
||||
#, python-format
|
||||
msgid "The was an unhandled error while talking to the printer. Due to that OctoPrint disconnected. Error: %(error)s"
|
||||
#: src/octoprint/static/js/app/dataupdater.js:239
|
||||
#, fuzzy, python-format
|
||||
msgid "There was an unhandled error while talking to the printer. Due to that OctoPrint disconnected. Error: %(error)s"
|
||||
msgstr "Es gab einen unbehandelten Fehler bei der Kommunikation mit dem Drucker. Daher hat OctoPrint die Verbindung getrennt. Fehler: %(error)s"
|
||||
|
||||
#: src/octoprint/static/js/app/helpers.js:372
|
||||
|
|
@ -1119,15 +1072,15 @@ msgid "Disconnect"
|
|||
msgstr "Trennen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/control.js:65
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:329
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:465
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:177
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:56
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:348
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:471
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:228
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:58
|
||||
msgid "Tool"
|
||||
msgstr "Werkzeug"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/control.js:71
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:67
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:69
|
||||
msgid "Hotend"
|
||||
msgstr "Hotend"
|
||||
|
||||
|
|
@ -1143,32 +1096,74 @@ msgstr "Dein verfügbarer freier Plattenplatz wird langsam knapp."
|
|||
msgid "Your current disk usage."
|
||||
msgstr "Dein aktuell verfügbarer freier Plattenplatz."
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:324
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:329
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:343
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:348
|
||||
msgid "Filament"
|
||||
msgstr "Filament"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:333
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:352
|
||||
msgid "Estimated Print Time"
|
||||
msgstr "Geschätzte Druckdauer"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:336
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:355
|
||||
msgid "Last Printed"
|
||||
msgstr "Zuletzt gedruckt"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:338
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:357
|
||||
msgid "Last Print Time"
|
||||
msgstr "Letzte Druckdauer"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:520
|
||||
msgid "Could not upload the file. Make sure that it is a GCODE file and has the extension \".gcode\" or \".gco\" or that it is an STL file with the extension \".stl\"."
|
||||
msgstr "Konnte die Datei nicht hochladen. Bitte stelle sicher, dass es sich um eine GCODE-Datei mit der Extension \".gcode\" oder \".gco\" oder um eine STL-Datei mit der Extension \".stl\" handelt."
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:460
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:467
|
||||
#, python-format
|
||||
msgid "Slicing ... (%(percentage)d%%)"
|
||||
msgstr "Slice ... (%(percentage)d%%)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:541
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:462
|
||||
msgid "Slicing ..."
|
||||
msgstr "Slice ..."
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:488
|
||||
msgid "Slicing done"
|
||||
msgstr "Slicing abgeschlossen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:489
|
||||
#, python-format
|
||||
msgid "Sliced %(stl)s to %(gcode)s, took %(time).2f seconds"
|
||||
msgstr "%(stl)s nach %(gcode)s geslicet, dauerte %(time).2f Sekunden"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:504
|
||||
#, python-format
|
||||
msgid "Could not slice %(stl)s to %(gcode)s: %(reason)s"
|
||||
msgstr "Konnte %(stl)s nicht nach %(gcode)s slicen: %(reason)s"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:505
|
||||
msgid "Slicing failed"
|
||||
msgstr "Slicing fehlgeschlagen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:522
|
||||
msgid "Streaming ..."
|
||||
msgstr "Streaming ..."
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:534
|
||||
msgid "Streaming done"
|
||||
msgstr "Streaming abgeschlossen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:535
|
||||
#, python-format
|
||||
msgid "Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds"
|
||||
msgstr "%(local)s nach %(remote)s gestreamt, dauerte %(time).2f Sekunden"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:627
|
||||
#, python-format
|
||||
msgid "Could not upload the file. Make sure that it is a valid file with one of these extensions: %(extensions)s"
|
||||
msgstr "Konnte die Datei nicht hochladen. Bitte stelle sicher, dass es sich um eine valide Datei mit einer dieser Erweiterungen ist: %(extensions)s"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:654
|
||||
msgid "Uploading ..."
|
||||
msgstr "Uploade ..."
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:548
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:660
|
||||
msgid "Saving ..."
|
||||
msgstr "Speichere ..."
|
||||
|
||||
|
|
@ -1188,52 +1183,52 @@ msgstr "Analysiere..."
|
|||
msgid "Analyzed"
|
||||
msgstr "Analysiert"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:431
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:437
|
||||
msgid "Model size"
|
||||
msgstr "Modelgröße"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:432
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:438
|
||||
msgid "Estimated total print time"
|
||||
msgstr "Geschätzte Gesamtdruckdauer"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:433
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:439
|
||||
msgid "Estimated layer height"
|
||||
msgstr "Geschätzte Schichthöhe"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:433
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:439
|
||||
msgid "mm"
|
||||
msgstr "mm"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:434
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:440
|
||||
msgid "Layer count"
|
||||
msgstr "Schichtanzahl"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:434
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:440
|
||||
msgid "printed"
|
||||
msgstr "gedruckt"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:434
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:440
|
||||
msgid "visited"
|
||||
msgstr "besucht"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:457
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:463
|
||||
msgid "Layer number"
|
||||
msgstr "Schichtnummer"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:458
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:464
|
||||
msgid "Layer height"
|
||||
msgstr "Schichthöhe"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:459
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:465
|
||||
msgid "GCODE commands in layer"
|
||||
msgstr "GCODE Befehle in Schicht"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:462
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:465
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:468
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:471
|
||||
msgid "Filament used by layer"
|
||||
msgstr "Genutztes Filament in Schicht"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:469
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:475
|
||||
msgid "Print time for layer"
|
||||
msgstr "Druckdauer für Schicht"
|
||||
|
||||
|
|
@ -1371,52 +1366,76 @@ msgstr "Druckerprofil hinzufügen"
|
|||
msgid "Edit Printer Profile \"%(name)s\""
|
||||
msgstr "Druckerprofile \"%(name)s\" bearbeiten"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:44
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:45
|
||||
msgid "Restarts the print job from the beginning"
|
||||
msgstr "Started den Druckjob von vorne"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:45
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:46
|
||||
msgid "Starts the print job"
|
||||
msgstr "Startet den Druckjob"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:46
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:47
|
||||
msgid "Resumes the print job"
|
||||
msgstr "Setzt den Druckjob fort"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:47
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:48
|
||||
msgid "Pauses the print job"
|
||||
msgstr "Pausiert den Druckjob"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:80
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:81
|
||||
msgid "Calculating..."
|
||||
msgstr "Wird ermittelt..."
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:93
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:91
|
||||
msgid "Based on a linear approximation (accuracy highly dependent on the model)"
|
||||
msgstr "Basiert auf einer linearen Approximation (Genauigkeit hängt stark vom Modell ab)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:94
|
||||
msgid "Based on the estimate from analysis of file (medium accuracy)"
|
||||
msgstr "Basiert auf der Schätzung der Analyse der Datei (mittlere Genauigkeit)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:97
|
||||
msgid "Based on a mix of estimate from analysis and calculation (medium accuracy)"
|
||||
msgstr "Basiert auf einem Mix der Schätzung aus der Analyse und der Berechnung (mittlere Genauigkeit)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:100
|
||||
msgid "Based on the average total of past prints of this model with the same printer profile (usually good accuracy)"
|
||||
msgstr "Basiert auf der durchschnittlichen Dauer vergangener Druckjobs dieses Modells mit dem selben Druckerprofil (normalerweise gute Genauigkeit)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:103
|
||||
msgid "Based on a mix of average total from past prints and calculation (usually good accuracy)"
|
||||
msgstr "Basiert auf einem Mix der durschnittlichen Dauer vergangener Druckjobs und der Berechnung (normalerweise gute Genauigkeit)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:106
|
||||
msgid "Based on the calculated estimate (best accuracy)"
|
||||
msgstr "Basiert auf der berechneten Schätzung (beste Genauigkeit)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:144
|
||||
msgid "Continue"
|
||||
msgstr "Fortsetzen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:95
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:18
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:146
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:23
|
||||
msgid "Pause"
|
||||
msgstr "Pause"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:106
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:157
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:11
|
||||
msgid "On Z Change"
|
||||
msgstr "Bei Ebenenwechsel"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:108
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:159
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:10
|
||||
msgid "Timed"
|
||||
msgstr "Nach Zeit"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:108
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:159
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:25
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:32
|
||||
msgid "sec"
|
||||
msgstr "Sek"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:216
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:268
|
||||
msgid "This will restart the print job from the beginning."
|
||||
msgstr "Der Druckjob wird zurückgesetzt und von vorne begonnen."
|
||||
|
||||
|
|
@ -1434,43 +1453,43 @@ msgstr "weiß"
|
|||
msgid "Autodetect from browser"
|
||||
msgstr "Automatisch vom Browser erkennen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:31
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:104
|
||||
msgid "Do nothing"
|
||||
msgstr "Nichts machen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:32
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:105
|
||||
msgid "Select for printing"
|
||||
msgstr "Zum Drucken auswählen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:33
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:106
|
||||
msgid "Start printing"
|
||||
msgstr "Drucken"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:45
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:118
|
||||
#, python-format
|
||||
msgid "Slicing %(filename)s"
|
||||
msgstr "Slice %(filename)s"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:23
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:74
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:76
|
||||
#: src/octoprint/templates/dialogs/settings/temperatures.jinja2:16
|
||||
msgid "Bed"
|
||||
msgstr "Bett"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:112
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:115
|
||||
msgid "just now"
|
||||
msgstr "gerade eben"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:114
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:117
|
||||
msgid "min"
|
||||
msgstr "Min"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:253
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:256
|
||||
#: src/octoprint/templates/tabs/temperature.jinja2:11
|
||||
msgid "Actual"
|
||||
msgstr "Ist"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:258
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:261
|
||||
#: src/octoprint/templates/tabs/temperature.jinja2:12
|
||||
msgid "Target"
|
||||
msgstr "Soll"
|
||||
|
|
@ -1554,31 +1573,6 @@ msgstr "Neue Zeitrafferaufnahme %(movie_prefix)s wurde fertig gerendert"
|
|||
msgid "Site default"
|
||||
msgstr "Seitenvoreinstellung"
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:115
|
||||
msgid "Version"
|
||||
msgstr "Version"
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:119
|
||||
msgid "Sourcecode"
|
||||
msgstr "Quellcode"
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:120
|
||||
msgid "Documentation"
|
||||
msgstr "Dokumentation"
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:121
|
||||
msgid "Bugs and Requests"
|
||||
msgstr "Bugs und Requests"
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:122
|
||||
msgid "About"
|
||||
msgstr "Über"
|
||||
|
||||
#: src/octoprint/templates/dialogs/about.jinja2:4
|
||||
#: src/octoprint/templates/dialogs/settings.jinja2:51
|
||||
msgid "About OctoPrint"
|
||||
msgstr "Über OctoPrint"
|
||||
|
||||
#: src/octoprint/templates/dialogs/confirmation.jinja2:4
|
||||
msgid "Are you sure?"
|
||||
msgstr "Bist Du sicher?"
|
||||
|
|
@ -1674,10 +1668,6 @@ msgstr "Zugangsbeschränkung deaktivieren"
|
|||
msgid "Keep Access Control Enabled"
|
||||
msgstr "Zugangsbeschränkung aktiviert lassen"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings.jinja2:4
|
||||
msgid "OctoPrint Settings"
|
||||
msgstr "OctoPrint Einstellungen"
|
||||
|
||||
#: src/octoprint/templates/dialogs/slicing.jinja2:8
|
||||
msgid "Slicing is currently disabled since no slicer has been configured yet. Please configure a slicer under \"Settings\"."
|
||||
msgstr "Slicing ist aktuell deaktiviert da noch kein Slicer konfiguriert wurde. Bitte konfiguriere einen Slicer unter \"Settings\"."
|
||||
|
|
@ -1712,8 +1702,8 @@ msgid "Select a printer profile..."
|
|||
msgstr "Wähle ein Druckerprofil..."
|
||||
|
||||
#: src/octoprint/templates/dialogs/slicing.jinja2:32
|
||||
msgid "GCode Filename"
|
||||
msgstr "GCode Dateiname"
|
||||
msgid "Output Filename"
|
||||
msgstr "Ausgabedateiname"
|
||||
|
||||
#: src/octoprint/templates/dialogs/slicing.jinja2:41
|
||||
msgid "After slicing..."
|
||||
|
|
@ -1724,11 +1714,6 @@ msgstr "Nach dem Slicing..."
|
|||
msgid "Slice"
|
||||
msgstr "Slicen"
|
||||
|
||||
#: src/octoprint/templates/dialogs/usersettings.jinja2:4
|
||||
#: src/octoprint/templates/navbar/login.jinja2:16
|
||||
msgid "User Settings"
|
||||
msgstr "Nutzereinstellungen"
|
||||
|
||||
#: src/octoprint/templates/dialogs/about/about.jinja2:3
|
||||
msgid "The snappy web interface for your 3D printer"
|
||||
msgstr "The snappy web interface for your 3D printer"
|
||||
|
|
@ -1922,31 +1907,39 @@ msgid "Wait for <code>start</code> on connect"
|
|||
msgstr "Bei der Verbindung auf <code>start</code> warten"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:40
|
||||
msgid "Select SD files by relative path"
|
||||
msgstr "SD Dateien per relativem Pfad addressieren"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:40
|
||||
msgid "RepRap Firmware"
|
||||
msgstr "RepRap Firmware"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:47
|
||||
msgid "Always assume SD card is present"
|
||||
msgstr "Immer davon ausgehen, dass eine SD-Karte vorhanden ist"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:40
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:47
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:54
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:61
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:68
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:75
|
||||
msgid "Repetier"
|
||||
msgstr "Repetier"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:47
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:54
|
||||
msgid "Send a checksum with <strong>every</strong> command"
|
||||
msgstr "Eine Prüfsumme mit <strong>jedem</strong> Befehl senden"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:54
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:61
|
||||
msgid "Ignore consecutive resend requests for the same line"
|
||||
msgstr "Aufeinanderfolgende Resend Requests für die selbe Zeilennummer ignorieren"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:61
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:68
|
||||
#, python-format
|
||||
msgid "Support <code>TargetExtr%%n</code>/<code>TargetBed</code> target temperature format"
|
||||
msgstr "<code>TargetExtr%%n</code>/<code>TargetBed</code> Zieltemperaturformat unterstützen"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:68
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:75
|
||||
msgid "Disable detection of external heatups"
|
||||
msgstr "Detektierung externer Aufheizvorgänge deaktivieren"
|
||||
|
||||
|
|
@ -1985,7 +1978,7 @@ msgstr "Falls der freie Plattenplatz unter diese Schwellwerte fallen sollte wird
|
|||
#: src/octoprint/templates/dialogs/settings/folders.jinja2:47
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:69
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:90
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:66
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:69
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:13
|
||||
msgid "Warning"
|
||||
msgstr "Warnung"
|
||||
|
|
@ -2261,6 +2254,30 @@ msgstr "Viele Marlin < v1.1.0"
|
|||
msgid "Simulate an additional `ok` for resend requests"
|
||||
msgstr "Zusätzliches `ok` für Resendrequests simulieren"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:129
|
||||
msgid "Maximum consecutive communication timeouts while idle. More than this and the printer will be considered to be gone. Set to 0 to disable."
|
||||
msgstr "Maximale Anzahl aufeinanderfolgender Communication Timeouts im Idlezustand. Mehr als das und es wird angenommen, dass der Drucker offline ist. Auf 0 setzen um das zu verhindern."
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:130
|
||||
msgid "Max. consecutive timeouts while idle"
|
||||
msgstr "Max. aufeinanderfolgende Timeouts wenn idle"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:135
|
||||
msgid "Maximum consecutive communication timeouts while printing. More than this and the printer will be considered to be gone. Set to 0 to disable."
|
||||
msgstr "Maximale Anzahl aufeinanderfolgender Communication Timeouts beim Drucken. Mehr als das und es wird angenommen, dass der Drucker offline ist. Auf 0 setzen um das zu verhindern."
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:136
|
||||
msgid "Max. consecutive timeouts while printing"
|
||||
msgstr "Max. aufeinanderfolgende Timeouts beim Drucken"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:141
|
||||
msgid "Maximum consecutive communication timeouts while a long running command is active. More than this and the printer will be considered to be gone. Set to 0 to disable."
|
||||
msgstr "Maximale Anzahl aufeinanderfolgender Communication Timeouts wenn ein lang laufender Befehl aktiv ist. Mehr als das und es wird angenommen, dass der Drucker offline ist. Auf 0 setzen um das zu verhindern."
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:142
|
||||
msgid "Max. consecutive timeouts during long running commands"
|
||||
msgstr "Max. aufeinanderfolgende Timeouts während lang laufender Befehle"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/server.jinja2:2
|
||||
msgid "Commands"
|
||||
msgstr "Befehle"
|
||||
|
|
@ -2385,6 +2402,10 @@ msgstr "Änderungen der Oberflächensprache werden erst nach einem Neuladen der
|
|||
msgid "Remember me"
|
||||
msgstr "Login merken"
|
||||
|
||||
#: src/octoprint/templates/navbar/login.jinja2:16
|
||||
msgid "User Settings"
|
||||
msgstr "Nutzereinstellungen"
|
||||
|
||||
#: src/octoprint/templates/navbar/login.jinja2:17
|
||||
msgid "Logout"
|
||||
msgstr "Logout"
|
||||
|
|
@ -2465,7 +2486,7 @@ msgstr "Frei"
|
|||
msgid "Total"
|
||||
msgstr "Gesamt"
|
||||
|
||||
#: src/octoprint/templates/sidebar/files.jinja2:64
|
||||
#: src/octoprint/templates/sidebar/files.jinja2:67
|
||||
msgid "Hint: You can also drag and drop files on this page to upload them."
|
||||
msgstr "Hinweis: Du kannst auch Dateien auf diese Seite ziehen um sie hochzuladen."
|
||||
|
||||
|
|
@ -2529,39 +2550,39 @@ msgstr "SD-Karte auswerfen"
|
|||
msgid "Machine State"
|
||||
msgstr "Druckerstatus"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:2
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:3
|
||||
msgid "File"
|
||||
msgstr "Datei"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:7
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:8
|
||||
msgid "Approx. Total Print Time"
|
||||
msgstr "Ungefähre Druckdauer"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:8
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:10
|
||||
msgid "Print Time"
|
||||
msgstr "Druckdauer"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:9
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:11
|
||||
msgid "Print Time Left"
|
||||
msgstr "Verbleibende Druckdauer"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:10
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:12
|
||||
msgid "Printed"
|
||||
msgstr "Gedruckt"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:17
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:22
|
||||
msgid "Restart"
|
||||
msgstr "Restart"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:17
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:22
|
||||
msgid "Print"
|
||||
msgstr "Drucken"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:18
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:23
|
||||
msgid "Resume"
|
||||
msgstr "Weiter"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:19
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:24
|
||||
msgid "Cancels the print job"
|
||||
msgstr "Bricht den Druckjob ab"
|
||||
|
||||
|
|
@ -2637,51 +2658,51 @@ msgstr "Lüfter an"
|
|||
msgid "Fan off"
|
||||
msgstr "Lüfter aus"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:14
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:17
|
||||
msgid "Model info"
|
||||
msgstr "Modelinformationen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:21
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:24
|
||||
msgid "Renderer options"
|
||||
msgstr "Rendereroptionen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:25
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:28
|
||||
msgid "Sync with job progress"
|
||||
msgstr "Job mit Fortschritt synchronisieren"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:30
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:33
|
||||
msgid "Center viewport on model"
|
||||
msgstr "Ausschnitt auf Modell zentrieren"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:33
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:36
|
||||
msgid "Zoom in on model"
|
||||
msgstr "Auf Model zoomen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:39
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:42
|
||||
msgid "Show moves"
|
||||
msgstr "Bewegungen zeigen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:42
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:45
|
||||
msgid "Show retracts"
|
||||
msgstr "Retracts zeigen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:48
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:51
|
||||
msgid "Also show previous layer"
|
||||
msgstr "Auch vorherige Schicht anzeigen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:51
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:54
|
||||
msgid "Also show next layer"
|
||||
msgstr "Auch nächste Schicht anzeigen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:56
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:59
|
||||
msgid "Reload"
|
||||
msgstr "Neu laden"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:62
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:65
|
||||
msgid "Note that the time estimates in this tab are calculated by the GCODE viewer in your browser and might differ from the values calculated by the server that are displayed in the \"State\" and \"Files\" panels in the sidebar due to slightly different implementations."
|
||||
msgstr "Beachte, dass die geschätzten Zeiten in diesem Tab durch den GCODE Viewer in Deinem Browser berechnet werden und sich von den durch den Server berechneten Werten unterscheiden können, die im \"Status\" und \"Dateien\" Bereich der Seitenleiste angezeigt werden. Die Ursache hierfür sind leicht unterschiedliche Implementierungen."
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:67
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:70
|
||||
msgid ""
|
||||
"<p>\n"
|
||||
" You've selected <strong data-bind=\"text: selectedFile.name\"></strong> for printing which has a size of\n"
|
||||
|
|
@ -2703,7 +2724,7 @@ msgstr ""
|
|||
" Bist Du sicher, dass du die Datei trotzdem visualisieren willst?\n"
|
||||
" </p>"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:78
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:81
|
||||
#, python-format
|
||||
msgid "Yes, please visualize %(name)s regardless of its size"
|
||||
msgstr "Ja, bitte visualisiere %(name)s unabhängig seiner Größe"
|
||||
|
|
@ -2927,3 +2948,24 @@ msgstr "Zeitrafferaufnahme rendern"
|
|||
|
||||
#~ msgid "Show Announcements..."
|
||||
#~ msgstr "Ankündigungen anzeigen..."
|
||||
|
||||
#~ msgid "Version"
|
||||
#~ msgstr "Version"
|
||||
|
||||
#~ msgid "Sourcecode"
|
||||
#~ msgstr "Quellcode"
|
||||
|
||||
#~ msgid "Documentation"
|
||||
#~ msgstr "Dokumentation"
|
||||
|
||||
#~ msgid "Bugs and Requests"
|
||||
#~ msgstr "Bugs und Requests"
|
||||
|
||||
#~ msgid "About"
|
||||
#~ msgstr "Über"
|
||||
|
||||
#~ msgid "About OctoPrint"
|
||||
#~ msgstr "Über OctoPrint"
|
||||
|
||||
#~ msgid "OctoPrint Settings"
|
||||
#~ msgstr "OctoPrint Einstellungen"
|
||||
|
|
|
|||
|
|
@ -249,6 +249,16 @@ class MachineCom(object):
|
|||
except:
|
||||
pass
|
||||
|
||||
self._consecutive_timeouts = 0
|
||||
self._consecutive_timeout_maximums = dict()
|
||||
for key, value in settings().get(["serial", "maxCommunicationTimeouts"], merged=True, asdict=True).items():
|
||||
try:
|
||||
self._consecutive_timeout_maximums[key] = int(value)
|
||||
except:
|
||||
pass
|
||||
|
||||
self._max_write_passes = settings().getInt(["serial", "maxWritePasses"])
|
||||
|
||||
self._hello_command = settings().get(["serial", "helloCommand"])
|
||||
self._trigger_ok_for_m29 = settings().getBoolean(["serial", "triggerOkForM29"])
|
||||
|
||||
|
|
@ -340,6 +350,10 @@ class MachineCom(object):
|
|||
def __del__(self):
|
||||
self.close()
|
||||
|
||||
@property
|
||||
def _active(self):
|
||||
return self._monitoring_active and self._send_queue_active
|
||||
|
||||
##~~ internal state management
|
||||
|
||||
def _changeState(self, newState):
|
||||
|
|
@ -418,11 +432,11 @@ class MachineCom(object):
|
|||
if state == self.STATE_PAUSED:
|
||||
return "Paused"
|
||||
if state == self.STATE_CLOSED:
|
||||
return "Closed"
|
||||
return "Offline"
|
||||
if state == self.STATE_ERROR:
|
||||
return "Error: %s" % (self.getErrorString())
|
||||
if state == self.STATE_CLOSED_WITH_ERROR:
|
||||
return "Error: %s" % (self.getErrorString())
|
||||
return "Offline: %s" % (self.getErrorString())
|
||||
if state == self.STATE_TRANSFERING_FILE:
|
||||
return "Transfering file to SD"
|
||||
return "Unknown State (%d)" % (self._state)
|
||||
|
|
@ -591,15 +605,17 @@ class MachineCom(object):
|
|||
if not processed:
|
||||
cmd = process_gcode_line(cmd)
|
||||
if not cmd:
|
||||
return
|
||||
return False
|
||||
|
||||
if self.isPrinting() and not self.isSdFileSelected():
|
||||
try:
|
||||
self._command_queue.put((cmd, cmd_type), item_type=cmd_type)
|
||||
return True
|
||||
except TypeAlreadyInQueue as e:
|
||||
self._logger.debug("Type already in command queue: " + e.type)
|
||||
return False
|
||||
elif self.isOperational() or force:
|
||||
self._sendCommand(cmd, cmd_type=cmd_type)
|
||||
return self._sendCommand(cmd, cmd_type=cmd_type)
|
||||
|
||||
def sendGcodeScript(self, scriptName, replacements=None):
|
||||
context = dict()
|
||||
|
|
@ -917,6 +933,8 @@ class MachineCom(object):
|
|||
|
||||
disable_external_heatup_detection = not settings().getBoolean(["feature", "externalHeatupDetection"])
|
||||
|
||||
self._consecutive_timeouts = 0
|
||||
|
||||
#Open the serial port.
|
||||
if not self._openSerial():
|
||||
return
|
||||
|
|
@ -952,6 +970,7 @@ class MachineCom(object):
|
|||
if line is None:
|
||||
break
|
||||
if line.strip() is not "":
|
||||
self._consecutive_timeouts = 0
|
||||
if self._heating:
|
||||
self._timeout = get_new_timeout("heatup", self._timeout_intervals)
|
||||
else:
|
||||
|
|
@ -1218,6 +1237,7 @@ class MachineCom(object):
|
|||
elif line.startswith("ok"):
|
||||
self._onConnected()
|
||||
elif time.time() > self._timeout:
|
||||
self._log("There was a timeout while trying to connect to the printer")
|
||||
self.close(wait=False)
|
||||
|
||||
except:
|
||||
|
|
@ -1226,8 +1246,8 @@ class MachineCom(object):
|
|||
errorMsg = "See octoprint.log for details"
|
||||
self._log(errorMsg)
|
||||
self._errorValue = errorMsg
|
||||
self._changeState(self.STATE_ERROR)
|
||||
eventManager().fire(Events.ERROR, {"error": self.getErrorString()})
|
||||
self.close(is_error=True)
|
||||
self._log("Connection closed, closing down monitor")
|
||||
|
||||
def _handle_ok(self):
|
||||
|
|
@ -1257,29 +1277,66 @@ class MachineCom(object):
|
|||
return
|
||||
|
||||
def _handle_timeout(self):
|
||||
if self._state not in (self.STATE_PRINTING,):
|
||||
return
|
||||
|
||||
if self._long_running_command:
|
||||
self._logger.debug("Ran into a communication timeout, but a command known to be a long runner is currently active")
|
||||
if self._state not in (self.STATE_PRINTING,
|
||||
self.STATE_PAUSED,
|
||||
self.STATE_OPERATIONAL):
|
||||
return
|
||||
|
||||
general_message = "Configure long running commands or increase communication timeout if that happens regularly on specific commands or long moves."
|
||||
if self._resendActive:
|
||||
self._log("Communication timeout while printing and during an active resend, resending same line again to trigger response from printer. " + general_message)
|
||||
self._resendSameCommand()
|
||||
self._clear_to_send.set()
|
||||
|
||||
# figure out which consecutive timeout maximum we have to use
|
||||
if self._long_running_command:
|
||||
consecutive_max = self._consecutive_timeout_maximums.get("long", 0)
|
||||
elif self._state in (self.STATE_PRINTING,):
|
||||
consecutive_max = self._consecutive_timeout_maximums.get("printing", 0)
|
||||
else:
|
||||
consecutive_max = self._consecutive_timeout_maximums.get("idle", 0)
|
||||
|
||||
# now increment the timeout counter
|
||||
self._consecutive_timeouts += 1
|
||||
self._logger.debug("Now at {} consecutive timeouts".format(self._consecutive_timeouts))
|
||||
|
||||
if 0 < consecutive_max < self._consecutive_timeouts:
|
||||
# too many consecutive timeouts, we give up
|
||||
message = "No response from printer after {} consecutive communication timeouts, considering it dead.".format(consecutive_max + 1)
|
||||
self._logger.info(message)
|
||||
self._log(message + " " + general_message)
|
||||
self._errorValue = "Too many consecutive timeouts, printer still connected and alive?"
|
||||
eventManager().fire(Events.ERROR, {"error": self._errorValue})
|
||||
self.close(is_error=True)
|
||||
|
||||
elif self._resendActive:
|
||||
# resend active, resend same command instead of triggering a new one
|
||||
message = "Communication timeout during an active resend, resending same line again to trigger response from printer."
|
||||
self._logger.info(message)
|
||||
self._log(message + " " + general_message)
|
||||
if self._resendSameCommand():
|
||||
self._clear_to_send.set()
|
||||
|
||||
elif self._heating:
|
||||
self._logger.debug("Timeout while in an active heatup, considering heatup to be over then")
|
||||
# blocking heatup active, consider that finished
|
||||
message = "Timeout while in an active heatup, considering heatup to be over."
|
||||
self._logger.info(message)
|
||||
self._finish_heatup()
|
||||
|
||||
else:
|
||||
self._log("Communication timeout while printing, trying to trigger response from printer. " + general_message)
|
||||
self._sendCommand("M105", cmd_type="temperature")
|
||||
self._clear_to_send.set()
|
||||
elif self._long_running_command:
|
||||
# long running command active, ignore timeout
|
||||
self._logger.debug("Ran into a communication timeout, but a command known to be a long runner is currently active")
|
||||
|
||||
return
|
||||
elif self._state in (self.STATE_PRINTING, self.STATE_PAUSED):
|
||||
# printing, try to tickle the printer
|
||||
message = "Communication timeout while printing, trying to trigger response from printer."
|
||||
self._logger.info(message)
|
||||
self._log(message + " " + general_message)
|
||||
if self._sendCommand("M105", cmd_type="temperature"):
|
||||
self._clear_to_send.set()
|
||||
|
||||
elif self._clear_to_send.blocked():
|
||||
# timeout while idle and no oks left, let's try to tickle the printer
|
||||
message = "Communication timeout while idle, trying to trigger response from printer."
|
||||
self._logger.info(message)
|
||||
self._log(message + " " + general_message)
|
||||
self._clear_to_send.set()
|
||||
|
||||
def _track_heatup(self):
|
||||
self._heating = True
|
||||
|
|
@ -1294,11 +1351,25 @@ class MachineCom(object):
|
|||
self._serial.timeout = settings().getFloat(["serial", "timeout", "communication"])
|
||||
|
||||
def _continue_sending(self):
|
||||
if self._state == self.STATE_PRINTING:
|
||||
if not self._sendFromQueue() and not self.isSdPrinting():
|
||||
self._sendNext()
|
||||
elif self._state == self.STATE_OPERATIONAL or self._state == self.STATE_PAUSED:
|
||||
self._sendFromQueue()
|
||||
while self._active:
|
||||
|
||||
if self._state == self.STATE_OPERATIONAL or self._state == self.STATE_PAUSED or self.isSdPrinting():
|
||||
# just send stuff from the command queue and be done with it
|
||||
return self._sendFromQueue()
|
||||
|
||||
elif self._state == self.STATE_PRINTING:
|
||||
# we are printing, we really want to send either something from the command
|
||||
# queue or the next line from our file, so we only return here if we actually DO
|
||||
# send something
|
||||
if self._sendFromQueue():
|
||||
# we found something in the queue to send
|
||||
return True
|
||||
|
||||
elif self._sendNext():
|
||||
# we sent the next line from the file
|
||||
return True
|
||||
|
||||
self._logger.debug("No command sent on ok while printing, doing another iteration")
|
||||
|
||||
def _process_registered_message(self, line, feedback_matcher, feedback_controls, feedback_errors):
|
||||
feedback_match = feedback_matcher.search(line)
|
||||
|
|
@ -1609,10 +1680,20 @@ class MachineCom(object):
|
|||
|
||||
def _sendNext(self):
|
||||
with self._sendNextLock:
|
||||
line = self._getNext()
|
||||
if line is not None:
|
||||
self._sendCommand(line)
|
||||
while self._active:
|
||||
# we loop until we've actually enqueued a line for sending
|
||||
line = self._getNext()
|
||||
if line is None:
|
||||
# end of file, return false
|
||||
return False
|
||||
|
||||
result = self._sendCommand(line)
|
||||
self._callback.on_comm_progress()
|
||||
if result:
|
||||
# line sent, return true
|
||||
return True
|
||||
|
||||
self._logger.debug("Command \"{}\" from file not enqueued, doing another iteration".format(line))
|
||||
|
||||
def _handleResendRequest(self, line):
|
||||
try:
|
||||
|
|
@ -1700,7 +1781,7 @@ class MachineCom(object):
|
|||
self._handle_ok()
|
||||
|
||||
def _resendSameCommand(self):
|
||||
self._resendNextCommand(again=True)
|
||||
return self._resendNextCommand(again=True)
|
||||
|
||||
def _resendNextCommand(self, again=False):
|
||||
self._lastCommError = None
|
||||
|
|
@ -1721,7 +1802,7 @@ class MachineCom(object):
|
|||
cmd = self._lastLines[-self._resendDelta]
|
||||
lineNumber = self._currentLine - self._resendDelta
|
||||
|
||||
self._enqueue_for_sending(cmd, linenumber=lineNumber)
|
||||
result = self._enqueue_for_sending(cmd, linenumber=lineNumber)
|
||||
|
||||
self._resendDelta -= 1
|
||||
if self._resendDelta <= 0:
|
||||
|
|
@ -1729,6 +1810,8 @@ class MachineCom(object):
|
|||
self._lastResendNumber = None
|
||||
self._currentResendCount = 0
|
||||
|
||||
return result
|
||||
|
||||
def _sendCommand(self, cmd, cmd_type=None):
|
||||
# Make sure we are only handling one sending job at a time
|
||||
with self._sendingLock:
|
||||
|
|
@ -1749,11 +1832,11 @@ class MachineCom(object):
|
|||
eventManager().fire(gcodeToEvent[gcode])
|
||||
|
||||
# actually enqueue the command for sending
|
||||
self._enqueue_for_sending(cmd, command_type=cmd_type)
|
||||
|
||||
self._process_command_phase("queued", cmd, cmd_type, gcode=gcode)
|
||||
|
||||
return True
|
||||
if self._enqueue_for_sending(cmd, command_type=cmd_type):
|
||||
self._process_command_phase("queued", cmd, cmd_type, gcode=gcode)
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
##~~ send loop handling
|
||||
|
||||
|
|
@ -1769,8 +1852,10 @@ class MachineCom(object):
|
|||
|
||||
try:
|
||||
self._send_queue.put((command, linenumber, command_type), item_type=command_type)
|
||||
return True
|
||||
except TypeAlreadyInQueue as e:
|
||||
self._logger.debug("Type already in send queue: " + e.type)
|
||||
return False
|
||||
|
||||
def _send_loop(self):
|
||||
"""
|
||||
|
|
@ -1955,8 +2040,11 @@ class MachineCom(object):
|
|||
|
||||
cmd += "\n"
|
||||
written = 0
|
||||
passes = 0
|
||||
while written < len(cmd):
|
||||
to_send = cmd[written:]
|
||||
old_written = written
|
||||
|
||||
try:
|
||||
written += self._serial.write(to_send)
|
||||
except serial.SerialTimeoutException:
|
||||
|
|
@ -1978,6 +2066,18 @@ class MachineCom(object):
|
|||
self.close(is_error=True)
|
||||
break
|
||||
|
||||
if old_written == written:
|
||||
# nothing written this pass
|
||||
passes += 1
|
||||
if passes > self._max_write_passes:
|
||||
# nothing written in max consecutive passes, we give up
|
||||
message = "Could not write anything to the serial port in {} tries, something appears to be wrong with the printer communication".format(self._max_write_passes)
|
||||
self._logger.error(message)
|
||||
self._log(message)
|
||||
self._errorValue = "Could not write to serial port"
|
||||
self.close(is_error=True)
|
||||
break
|
||||
|
||||
##~~ command handlers
|
||||
|
||||
def _gcode_T_sent(self, cmd, cmd_type=None):
|
||||
|
|
|
|||
|
|
@ -196,3 +196,18 @@ class ExceptionHandlerExtension(Extension):
|
|||
return "Unknown error"
|
||||
|
||||
trycatch = ExceptionHandlerExtension
|
||||
|
||||
|
||||
class MarkdownFilter(object):
|
||||
|
||||
def __init__(self, app, **markdown_options):
|
||||
self._markdown_options = markdown_options
|
||||
app.jinja_env.filters.setdefault("markdown", self)
|
||||
|
||||
def __call__(self, stream):
|
||||
from jinja2 import Markup
|
||||
from markdown import Markdown
|
||||
|
||||
# Markdown is not thread safe
|
||||
markdown = Markdown(**self._markdown_options)
|
||||
return Markup(markdown.convert(stream))
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -5,18 +5,19 @@
|
|||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OctoPrint\n"
|
||||
"Project-Id-Version: OctoPrint\n"
|
||||
"Report-Msgid-Bugs-To: i18n@octoprint.org\n"
|
||||
"POT-Creation-Date: 2016-06-16 12:18+0200\n"
|
||||
"PO-Revision-Date: 2016-06-08 11:04+0100\n"
|
||||
"POT-Creation-Date: 2016-07-28 11:50+0200\n"
|
||||
"PO-Revision-Date: 2016-07-28 12:03+0100\n"
|
||||
"Last-Translator: Gina Häußge <osd@foosel.net>\n"
|
||||
"Language: de\n"
|
||||
"Language-Team: German (http://www.transifex.com/projects/p/octoprint/language/de/)\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.2.0\n"
|
||||
"X-Generator: Poedit 1.6.8\n"
|
||||
|
||||
#: src/octoprint/plugins/announcements/__init__.py:89
|
||||
#: src/octoprint/plugins/announcements/templates/announcements.jinja2:4
|
||||
|
|
@ -55,7 +56,6 @@ msgstr "Zuletzt gelesen"
|
|||
#: src/octoprint/plugins/announcements/templates/announcements.jinja2:43
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:87
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:197
|
||||
#: src/octoprint/templates/dialogs/about.jinja2:51
|
||||
#: src/octoprint/templates/dialogs/settings/appearance.jinja2:96
|
||||
msgid "Close"
|
||||
msgstr "Schließen"
|
||||
|
|
@ -199,7 +199,6 @@ msgstr ""
|
|||
" Tools wie z.B. Repetier Host.\n"
|
||||
|
||||
#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:121
|
||||
#: src/octoprint/templates/dialogs/usersettings.jinja2:46
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:80
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:109
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:151
|
||||
|
|
@ -208,7 +207,6 @@ msgid "Abort"
|
|||
msgstr "Abbrechen"
|
||||
|
||||
#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:122
|
||||
#: src/octoprint/templates/dialogs/usersettings.jinja2:47
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:81
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:110
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:152
|
||||
|
|
@ -478,7 +476,6 @@ msgstr "Gebundled"
|
|||
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:48
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:129
|
||||
#: src/octoprint/templates/index.jinja2:118
|
||||
msgid "Homepage"
|
||||
msgstr "Homepage"
|
||||
|
||||
|
|
@ -619,15 +616,13 @@ msgstr "Repository-Cache TTL"
|
|||
#: src/octoprint/plugins/softwareupdate/templates/softwareupdate.jinja2:26
|
||||
#: src/octoprint/plugins/softwareupdate/templates/softwareupdate_settings.jinja2:101
|
||||
#: src/octoprint/templates/dialogs/confirmation.jinja2:11
|
||||
#: src/octoprint/templates/dialogs/settings.jinja2:52
|
||||
#: src/octoprint/templates/dialogs/slicing.jinja2:50
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:19
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:24
|
||||
msgid "Cancel"
|
||||
msgstr "Abbruch"
|
||||
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:240
|
||||
#: src/octoprint/plugins/softwareupdate/templates/softwareupdate_settings.jinja2:102
|
||||
#: src/octoprint/templates/dialogs/settings.jinja2:53
|
||||
msgid "Save"
|
||||
msgstr "Speichern"
|
||||
|
||||
|
|
@ -904,7 +899,7 @@ msgid "GCode Viewer"
|
|||
msgstr "GCode Viewer"
|
||||
|
||||
#: src/octoprint/server/views.py:146
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:3
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:4
|
||||
msgid "Timelapse"
|
||||
msgstr "Zeitraffer"
|
||||
|
||||
|
|
@ -990,60 +985,19 @@ msgstr "Der Server scheint offline zu sein, zumindest kann ich mich nicht mit ih
|
|||
msgid "The server appears to be offline, at least I'm not getting any response from it. I <strong>could not reconnect automatically</strong>, but you may try a manual reconnect using the button below."
|
||||
msgstr "Der Server scheint offline zu sein, zumindest kann ich mich nicht mit ihm verbinden. Ich <strong>konnte mich nicht automatisch neu verbinden</strong>, aber Du kannst mittels des folgenden Buttons einen manuellen Verbindungsversuch anstoßen."
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:217
|
||||
#: src/octoprint/static/js/app/dataupdater.js:237
|
||||
#, python-format
|
||||
msgid "Slicing ... (%(percentage)d%%)"
|
||||
msgstr "Slice ... (%(percentage)d%%)"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:239
|
||||
msgid "Slicing ..."
|
||||
msgstr "Slice ..."
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:245
|
||||
msgid "Slicing done"
|
||||
msgstr "Slicing abgeschlossen"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:245
|
||||
#, python-format
|
||||
msgid "Sliced %(stl)s to %(gcode)s, took %(time).2f seconds"
|
||||
msgstr "%(stl)s nach %(gcode)s geslicet, dauerte %(time).2f Sekunden"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:255
|
||||
#, python-format
|
||||
msgid "Could not slice %(stl)s to %(gcode)s: %(reason)s"
|
||||
msgstr "Konnte %(stl)s nicht nach %(gcode)s slicen: %(reason)s"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:256
|
||||
msgid "Slicing failed"
|
||||
msgstr "Slicing fehlgeschlagen"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:260
|
||||
msgid "Streaming ..."
|
||||
msgstr "Streaming ..."
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:266
|
||||
msgid "Streaming done"
|
||||
msgstr "Streaming abgeschlossen"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:267
|
||||
#, python-format
|
||||
msgid "Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds"
|
||||
msgstr "%(local)s nach %(remote)s gestreamt, dauerte %(time).2f Sekunden"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:273
|
||||
#: src/octoprint/static/js/app/dataupdater.js:281
|
||||
#: src/octoprint/static/js/app/dataupdater.js:230
|
||||
#: src/octoprint/static/js/app/dataupdater.js:238
|
||||
msgid "Unhandled communication error"
|
||||
msgstr "Unbehandelter Kommunikationsfehler"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:274
|
||||
#: src/octoprint/static/js/app/dataupdater.js:231
|
||||
#, python-format
|
||||
msgid "There was an unhandled error while talking to the printer. Due to that the ongoing print job was cancelled. Error: %(firmwareError)s"
|
||||
msgstr "Es gab einen unbehandelten Fehler bei der Kommunikation mit dem Drucker. Daher wurder der laufende Druckauftrag abgebrochen. Fehler: %(firmwareError)s"
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:282
|
||||
#, python-format
|
||||
msgid "The was an unhandled error while talking to the printer. Due to that OctoPrint disconnected. Error: %(error)s"
|
||||
#: src/octoprint/static/js/app/dataupdater.js:239
|
||||
#, fuzzy, python-format
|
||||
msgid "There was an unhandled error while talking to the printer. Due to that OctoPrint disconnected. Error: %(error)s"
|
||||
msgstr "Es gab einen unbehandelten Fehler bei der Kommunikation mit dem Drucker. Daher hat OctoPrint die Verbindung getrennt. Fehler: %(error)s"
|
||||
|
||||
#: src/octoprint/static/js/app/helpers.js:372
|
||||
|
|
@ -1118,9 +1072,9 @@ msgid "Disconnect"
|
|||
msgstr "Trennen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/control.js:65
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:329
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:348
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:471
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:177
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:228
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:58
|
||||
msgid "Tool"
|
||||
msgstr "Werkzeug"
|
||||
|
|
@ -1142,32 +1096,74 @@ msgstr "Dein verfügbarer freier Plattenplatz wird langsam knapp."
|
|||
msgid "Your current disk usage."
|
||||
msgstr "Dein aktuell verfügbarer freier Plattenplatz."
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:324
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:329
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:343
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:348
|
||||
msgid "Filament"
|
||||
msgstr "Filament"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:333
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:352
|
||||
msgid "Estimated Print Time"
|
||||
msgstr "Geschätzte Druckdauer"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:336
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:355
|
||||
msgid "Last Printed"
|
||||
msgstr "Zuletzt gedruckt"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:338
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:357
|
||||
msgid "Last Print Time"
|
||||
msgstr "Letzte Druckdauer"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:515
|
||||
msgid "Could not upload the file. Make sure that it is a GCODE file and has the extension \".gcode\" or \".gco\" or that it is an STL file with the extension \".stl\"."
|
||||
msgstr "Konnte die Datei nicht hochladen. Bitte stelle sicher, dass es sich um eine GCODE-Datei mit der Extension \".gcode\" oder \".gco\" oder um eine STL-Datei mit der Extension \".stl\" handelt."
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:460
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:467
|
||||
#, python-format
|
||||
msgid "Slicing ... (%(percentage)d%%)"
|
||||
msgstr "Slice ... (%(percentage)d%%)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:536
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:462
|
||||
msgid "Slicing ..."
|
||||
msgstr "Slice ..."
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:488
|
||||
msgid "Slicing done"
|
||||
msgstr "Slicing abgeschlossen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:489
|
||||
#, python-format
|
||||
msgid "Sliced %(stl)s to %(gcode)s, took %(time).2f seconds"
|
||||
msgstr "%(stl)s nach %(gcode)s geslicet, dauerte %(time).2f Sekunden"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:504
|
||||
#, python-format
|
||||
msgid "Could not slice %(stl)s to %(gcode)s: %(reason)s"
|
||||
msgstr "Konnte %(stl)s nicht nach %(gcode)s slicen: %(reason)s"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:505
|
||||
msgid "Slicing failed"
|
||||
msgstr "Slicing fehlgeschlagen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:522
|
||||
msgid "Streaming ..."
|
||||
msgstr "Streaming ..."
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:534
|
||||
msgid "Streaming done"
|
||||
msgstr "Streaming abgeschlossen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:535
|
||||
#, python-format
|
||||
msgid "Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds"
|
||||
msgstr "%(local)s nach %(remote)s gestreamt, dauerte %(time).2f Sekunden"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:627
|
||||
#, python-format
|
||||
msgid "Could not upload the file. Make sure that it is a valid file with one of these extensions: %(extensions)s"
|
||||
msgstr "Konnte die Datei nicht hochladen. Bitte stelle sicher, dass es sich um eine valide Datei mit einer dieser Erweiterungen ist: %(extensions)s"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:654
|
||||
msgid "Uploading ..."
|
||||
msgstr "Uploade ..."
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:543
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:660
|
||||
msgid "Saving ..."
|
||||
msgstr "Speichere ..."
|
||||
|
||||
|
|
@ -1370,52 +1366,76 @@ msgstr "Druckerprofil hinzufügen"
|
|||
msgid "Edit Printer Profile \"%(name)s\""
|
||||
msgstr "Druckerprofile \"%(name)s\" bearbeiten"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:44
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:45
|
||||
msgid "Restarts the print job from the beginning"
|
||||
msgstr "Started den Druckjob von vorne"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:45
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:46
|
||||
msgid "Starts the print job"
|
||||
msgstr "Startet den Druckjob"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:46
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:47
|
||||
msgid "Resumes the print job"
|
||||
msgstr "Setzt den Druckjob fort"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:47
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:48
|
||||
msgid "Pauses the print job"
|
||||
msgstr "Pausiert den Druckjob"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:80
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:81
|
||||
msgid "Calculating..."
|
||||
msgstr "Wird ermittelt..."
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:93
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:91
|
||||
msgid "Based on a linear approximation (accuracy highly dependent on the model)"
|
||||
msgstr "Basiert auf einer linearen Approximation (Genauigkeit hängt stark vom Modell ab)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:94
|
||||
msgid "Based on the estimate from analysis of file (medium accuracy)"
|
||||
msgstr "Basiert auf der Schätzung der Analyse der Datei (mittlere Genauigkeit)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:97
|
||||
msgid "Based on a mix of estimate from analysis and calculation (medium accuracy)"
|
||||
msgstr "Basiert auf einem Mix der Schätzung aus der Analyse und der Berechnung (mittlere Genauigkeit)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:100
|
||||
msgid "Based on the average total of past prints of this model with the same printer profile (usually good accuracy)"
|
||||
msgstr "Basiert auf der durchschnittlichen Dauer vergangener Druckjobs dieses Modells mit dem selben Druckerprofil (normalerweise gute Genauigkeit)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:103
|
||||
msgid "Based on a mix of average total from past prints and calculation (usually good accuracy)"
|
||||
msgstr "Basiert auf einem Mix der durschnittlichen Dauer vergangener Druckjobs und der Berechnung (normalerweise gute Genauigkeit)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:106
|
||||
msgid "Based on the calculated estimate (best accuracy)"
|
||||
msgstr "Basiert auf der berechneten Schätzung (beste Genauigkeit)"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:144
|
||||
msgid "Continue"
|
||||
msgstr "Fortsetzen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:95
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:18
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:146
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:23
|
||||
msgid "Pause"
|
||||
msgstr "Pause"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:106
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:157
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:11
|
||||
msgid "On Z Change"
|
||||
msgstr "Bei Ebenenwechsel"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:108
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:159
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:10
|
||||
msgid "Timed"
|
||||
msgstr "Nach Zeit"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:108
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:159
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:25
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:32
|
||||
msgid "sec"
|
||||
msgstr "Sek"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:216
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:268
|
||||
msgid "This will restart the print job from the beginning."
|
||||
msgstr "Der Druckjob wird zurückgesetzt und von vorne begonnen."
|
||||
|
||||
|
|
@ -1433,19 +1453,19 @@ msgstr "weiß"
|
|||
msgid "Autodetect from browser"
|
||||
msgstr "Automatisch vom Browser erkennen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:31
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:104
|
||||
msgid "Do nothing"
|
||||
msgstr "Nichts machen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:32
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:105
|
||||
msgid "Select for printing"
|
||||
msgstr "Zum Drucken auswählen"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:33
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:106
|
||||
msgid "Start printing"
|
||||
msgstr "Drucken"
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:45
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:118
|
||||
#, python-format
|
||||
msgid "Slicing %(filename)s"
|
||||
msgstr "Slice %(filename)s"
|
||||
|
|
@ -1553,31 +1573,6 @@ msgstr "Neue Zeitrafferaufnahme %(movie_prefix)s wurde fertig gerendert"
|
|||
msgid "Site default"
|
||||
msgstr "Seitenvoreinstellung"
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:115
|
||||
msgid "Version"
|
||||
msgstr "Version"
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:119
|
||||
msgid "Sourcecode"
|
||||
msgstr "Quellcode"
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:120
|
||||
msgid "Documentation"
|
||||
msgstr "Dokumentation"
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:121
|
||||
msgid "Bugs and Requests"
|
||||
msgstr "Bugs und Requests"
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:122
|
||||
msgid "About"
|
||||
msgstr "Über"
|
||||
|
||||
#: src/octoprint/templates/dialogs/about.jinja2:4
|
||||
#: src/octoprint/templates/dialogs/settings.jinja2:51
|
||||
msgid "About OctoPrint"
|
||||
msgstr "Über OctoPrint"
|
||||
|
||||
#: src/octoprint/templates/dialogs/confirmation.jinja2:4
|
||||
msgid "Are you sure?"
|
||||
msgstr "Bist Du sicher?"
|
||||
|
|
@ -1673,10 +1668,6 @@ msgstr "Zugangsbeschränkung deaktivieren"
|
|||
msgid "Keep Access Control Enabled"
|
||||
msgstr "Zugangsbeschränkung aktiviert lassen"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings.jinja2:4
|
||||
msgid "OctoPrint Settings"
|
||||
msgstr "OctoPrint Einstellungen"
|
||||
|
||||
#: src/octoprint/templates/dialogs/slicing.jinja2:8
|
||||
msgid "Slicing is currently disabled since no slicer has been configured yet. Please configure a slicer under \"Settings\"."
|
||||
msgstr "Slicing ist aktuell deaktiviert da noch kein Slicer konfiguriert wurde. Bitte konfiguriere einen Slicer unter \"Settings\"."
|
||||
|
|
@ -1711,8 +1702,8 @@ msgid "Select a printer profile..."
|
|||
msgstr "Wähle ein Druckerprofil..."
|
||||
|
||||
#: src/octoprint/templates/dialogs/slicing.jinja2:32
|
||||
msgid "GCode Filename"
|
||||
msgstr "GCode Dateiname"
|
||||
msgid "Output Filename"
|
||||
msgstr "Ausgabedateiname"
|
||||
|
||||
#: src/octoprint/templates/dialogs/slicing.jinja2:41
|
||||
msgid "After slicing..."
|
||||
|
|
@ -1723,11 +1714,6 @@ msgstr "Nach dem Slicing..."
|
|||
msgid "Slice"
|
||||
msgstr "Slicen"
|
||||
|
||||
#: src/octoprint/templates/dialogs/usersettings.jinja2:4
|
||||
#: src/octoprint/templates/navbar/login.jinja2:16
|
||||
msgid "User Settings"
|
||||
msgstr "Nutzereinstellungen"
|
||||
|
||||
#: src/octoprint/templates/dialogs/about/about.jinja2:3
|
||||
msgid "The snappy web interface for your 3D printer"
|
||||
msgstr "The snappy web interface for your 3D printer"
|
||||
|
|
@ -1921,31 +1907,39 @@ msgid "Wait for <code>start</code> on connect"
|
|||
msgstr "Bei der Verbindung auf <code>start</code> warten"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:40
|
||||
msgid "Select SD files by relative path"
|
||||
msgstr "SD Dateien per relativem Pfad addressieren"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:40
|
||||
msgid "RepRap Firmware"
|
||||
msgstr "RepRap Firmware"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:47
|
||||
msgid "Always assume SD card is present"
|
||||
msgstr "Immer davon ausgehen, dass eine SD-Karte vorhanden ist"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:40
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:47
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:54
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:61
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:68
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:75
|
||||
msgid "Repetier"
|
||||
msgstr "Repetier"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:47
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:54
|
||||
msgid "Send a checksum with <strong>every</strong> command"
|
||||
msgstr "Eine Prüfsumme mit <strong>jedem</strong> Befehl senden"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:54
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:61
|
||||
msgid "Ignore consecutive resend requests for the same line"
|
||||
msgstr "Aufeinanderfolgende Resend Requests für die selbe Zeilennummer ignorieren"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:61
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:68
|
||||
#, python-format
|
||||
msgid "Support <code>TargetExtr%%n</code>/<code>TargetBed</code> target temperature format"
|
||||
msgstr "<code>TargetExtr%%n</code>/<code>TargetBed</code> Zieltemperaturformat unterstützen"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:68
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:75
|
||||
msgid "Disable detection of external heatups"
|
||||
msgstr "Detektierung externer Aufheizvorgänge deaktivieren"
|
||||
|
||||
|
|
@ -1984,7 +1978,7 @@ msgstr "Falls der freie Plattenplatz unter diese Schwellwerte fallen sollte wird
|
|||
#: src/octoprint/templates/dialogs/settings/folders.jinja2:47
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:69
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:90
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:66
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:69
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:13
|
||||
msgid "Warning"
|
||||
msgstr "Warnung"
|
||||
|
|
@ -2260,6 +2254,30 @@ msgstr "Viele Marlin < v1.1.0"
|
|||
msgid "Simulate an additional `ok` for resend requests"
|
||||
msgstr "Zusätzliches `ok` für Resendrequests simulieren"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:129
|
||||
msgid "Maximum consecutive communication timeouts while idle. More than this and the printer will be considered to be gone. Set to 0 to disable."
|
||||
msgstr "Maximale Anzahl aufeinanderfolgender Communication Timeouts im Idlezustand. Mehr als das und es wird angenommen, dass der Drucker offline ist. Auf 0 setzen um das zu verhindern."
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:130
|
||||
msgid "Max. consecutive timeouts while idle"
|
||||
msgstr "Max. aufeinanderfolgende Timeouts wenn idle"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:135
|
||||
msgid "Maximum consecutive communication timeouts while printing. More than this and the printer will be considered to be gone. Set to 0 to disable."
|
||||
msgstr "Maximale Anzahl aufeinanderfolgender Communication Timeouts beim Drucken. Mehr als das und es wird angenommen, dass der Drucker offline ist. Auf 0 setzen um das zu verhindern."
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:136
|
||||
msgid "Max. consecutive timeouts while printing"
|
||||
msgstr "Max. aufeinanderfolgende Timeouts beim Drucken"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:141
|
||||
msgid "Maximum consecutive communication timeouts while a long running command is active. More than this and the printer will be considered to be gone. Set to 0 to disable."
|
||||
msgstr "Maximale Anzahl aufeinanderfolgender Communication Timeouts wenn ein lang laufender Befehl aktiv ist. Mehr als das und es wird angenommen, dass der Drucker offline ist. Auf 0 setzen um das zu verhindern."
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:142
|
||||
msgid "Max. consecutive timeouts during long running commands"
|
||||
msgstr "Max. aufeinanderfolgende Timeouts während lang laufender Befehle"
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/server.jinja2:2
|
||||
msgid "Commands"
|
||||
msgstr "Befehle"
|
||||
|
|
@ -2384,6 +2402,10 @@ msgstr "Änderungen der Oberflächensprache werden erst nach einem Neuladen der
|
|||
msgid "Remember me"
|
||||
msgstr "Login merken"
|
||||
|
||||
#: src/octoprint/templates/navbar/login.jinja2:16
|
||||
msgid "User Settings"
|
||||
msgstr "Nutzereinstellungen"
|
||||
|
||||
#: src/octoprint/templates/navbar/login.jinja2:17
|
||||
msgid "Logout"
|
||||
msgstr "Logout"
|
||||
|
|
@ -2464,7 +2486,7 @@ msgstr "Frei"
|
|||
msgid "Total"
|
||||
msgstr "Gesamt"
|
||||
|
||||
#: src/octoprint/templates/sidebar/files.jinja2:64
|
||||
#: src/octoprint/templates/sidebar/files.jinja2:67
|
||||
msgid "Hint: You can also drag and drop files on this page to upload them."
|
||||
msgstr "Hinweis: Du kannst auch Dateien auf diese Seite ziehen um sie hochzuladen."
|
||||
|
||||
|
|
@ -2528,39 +2550,39 @@ msgstr "SD-Karte auswerfen"
|
|||
msgid "Machine State"
|
||||
msgstr "Druckerstatus"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:2
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:3
|
||||
msgid "File"
|
||||
msgstr "Datei"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:7
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:8
|
||||
msgid "Approx. Total Print Time"
|
||||
msgstr "Ungefähre Druckdauer"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:8
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:10
|
||||
msgid "Print Time"
|
||||
msgstr "Druckdauer"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:9
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:11
|
||||
msgid "Print Time Left"
|
||||
msgstr "Verbleibende Druckdauer"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:10
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:12
|
||||
msgid "Printed"
|
||||
msgstr "Gedruckt"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:17
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:22
|
||||
msgid "Restart"
|
||||
msgstr "Restart"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:17
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:22
|
||||
msgid "Print"
|
||||
msgstr "Drucken"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:18
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:23
|
||||
msgid "Resume"
|
||||
msgstr "Weiter"
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:19
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:24
|
||||
msgid "Cancels the print job"
|
||||
msgstr "Bricht den Druckjob ab"
|
||||
|
||||
|
|
@ -2636,51 +2658,51 @@ msgstr "Lüfter an"
|
|||
msgid "Fan off"
|
||||
msgstr "Lüfter aus"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:14
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:17
|
||||
msgid "Model info"
|
||||
msgstr "Modelinformationen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:21
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:24
|
||||
msgid "Renderer options"
|
||||
msgstr "Rendereroptionen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:25
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:28
|
||||
msgid "Sync with job progress"
|
||||
msgstr "Job mit Fortschritt synchronisieren"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:30
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:33
|
||||
msgid "Center viewport on model"
|
||||
msgstr "Ausschnitt auf Modell zentrieren"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:33
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:36
|
||||
msgid "Zoom in on model"
|
||||
msgstr "Auf Model zoomen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:39
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:42
|
||||
msgid "Show moves"
|
||||
msgstr "Bewegungen zeigen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:42
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:45
|
||||
msgid "Show retracts"
|
||||
msgstr "Retracts zeigen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:48
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:51
|
||||
msgid "Also show previous layer"
|
||||
msgstr "Auch vorherige Schicht anzeigen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:51
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:54
|
||||
msgid "Also show next layer"
|
||||
msgstr "Auch nächste Schicht anzeigen"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:56
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:59
|
||||
msgid "Reload"
|
||||
msgstr "Neu laden"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:62
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:65
|
||||
msgid "Note that the time estimates in this tab are calculated by the GCODE viewer in your browser and might differ from the values calculated by the server that are displayed in the \"State\" and \"Files\" panels in the sidebar due to slightly different implementations."
|
||||
msgstr "Beachte, dass die geschätzten Zeiten in diesem Tab durch den GCODE Viewer in Deinem Browser berechnet werden und sich von den durch den Server berechneten Werten unterscheiden können, die im \"Status\" und \"Dateien\" Bereich der Seitenleiste angezeigt werden. Die Ursache hierfür sind leicht unterschiedliche Implementierungen."
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:67
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:70
|
||||
msgid ""
|
||||
"<p>\n"
|
||||
" You've selected <strong data-bind=\"text: selectedFile.name\"></strong> for printing which has a size of\n"
|
||||
|
|
@ -2702,7 +2724,7 @@ msgstr ""
|
|||
" Bist Du sicher, dass du die Datei trotzdem visualisieren willst?\n"
|
||||
" </p>"
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:78
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:81
|
||||
#, python-format
|
||||
msgid "Yes, please visualize %(name)s regardless of its size"
|
||||
msgstr "Ja, bitte visualisiere %(name)s unabhängig seiner Größe"
|
||||
|
|
@ -2927,3 +2949,23 @@ msgstr "Zeitrafferaufnahme rendern"
|
|||
#~ msgid "Show Announcements..."
|
||||
#~ msgstr "Ankündigungen anzeigen..."
|
||||
|
||||
#~ msgid "Version"
|
||||
#~ msgstr "Version"
|
||||
|
||||
#~ msgid "Sourcecode"
|
||||
#~ msgstr "Quellcode"
|
||||
|
||||
#~ msgid "Documentation"
|
||||
#~ msgstr "Dokumentation"
|
||||
|
||||
#~ msgid "Bugs and Requests"
|
||||
#~ msgstr "Bugs und Requests"
|
||||
|
||||
#~ msgid "About"
|
||||
#~ msgstr "Über"
|
||||
|
||||
#~ msgid "About OctoPrint"
|
||||
#~ msgstr "Über OctoPrint"
|
||||
|
||||
#~ msgid "OctoPrint Settings"
|
||||
#~ msgstr "OctoPrint Einstellungen"
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@
|
|||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OctoPrint 1.2.13.dev7+g6c20e58\n"
|
||||
"Project-Id-Version: OctoPrint 1.2.14.dev70+gf671006\n"
|
||||
"Report-Msgid-Bugs-To: i18n@octoprint.org\n"
|
||||
"POT-Creation-Date: 2016-06-16 12:18+0200\n"
|
||||
"POT-Creation-Date: 2016-07-28 11:50+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
|
@ -54,7 +54,6 @@ msgstr ""
|
|||
#: src/octoprint/plugins/announcements/templates/announcements.jinja2:43
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:87
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:197
|
||||
#: src/octoprint/templates/dialogs/about.jinja2:51
|
||||
#: src/octoprint/templates/dialogs/settings/appearance.jinja2:96
|
||||
msgid "Close"
|
||||
msgstr ""
|
||||
|
|
@ -194,7 +193,6 @@ msgid ""
|
|||
msgstr ""
|
||||
|
||||
#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:121
|
||||
#: src/octoprint/templates/dialogs/usersettings.jinja2:46
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:80
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:109
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:151
|
||||
|
|
@ -203,7 +201,6 @@ msgid "Abort"
|
|||
msgstr ""
|
||||
|
||||
#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:122
|
||||
#: src/octoprint/templates/dialogs/usersettings.jinja2:47
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:81
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:110
|
||||
#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:152
|
||||
|
|
@ -507,7 +504,6 @@ msgstr ""
|
|||
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:48
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:129
|
||||
#: src/octoprint/templates/index.jinja2:118
|
||||
msgid "Homepage"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -661,15 +657,13 @@ msgstr ""
|
|||
#: src/octoprint/plugins/softwareupdate/templates/softwareupdate.jinja2:26
|
||||
#: src/octoprint/plugins/softwareupdate/templates/softwareupdate_settings.jinja2:101
|
||||
#: src/octoprint/templates/dialogs/confirmation.jinja2:11
|
||||
#: src/octoprint/templates/dialogs/settings.jinja2:52
|
||||
#: src/octoprint/templates/dialogs/slicing.jinja2:50
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:19
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:24
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:240
|
||||
#: src/octoprint/plugins/softwareupdate/templates/softwareupdate_settings.jinja2:102
|
||||
#: src/octoprint/templates/dialogs/settings.jinja2:53
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -974,7 +968,7 @@ msgid "GCode Viewer"
|
|||
msgstr ""
|
||||
|
||||
#: src/octoprint/server/views.py:146
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:3
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:4
|
||||
msgid "Timelapse"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1067,63 +1061,22 @@ msgid ""
|
|||
"may try a manual reconnect using the button below."
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:217
|
||||
#: src/octoprint/static/js/app/dataupdater.js:237
|
||||
#, python-format
|
||||
msgid "Slicing ... (%(percentage)d%%)"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:239
|
||||
msgid "Slicing ..."
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:245
|
||||
msgid "Slicing done"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:245
|
||||
#, python-format
|
||||
msgid "Sliced %(stl)s to %(gcode)s, took %(time).2f seconds"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:255
|
||||
#, python-format
|
||||
msgid "Could not slice %(stl)s to %(gcode)s: %(reason)s"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:256
|
||||
msgid "Slicing failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:260
|
||||
msgid "Streaming ..."
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:266
|
||||
msgid "Streaming done"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:267
|
||||
#, python-format
|
||||
msgid "Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:273
|
||||
#: src/octoprint/static/js/app/dataupdater.js:281
|
||||
#: src/octoprint/static/js/app/dataupdater.js:230
|
||||
#: src/octoprint/static/js/app/dataupdater.js:238
|
||||
msgid "Unhandled communication error"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:274
|
||||
#: src/octoprint/static/js/app/dataupdater.js:231
|
||||
#, python-format
|
||||
msgid ""
|
||||
"There was an unhandled error while talking to the printer. Due to that "
|
||||
"the ongoing print job was cancelled. Error: %(firmwareError)s"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/dataupdater.js:282
|
||||
#: src/octoprint/static/js/app/dataupdater.js:239
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The was an unhandled error while talking to the printer. Due to that "
|
||||
"There was an unhandled error while talking to the printer. Due to that "
|
||||
"OctoPrint disconnected. Error: %(error)s"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1199,9 +1152,9 @@ msgid "Disconnect"
|
|||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/control.js:65
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:329
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:348
|
||||
#: src/octoprint/static/js/app/viewmodels/gcode.js:471
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:177
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:228
|
||||
#: src/octoprint/static/js/app/viewmodels/temperature.js:58
|
||||
msgid "Tool"
|
||||
msgstr ""
|
||||
|
|
@ -1223,35 +1176,76 @@ msgstr ""
|
|||
msgid "Your current disk usage."
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:324
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:329
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:343
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:348
|
||||
msgid "Filament"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:333
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:352
|
||||
msgid "Estimated Print Time"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:336
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:355
|
||||
msgid "Last Printed"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:338
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:357
|
||||
msgid "Last Print Time"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:515
|
||||
msgid ""
|
||||
"Could not upload the file. Make sure that it is a GCODE file and has the "
|
||||
"extension \".gcode\" or \".gco\" or that it is an STL file with the "
|
||||
"extension \".stl\"."
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:460
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:467
|
||||
#, python-format
|
||||
msgid "Slicing ... (%(percentage)d%%)"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:536
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:462
|
||||
msgid "Slicing ..."
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:488
|
||||
msgid "Slicing done"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:489
|
||||
#, python-format
|
||||
msgid "Sliced %(stl)s to %(gcode)s, took %(time).2f seconds"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:504
|
||||
#, python-format
|
||||
msgid "Could not slice %(stl)s to %(gcode)s: %(reason)s"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:505
|
||||
msgid "Slicing failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:522
|
||||
msgid "Streaming ..."
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:534
|
||||
msgid "Streaming done"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:535
|
||||
#, python-format
|
||||
msgid "Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:627
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Could not upload the file. Make sure that it is a valid file with one of "
|
||||
"these extensions: %(extensions)s"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:654
|
||||
msgid "Uploading ..."
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:543
|
||||
#: src/octoprint/static/js/app/viewmodels/files.js:660
|
||||
msgid "Saving ..."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1463,52 +1457,80 @@ msgstr ""
|
|||
msgid "Edit Printer Profile \"%(name)s\""
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:44
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:45
|
||||
msgid "Restarts the print job from the beginning"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:45
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:46
|
||||
msgid "Starts the print job"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:46
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:47
|
||||
msgid "Resumes the print job"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:47
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:48
|
||||
msgid "Pauses the print job"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:80
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:81
|
||||
msgid "Calculating..."
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:93
|
||||
msgid "Continue"
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:91
|
||||
msgid "Based on a linear approximation (accuracy highly dependent on the model)"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:95
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:18
|
||||
msgid "Pause"
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:94
|
||||
msgid "Based on the estimate from analysis of file (medium accuracy)"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:97
|
||||
msgid "Based on a mix of estimate from analysis and calculation (medium accuracy)"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:100
|
||||
msgid ""
|
||||
"Based on the average total of past prints of this model with the same "
|
||||
"printer profile (usually good accuracy)"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:103
|
||||
msgid ""
|
||||
"Based on a mix of average total from past prints and calculation (usually"
|
||||
" good accuracy)"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:106
|
||||
msgid "Based on the calculated estimate (best accuracy)"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:144
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:146
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:23
|
||||
msgid "Pause"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:157
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:11
|
||||
msgid "On Z Change"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:108
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:159
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:10
|
||||
msgid "Timed"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:108
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:159
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:25
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:32
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:216
|
||||
#: src/octoprint/static/js/app/viewmodels/printerstate.js:268
|
||||
msgid "This will restart the print job from the beginning."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1526,19 +1548,19 @@ msgstr ""
|
|||
msgid "Autodetect from browser"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:31
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:104
|
||||
msgid "Do nothing"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:32
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:105
|
||||
msgid "Select for printing"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:33
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:106
|
||||
msgid "Start printing"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:45
|
||||
#: src/octoprint/static/js/app/viewmodels/slicing.js:118
|
||||
#, python-format
|
||||
msgid "Slicing %(filename)s"
|
||||
msgstr ""
|
||||
|
|
@ -1658,31 +1680,6 @@ msgstr ""
|
|||
msgid "Site default"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:115
|
||||
msgid "Version"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:119
|
||||
msgid "Sourcecode"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:120
|
||||
msgid "Documentation"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:121
|
||||
msgid "Bugs and Requests"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/index.jinja2:122
|
||||
msgid "About"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/about.jinja2:4
|
||||
#: src/octoprint/templates/dialogs/settings.jinja2:51
|
||||
msgid "About OctoPrint"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/confirmation.jinja2:4
|
||||
msgid "Are you sure?"
|
||||
msgstr ""
|
||||
|
|
@ -1767,10 +1764,6 @@ msgstr ""
|
|||
msgid "Keep Access Control Enabled"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings.jinja2:4
|
||||
msgid "OctoPrint Settings"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/slicing.jinja2:8
|
||||
msgid ""
|
||||
"Slicing is currently disabled since no slicer has been configured yet. "
|
||||
|
|
@ -1810,7 +1803,7 @@ msgid "Select a printer profile..."
|
|||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/slicing.jinja2:32
|
||||
msgid "GCode Filename"
|
||||
msgid "Output Filename"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/slicing.jinja2:41
|
||||
|
|
@ -1822,11 +1815,6 @@ msgstr ""
|
|||
msgid "Slice"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/usersettings.jinja2:4
|
||||
#: src/octoprint/templates/navbar/login.jinja2:16
|
||||
msgid "User Settings"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/about/about.jinja2:3
|
||||
msgid "The snappy web interface for your 3D printer"
|
||||
msgstr ""
|
||||
|
|
@ -2030,33 +2018,41 @@ msgid "Wait for <code>start</code> on connect"
|
|||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:40
|
||||
msgid "Always assume SD card is present"
|
||||
msgid "Select SD files by relative path"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:40
|
||||
msgid "RepRap Firmware"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:47
|
||||
msgid "Always assume SD card is present"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:47
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:54
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:61
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:68
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:75
|
||||
msgid "Repetier"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:47
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:54
|
||||
msgid "Send a checksum with <strong>every</strong> command"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:54
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:61
|
||||
msgid "Ignore consecutive resend requests for the same line"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:61
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Support <code>TargetExtr%%n</code>/<code>TargetBed</code> target "
|
||||
"temperature format"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:68
|
||||
#: src/octoprint/templates/dialogs/settings/features.jinja2:75
|
||||
msgid "Disable detection of external heatups"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -2099,7 +2095,7 @@ msgstr ""
|
|||
#: src/octoprint/templates/dialogs/settings/folders.jinja2:47
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:69
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:90
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:66
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:69
|
||||
#: src/octoprint/templates/tabs/timelapse.jinja2:13
|
||||
msgid "Warning"
|
||||
msgstr ""
|
||||
|
|
@ -2417,6 +2413,37 @@ msgstr ""
|
|||
msgid "Simulate an additional `ok` for resend requests"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:129
|
||||
msgid ""
|
||||
"Maximum consecutive communication timeouts while idle. More than this and"
|
||||
" the printer will be considered to be gone. Set to 0 to disable."
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:130
|
||||
msgid "Max. consecutive timeouts while idle"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:135
|
||||
msgid ""
|
||||
"Maximum consecutive communication timeouts while printing. More than this"
|
||||
" and the printer will be considered to be gone. Set to 0 to disable."
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:136
|
||||
msgid "Max. consecutive timeouts while printing"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:141
|
||||
msgid ""
|
||||
"Maximum consecutive communication timeouts while a long running command "
|
||||
"is active. More than this and the printer will be considered to be gone. "
|
||||
"Set to 0 to disable."
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:142
|
||||
msgid "Max. consecutive timeouts during long running commands"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/dialogs/settings/server.jinja2:2
|
||||
msgid "Commands"
|
||||
msgstr ""
|
||||
|
|
@ -2545,6 +2572,10 @@ msgstr ""
|
|||
msgid "Remember me"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/navbar/login.jinja2:16
|
||||
msgid "User Settings"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/navbar/login.jinja2:17
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
|
@ -2629,7 +2660,7 @@ msgstr ""
|
|||
msgid "Total"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/sidebar/files.jinja2:64
|
||||
#: src/octoprint/templates/sidebar/files.jinja2:67
|
||||
msgid "Hint: You can also drag and drop files on this page to upload them."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -2693,39 +2724,39 @@ msgstr ""
|
|||
msgid "Machine State"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:2
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:3
|
||||
msgid "File"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:7
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:8
|
||||
msgid "Approx. Total Print Time"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:8
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:10
|
||||
msgid "Print Time"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:9
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:11
|
||||
msgid "Print Time Left"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:10
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:12
|
||||
msgid "Printed"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:17
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:22
|
||||
msgid "Restart"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:17
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:22
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:18
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:23
|
||||
msgid "Resume"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:19
|
||||
#: src/octoprint/templates/sidebar/state.jinja2:24
|
||||
msgid "Cancels the print job"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -2803,47 +2834,47 @@ msgstr ""
|
|||
msgid "Fan off"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:14
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:17
|
||||
msgid "Model info"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:21
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:24
|
||||
msgid "Renderer options"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:25
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:28
|
||||
msgid "Sync with job progress"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:30
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:33
|
||||
msgid "Center viewport on model"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:33
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:36
|
||||
msgid "Zoom in on model"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:39
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:42
|
||||
msgid "Show moves"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:42
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:45
|
||||
msgid "Show retracts"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:48
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:51
|
||||
msgid "Also show previous layer"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:51
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:54
|
||||
msgid "Also show next layer"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:56
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:59
|
||||
msgid "Reload"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:62
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:65
|
||||
msgid ""
|
||||
"Note that the time estimates in this tab are calculated by the GCODE "
|
||||
"viewer in your browser and might differ from the values calculated by the"
|
||||
|
|
@ -2851,7 +2882,7 @@ msgid ""
|
|||
"sidebar due to slightly different implementations."
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:67
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:70
|
||||
msgid ""
|
||||
"<p>\n"
|
||||
" You've selected <strong data-bind=\"text: "
|
||||
|
|
@ -2868,7 +2899,7 @@ msgid ""
|
|||
" </p>"
|
||||
msgstr ""
|
||||
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:78
|
||||
#: src/octoprint/templates/tabs/gcodeviewer.jinja2:81
|
||||
#, python-format
|
||||
msgid "Yes, please visualize %(name)s regardless of its size"
|
||||
msgstr ""
|
||||
|
|
|
|||
Loading…
Reference in a new issue