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:
Gina Häußge 2016-07-28 14:54:53 +02:00
commit aae01fe81b
31 changed files with 1395 additions and 621 deletions

View file

@ -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

View file

@ -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

View file

@ -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)!

View file

@ -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

View file

@ -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::

View file

@ -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",

View file

@ -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):

View file

@ -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):
"""

View file

@ -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

View file

@ -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

View file

@ -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"])

View file

@ -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',

View file

@ -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

View 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;
}
};

View file

@ -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"),

View file

@ -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

View file

@ -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) {

View file

@ -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);

View file

@ -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%;
}
}

View file

@ -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>

View file

@ -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>

View file

@ -1,16 +1,21 @@
{{ _('Machine State') }}: <strong data-bind="text: stateString"></strong><br>
<hr>
{{ _('File') }}: <strong data-bind="text: filename, attr: {title: filepath}"></strong>&nbsp;<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">&#9679;</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">

View file

@ -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">

View file

@ -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"

View file

@ -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):

View file

@ -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))

View file

@ -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"

View file

@ -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 ""