Merge commit '3cab8600c80e666139ff83b9f48ac5d8eba5eed4' into devel

This commit is contained in:
thelastWallE 2021-11-21 02:47:51 +01:00
commit 8c2d8d054e
24 changed files with 1588 additions and 919 deletions

View File

@ -1,12 +0,0 @@
name: FakeAction
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Run a one-line script
run: echo ping

View File

@ -9,10 +9,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Close Stale Issues
uses: actions/stale@v3.0.18
uses: actions/stale@v4.0.0
with:
# Token for the repository. Can be passed in using `{{ secrets.GITHUB_TOKEN }}`.
# repo-token: ${{ github.token }}
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
days-before-stale: 30
days-before-close: 5
exempt-all-pr-milestones: true
exempt-all-assignees: true

View File

@ -19,7 +19,7 @@ This plugin assists in managing and monitoring the [Klipper](https://github.com/
- PID Tuning Dialog.
- Dialog to set a coordinate offset for future GCODE move commands.
- Message log displaying messages from Klipper prepended with "//" and "!!".
- Basic Klipper configuration editor
- Klipper configuration editor
- Performance graph displaying key parameters extracted from the Klipper logs.
## Installation
@ -46,7 +46,7 @@ Also for the moment this plugin does what I wanted it to do, it is far from fini
* The [devel](https://github.com/thelastWallE/OctoprintKlipperPlugin/tree/devel) branch is the branch to merge new features and bugfixes to.
* The [rc](https://github.com/thelastWallE/OctoprintKlipperPlugin/tree/rc) branch is for Release Candidates and bugfixing them.
* The [master](https://github.com/thelastWallE/OctoprintKlipperPlugin/tree/master) branch is for Stable Releases.
* The [master](https://github.com/thelastWallE/OctoprintKlipperPlugin/tree/master) branch is for Stable Releases.
## Screenshots

View File

@ -25,7 +25,8 @@ import sys
from octoprint.server import NO_CONTENT
from octoprint.util import is_hidden_path
from octoprint.util import get_formatted_size
from . import util, cfgUtils, logger
from octoprint_klipper import cfgUtils
from octoprint_klipper.util import *
from octoprint.util.comm import parse_firmware_line
from octoprint.access.permissions import Permissions, ADMIN_GROUP
from .modules import KlipperLogAnalyzer
@ -78,7 +79,7 @@ class KlipperPlugin(
self._settings.global_set(
["serial", "additionalPorts"], additional_ports)
self._settings.save()
logger.log_info(
log_info(
self,
"Added klipper serial port {} to list of additional ports.".format(klipper_port)
)
@ -106,10 +107,12 @@ class KlipperPlugin(
]
def get_settings_defaults(self):
# TODO #69 put some settings on the localStorage
return dict(
connection=dict(
port="/tmp/printer",
replace_connection_panel=True
replace_connection_panel=True,
hide_editor_button=False
),
macros=[dict(
name="E-Stop",
@ -130,15 +133,17 @@ class KlipperPlugin(
),
configuration=dict(
debug_logging=False,
configpath="~/",
old_config="",
config_path="~/",
baseconfig="printer.cfg",
logpath="/tmp/klippy.log",
reload_command="RESTART",
restart_onsave=False,
restart_onsave=True,
confirm_reload=True,
shortStatus_navbar=True,
shortStatus_sidebar=True,
parse_check=False,
fontsize=9
fontsize=12,
hide_error_popups=False
)
)
@ -158,7 +163,7 @@ class KlipperPlugin(
return dict(
admin=[
["connection", "port"],
["configuration", "configpath"],
["configuration", "config_path"],
["configuration", "replace_connection_panel"]
],
user=[
@ -170,83 +175,56 @@ class KlipperPlugin(
def get_settings_version(self):
# Settings_Versionhistory:
# 3 = add shortstatus on navbar. migrate the navbar setting for this
# 4 = -change of configpath to only path without filename
# -add setting for restart checkbox on editor save
# 4 = -change of configpath to config_path with only path without filename
# -parse configpath into config_path and baseconfig
# -switch setting for 'restart on editor save' to true if it was not set to manually
# -remove old_config
# -remove config on root settingsdirectory
return 4
#migrate Settings
def on_settings_migrate(self, target, current):
settings = self._settings
if current is None:
self.migrate_old_settings(settings)
migrate_old_settings(settings)
if current is not None and current < 3:
self.migrate_settings_configuration(
settings,
"shortStatus_navbar",
"navbar",
)
self.migrate_settings_3(settings)
if current is not None and current < 4:
self.migrate_settings_configuration(
settings,
"old_config",
"temp_config",
)
self.migrate_settings_4(settings)
def migrate_settings_3(self, settings):
migrate_settings_configuration(
settings,
"shortStatus_navbar",
"navbar",
)
def migrate_settings_4(self, settings):
if settings.has(["configuration", "configpath"]):
cfg_path = settings.get(["configuration", "configpath"])
if cfg_path.find("printer.cfg") != -1:
new_cfg_path = cfg_path.replace("printer.cfg","")
logger.log_info(self, "migrate setting for 'configuration/configpath': " + cfg_path + " -> " + new_cfg_path)
settings.set(["configuration", "configpath"], new_cfg_path)
new_cfg_path, baseconfig = os.path.split(cfg_path)
log_info(self, "migrate setting for 'configuration/config_path': " + cfg_path + " -> " + new_cfg_path)
log_info(self, "migrate setting for 'configuration/baseconfig': printer.cfg -> " + baseconfig)
settings.set(["configuration", "config_path"], new_cfg_path)
settings.set(["configuration", "baseconfig"], baseconfig)
settings.remove(["configuration", "configpath"])
if (
settings.has(["configuration", "reload_command"])
and settings.get(["configuration", "reload_command"]) == "manually"
):
log_info(self, "migrate setting for 'configuration/restart_onsave': True -> False")
settings.set(["configuration", "restart_onsave"], False)
settings.remove(["configuration", "reload_command"])
if settings.get(["configuration", "reload_command"]) != "manually" :
logger.log_info(self, "migrate setting for 'configuration/restart_onsave': False -> True")
settings.set(["configuration", "restart_onsave"], True)
if settings.has(["config"]):
log_info(self, "remove old setting for 'config'")
settings.remove(["config"])
def migrate_old_settings(self, settings):
'''
For Old settings
'''
self.migrate_settings(settings, "serialport", "connection", "port")
self.migrate_settings(settings, "replace_connection_panel", "connection", "replace_connection_panel")
self.migrate_settings(settings, "probeHeight", "probe", "height")
self.migrate_settings(settings, "probeLift", "probe", "lift")
self.migrate_settings(settings, "probeSpeedXy", "probe", "speed_xy")
self.migrate_settings(settings, "probeSpeedZ", "probe", "speed_z")
self.migrate_settings(settings, "configPath", "configuration", "configpath")
if settings.has(["probePoints"]):
points = settings.get(["probePoints"])
points_new = [dict(name="", x=int(p["x"]), y=int(p["y"]), z=0) for p in points]
settings.set(["probe", "points"], points_new)
settings.remove(["probePoints"])
def migrate_settings(self, settings, old, new, new2="") -> None:
"""migrate setting to setting with additional group
Args:
settings (any): instance of self._settings
old (str): the old setting to migrate
new (str): group or only new setting if there is no new2
new2 (str, optional): the new setting to migrate to. Defaults to "".
""" ''''''
if settings.has([old]):
if new2 != "":
logger.log_info(self, "migrate setting for '" + old + "' -> '" + new + "/" + new2 + "'")
settings.set([new, new2], settings.get([old]))
else:
logger.log_info(self, "migrate setting for '" + old + "' -> '" + new + "'")
settings.set([new], settings.get([old]))
settings.remove([old])
def migrate_settings_configuration(self, settings, new, old):
if settings.has(["configuration", old]):
logger.log_info(self, "migrate setting for 'configuration/" + old + "' -> 'configuration/" + new + "'")
settings.set(["configuration", new], settings.get(["configuration", old]))
settings.remove(["configuration", old])
if settings.has(["configuration", "old_config"]):
log_info(self, "remove old setting for 'configuration/old_config'")
settings.remove(["configuration", "old_config"])
# -- Template Plugin
@ -339,43 +317,54 @@ class KlipperPlugin(
def on_event(self, event, payload):
if event == "UserLoggedIn":
util.update_status(self, "info", "Klipper: Standby")
log_info(self, "Klipper: Standby")
if event == "Connecting":
util.update_status(self, "info", "Klipper: Connecting ...")
log_info(self, "Klipper: Connecting ...")
elif event == "Connected":
util.update_status(self, "info", "Klipper: Connected to host")
logger.log_info(
log_info(self, "Klipper: Connected to host")
log_info(
self,
"Connected to host via {} @{}bps".format(payload["port"], payload["baudrate"]))
elif event == "Disconnected":
util.update_status(self, "info", "Klipper: Disconnected from host")
log_info(self, "Klipper: Disconnected from host")
elif event == "Error":
util.update_status(self, "error", "Klipper: Error")
logger.log_error(self, payload["error"])
log_error(self, payload["error"])
def processAtCommand(self, comm_instance, phase, command, parameters, tags=None, *args, **kwargs):
if command != "SWITCHCONFIG":
return
config = parameters
log_info(self, "SWITCHCONFIG detected config:{}".format(config))
return None
# -- GCODE Hook
def process_sent_GCODE(self, comm_instance, phase, cmd, cmd_type, gcode, *args, **kwargs):
if cmd == "SAVE_CONFIG":
log_info(self, "SAVE_CONFIG detected")
send_message(self, type = "reload", subtype = "config")
def on_parse_gcode(self, comm, line, *args, **kwargs):
if "FIRMWARE_VERSION" in line:
printerInfo = parse_firmware_line(line)
if "FIRMWARE_VERSION" in printerInfo:
logger.log_info(self, "Firmware version: {}".format(
log_info(self, "Firmware version: {}".format(
printerInfo["FIRMWARE_VERSION"]))
elif "// probe" in line or "// Failed to verify BLTouch" in line:
msg = line.strip('/')
logger.log_info(self, msg)
log_info(self, msg)
self.write_parsing_response_buffer()
elif "//" in line:
# add lines with // to a buffer
self._message = self._message + line.strip('/')
if not self._parsing_response:
util.update_status(self, "info", self._message)
update_status(self, "info", self._message)
self._parsing_response = True
elif "!!" in line:
msg = line.strip('!')
util.update_status(self, "error", msg)
logger.log_error(self, msg)
log_error(self, msg)
self.write_parsing_response_buffer()
else:
self.write_parsing_response_buffer()
@ -385,7 +374,7 @@ class KlipperPlugin(
# write buffer with // lines after a gcode response without //
if self._parsing_response:
self._parsing_response = False
logger.log_info(self, self._message)
log_info(self, self._message)
self._message = ""
def get_api_commands(self):
@ -400,7 +389,7 @@ class KlipperPlugin(
logpath = os.path.expanduser(
self._settings.get(["configuration", "logpath"])
)
if util.file_exist(self, logpath):
if file_exist(self, logpath):
for f in glob.glob(self._settings.get(["configuration", "logpath"]) + "*"):
filesize = os.path.getsize(f)
filemdate = time.strftime("%d.%m.%Y %H:%M",time.localtime(os.path.getctime(f)))
@ -423,7 +412,7 @@ class KlipperPlugin(
from octoprint.server.util.tornado import LargeResponseHandler, path_validation_factory
from octoprint.util import is_hidden_path
configpath = os.path.expanduser(
self._settings.get(["configuration", "configpath"])
self._settings.get(["configuration", "config_path"])
)
bak_path = os.path.join(self.get_plugin_data_folder(), "configs", "")
@ -468,7 +457,7 @@ class KlipperPlugin(
raise
return NO_CONTENT
# Get a list of all backuped configfiles
# Get a list of all backed up configfiles
@octoprint.plugin.BlueprintPlugin.route("/backup/list", methods=["GET"])
@restricted_access
@Permissions.PLUGIN_KLIPPER_CONFIG.require(403)
@ -476,13 +465,13 @@ class KlipperPlugin(
files = cfgUtils.list_cfg_files(self, "backup")
return flask.jsonify(files = files)
# restore a backuped configfile
# restore a backed up configfile
@octoprint.plugin.BlueprintPlugin.route("/backup/restore/<filename>", methods=["GET"])
@restricted_access
@Permissions.PLUGIN_KLIPPER_CONFIG.require(403)
def restore_backup(self, filename):
configpath = os.path.expanduser(
self._settings.get(["configuration", "configpath"])
self._settings.get(["configuration", "config_path"])
)
data_folder = self.get_plugin_data_folder()
backupfile = os.path.realpath(os.path.join(data_folder, "configs", filename))
@ -495,7 +484,7 @@ class KlipperPlugin(
@Permissions.PLUGIN_KLIPPER_CONFIG.require(403)
def get_config(self, filename):
cfg_path = os.path.expanduser(
self._settings.get(["configuration", "configpath"])
self._settings.get(["configuration", "config_path"])
)
full_path = os.path.realpath(os.path.join(cfg_path, filename))
response = cfgUtils.get_cfg(self, full_path)
@ -507,7 +496,7 @@ class KlipperPlugin(
@Permissions.PLUGIN_KLIPPER_CONFIG.require(403)
def delete_config(self, filename):
cfg_path = os.path.expanduser(
self._settings.get(["configuration", "configpath"])
self._settings.get(["configuration", "config_path"])
)
full_path = os.path.realpath(os.path.join(cfg_path, filename))
if (
@ -528,7 +517,10 @@ class KlipperPlugin(
@Permissions.PLUGIN_KLIPPER_CONFIG.require(403)
def list_configs(self):
files = cfgUtils.list_cfg_files(self, "")
return flask.jsonify(files = files, max_upload_size = MAX_UPLOAD_SIZE)
path = os.path.expanduser(
self._settings.get(["configuration", "config_path"])
)
return flask.jsonify(files = files, path = path, max_upload_size = MAX_UPLOAD_SIZE)
# check syntax of a given data
@octoprint.plugin.BlueprintPlugin.route("/config/check", methods=["POST"])
@ -537,7 +529,7 @@ class KlipperPlugin(
def check_config(self):
data = flask.request.json
data_to_check = data.get("DataToCheck", [])
response = cfgUtils.check_cfg(self, data_to_check)
response = cfgUtils.check_cfg_ok(self, data_to_check)
return flask.jsonify(is_syntax_ok = response)
# save a configfile
@ -555,7 +547,7 @@ class KlipperPlugin(
Filecontent = data.get("DataToSave", [])
saved = cfgUtils.save_cfg(self, Filecontent, filename)
if saved == True:
util.send_message(self, "reload", "configlist", "", "")
send_message(self, type = "reload", subtype = "configlist")
return flask.jsonify(saved = saved)
# restart klipper
@ -569,8 +561,8 @@ class KlipperPlugin(
# Restart klippy to reload config
self._printer.commands(reload_command)
logger.log_info(self, "Restarting Klipper.")
return NO_CONTENT
log_info(self, "Restarting Klipper.")
return flask.jsonify(command = reload_command)
# APIs end
@ -618,6 +610,8 @@ def __plugin_load__():
__plugin_hooks__ = {
"octoprint.server.http.routes": __plugin_implementation__.route_hook,
"octoprint.access.permissions": __plugin_implementation__.get_additional_permissions,
"octoprint.comm.protocol.atcommand.sending": __plugin_implementation__.processAtCommand,
"octoprint.comm.protocol.gcode.sent": __plugin_implementation__.process_sent_GCODE,
"octoprint.comm.protocol.gcode.received": __plugin_implementation__.on_parse_gcode,
"octoprint.plugin.softwareupdate.check_config": __plugin_implementation__.get_update_information
}

View File

@ -1,9 +1,10 @@
from __future__ import absolute_import, division, print_function, unicode_literals
import glob
import os, time, sys
import io
import flask
from . import util, logger
from octoprint_klipper.util import *
from flask_babel import gettext
from shutil import copy, copyfile
@ -15,7 +16,8 @@ except ImportError:
if sys.version_info[0] < 3:
import StringIO
def list_cfg_files(self, path: str) -> list:
def list_cfg_files(self, path):
"""Generate list of config files.
Args:
@ -30,11 +32,11 @@ def list_cfg_files(self, path: str) -> list:
cfg_path = os.path.join(self.get_plugin_data_folder(), "configs", "*")
else:
cfg_path = os.path.expanduser(
self._settings.get(["configuration", "configpath"])
self._settings.get(["configuration", "config_path"])
)
cfg_path = os.path.join(cfg_path, "*.cfg")
cfg_files = glob.glob(cfg_path)
logger.log_debug(self, "list_cfg_files Path: " + cfg_path)
log_debug(self, "list_cfg_files Path: " + cfg_path)
for f in cfg_files:
filesize = os.path.getsize(f)
@ -50,9 +52,10 @@ def list_cfg_files(self, path: str) -> list:
mdate= time.strftime("%d.%m.%Y %H:%M", filemdate),
url= url,
))
logger.log_debug(self, "list_cfg_files " + str(len(files)) + ": " + f)
log_debug(self, "list_cfg_files " + str(len(files)) + ": " + f)
return files
def get_cfg(self, file):
"""Get the content of a configuration file.
@ -71,31 +74,43 @@ def get_cfg(self, file):
cfg_path = os.path.expanduser(
self._settings.get(["configuration", "configpath"])
)
file = os.path.join(cfg_path, "printer.cfg")
if util.file_exist(self, file):
logger.log_debug(self, "get_cfg_files Path: " + file)
file = os.path.join(cfg_path, self._settings.get(["configuration", "baseconfig"]))
if file_exist(self, file):
log_debug(self, "get_cfg_files Path: " + file)
try:
with open(file, "r") as f:
with io.open(file, "r", encoding='utf-8') as f:
response['config'] = f.read()
except IOError as Err:
logger.log_error(
log_error(
self,
"Error: Klipper config file not found at: {}".format(file)
+ "\n IOError: {}".format(Err)
gettext("Error: Klipper config file not found at:")
+ " {}".format(file)
+ "\n"
+ gettext("IOError:") + " {}".format(Err)
)
response['text'] = Err
return response
except UnicodeDecodeError as Err:
log_error(
self,
gettext("Decode Error:")
+"\n"
+ "{}".format(Err)
+ "\n\n"
+ gettext("Please convert your config files to utf-8!")
+ "\n"
+ gettext("Or you can also paste your config \ninto the Editor and save it.")
)
response['text'] = Err
return response
else:
if sys.version_info[0] < 3:
response['config'] = response.config.decode('utf-8')
return response
finally:
f.close()
else:
response['text'] = gettext("File not found!")
return response
def save_cfg(self, content, filename="printer.cfg"):
def save_cfg(self, content, filename):
"""Save the configuration file to given file.
Args:
@ -106,43 +121,35 @@ def save_cfg(self, content, filename="printer.cfg"):
bool: True if the configuration file was saved successfully. Otherwise False
"""
logger.log_debug(
log_debug(
self,
"Save klipper config"
)
if sys.version_info[0] < 3:
content = content.encode('utf-8')
configpath = os.path.expanduser(self._settings.get(["configuration", "configpath"]))
configpath = os.path.expanduser(self._settings.get(["configuration", "config_path"]))
if filename == "":
filename = self._settings.get(["configuration", "baseconfig"])
if filename[-4:] != ".cfg":
filename += ".cfg"
filepath = os.path.join(configpath, filename)
logger.log_debug(self, "save filepath: {}".format(filepath))
self._settings.set(["configuration", "temp_config"], content)
check_parse = self._settings.get(["configuration", "parse_check"])
logger.log_debug(self, "check_parse on filesave: {}".format(check_parse))
if check_parse and not check_cfg(self, content):
return False
log_debug(self, "Writing Klipper config to {}".format(filepath))
try:
logger.log_debug(self, "Writing Klipper config to {}".format(filepath))
with open(filepath, "w") as f:
with io.open(filepath, "w", encoding='utf-8') as f:
f.write(content)
except IOError:
logger.log_error(self, "Error: Couldn't open Klipper config file: {}".format(filepath))
log_error(self, "Error: Couldn't open Klipper config file: {}".format(filepath))
return False
else:
logger.log_debug(self, "Writen Klipper config to {}".format(filepath))
log_debug(self, "Written Klipper config to {}".format(filepath))
return True
finally:
f.close()
copy_cfg_to_backup(self, filepath)
def check_cfg(self, data):
def check_cfg_ok(self, data):
"""Checks the given data on parsing errors.
Args:
@ -161,15 +168,16 @@ def check_cfg(self, data):
dataToValidated.read_string(data)
except configparser.Error as error:
show_error_message(self, error)
logger.log_debug(self, 'check_cfg: NOK!')
log_debug(self, 'check_cfg: NOK!')
return False
else:
if not is_float_ok(self, dataToValidated):
logger.log_debug(self, "check_cfg: NOK!")
log_debug(self, "check_cfg: NOK!")
return False
logger.log_debug(self, "check_cfg: OK")
log_debug(self, "check_cfg: OK")
return True
def show_error_message(self, error):
error.message = error.message.replace('\\n', '')
if sys.version_info[0] < 3:
@ -179,14 +187,11 @@ def show_error_message(self, error):
else:
error.message = error.message.replace('file:', 'Klipper Configuration', 1)
error.message = error.message.replace("'", '', 2)
logger.log_error(
log_error(
self,
('Error: Invalid Klipper config file:\n' + '{}'.format(str(error))),
)
util.send_message(
self, 'PopUp', 'warning', 'Invalid Config data\n', ('\n' + str(error))
)
def is_float_ok(self, dataToValidated):
@ -206,24 +211,25 @@ def is_float_ok(self, dataToValidated):
if dataToValidated.has_option(y, x):
a_float = dataToValidated.getfloat(y, x)
except ValueError as error:
logger.log_error(
log_error(
self,
"Error: Invalid Value for <b>" + x + "</b> in Section: <b>" + y + "</b>\n"
+ "{}".format(str(error))
)
util.send_message(
send_message(
self,
"PopUp",
"warning",
"Invalid Config data\n",
"\n"
+ "Invalid Value for <b>" + x + "</b> in Section: <b>" + y + "</b>\n"
+ "{}".format(str(error))
type = "PopUp",
subtype = "warning",
title = "Invalid Config data\n",
payload = "\n"
+ "Invalid Value for <b>" + x + "</b> in Section: <b>" + y + "</b>\n"
+ "{}".format(str(error))
)
return False
else:
return True
def copy_cfg(self, file, dst):
"""Copy the config file to the destination.
@ -239,13 +245,13 @@ def copy_cfg(self, file, dst):
try:
copy(file, dst)
except IOError:
logger.log_error(
log_error(
self,
"Error: Klipper config file not found at: {}".format(file)
)
return False
else:
logger.log_debug(
log_debug(
self,
"File copied: "
+ file
@ -253,6 +259,7 @@ def copy_cfg(self, file, dst):
return True
return False
def copy_cfg_to_backup(self, src):
"""Copy the config file to backup directory of OctoKlipper.
@ -272,26 +279,23 @@ def copy_cfg_to_backup(self, src):
try:
os.mkdir(cfg_path)
except OSError:
logger.log_error(self, "Error: Creation of the backup directory {} failed".format(cfg_path))
log_error(self, "Error: Creation of the backup directory {} failed".format(cfg_path))
return False
else:
logger.log_debug(self, "Directory {} created".format(cfg_path))
log_debug(self, "Directory {} created".format(cfg_path))
dst = os.path.join(cfg_path, filename)
logger.log_debug(self, "copy_cfg_to_backup:" + src + " to " + dst)
log_debug(self, "copy_cfg_to_backup:" + src + " to " + dst)
if src == dst:
return False
try:
copyfile(src, dst)
except IOError:
logger.log_error(
log_error(
self,
"Error: Couldn't copy Klipper config file to {}".format(dst)
)
return False
else:
logger.log_debug(self, "CfgBackup " + dst + " writen")
log_debug(self, "CfgBackup " + dst + " written")
return True

View File

@ -1,17 +0,0 @@
from . import util
def log_info(self, message):
self._octoklipper_logger.info(message)
util.send_message(self, "log", "info", message, message)
def log_debug(self, message):
self._octoklipper_logger.debug(message)
self._logger.info(message)
# sends a message to frontend(in klipper.js -> self.onDataUpdaterPluginMessage) and write it to the console.
# _mtype, subtype=debug/info, title of message, message)
util.send_message(self, "console", "debug", message, message)
def log_error(self, error):
self._octoklipper_logger.error(error)
self._logger.error(error)
util.send_message(self, "log", "error", error, error)

View File

@ -15,7 +15,7 @@
import flask
import optparse, datetime
from .. import logger
from octoprint_klipper.util import log_error
class KlipperLogAnalyzer():
MAXBANDWIDTH=25000.
@ -82,7 +82,7 @@ class KlipperLogAnalyzer():
out.append(keyparts)
f.close()
except IOError:
logger.log_error(self, "Couldn't open log file: {}".format(logname))
log_error(self, "Couldn't open log file: {}".format(logname))
print("Couldn't open log file")
return out

View File

@ -1,11 +1,13 @@
.plugin-klipper-sidebar {
padding: 1px;
height: auto;
max-height: 100px;
border: 1px solid #aaa;
width: 98%;
text-align: center;
word-break: break-all;
word-break: break-word;
margin: auto;
overflow: auto;
}
li#navbar_plugin_klipper {
@ -97,6 +99,7 @@ ul#klipper-settings {
#tab_plugin_klipper_main #left-side {
flex: 3 1;
padding-right: 10px;
padding-top: 5px;
}
#tab_plugin_klipper_main .span8 label {
@ -196,7 +199,7 @@ div#settings_plugin_klipper form {
}
div#settings_plugin_klipper div.tab-content {
height: calc(100% - 58px);
height: calc(100% - 76px);
overflow: auto;
}
@ -315,8 +318,7 @@ div#settings_plugin_klipper.tab-pane.active form.form-horizontal div.tab-content
vertical-align: -0.2em;
}
div#settings_plugin_klipper.tab-pane.active form.form-horizontal div.tab-content div.tab-pane.active label.inline,
div#klipper_editor .inline {
.klipper-inline {
display: inline;
}
@ -339,10 +341,6 @@ div#settings_plugin_klipper div#macros label.control-label {
padding-top: 2px;
}
#klipper_graph_dialog {
width: 90%;
}
#klipper_graph_dialog .full-sized-box {
width: 100%;
margin: 0 auto;

View File

@ -33,22 +33,58 @@ $(function () {
self.access = parameters[5];
self.shortStatus_navbar = ko.observable();
self.shortStatus_navbar_hover = ko.observable();
self.shortStatus_sidebar = ko.observable();
self.logMessages = ko.observableArray();
self.popup = undefined;
self._showPopup = function (options) {
self._closePopup();
self.popup = new PNotify(options);
};
self._updatePopup = function (options) {
if (self.popup === undefined) {
self._showPopup(options);
} else {
self.popup.update(options);
}
};
self._closePopup = function () {
if (self.popup !== undefined) {
self.popup.remove();
}
};
self.showPopUp = function (popupType, popupTitle, message) {
var title = "OctoKlipper: <br />" + popupTitle + "<br />";
var hide = false;
if (popupType == "success") {
hide = true
}
new PNotify({
var options = undefined;
var errorOpts = {};
options = {
title: title,
text: message,
type: popupType,
hide: hide,
hide: true,
icon: true
});
};
if (popupType == "error") {
errorOpts = {
mouse_reset: true,
delay: 5000,
animation: "none"
};
FullOptions = Object.assign(options, errorOpts);
self._showPopup(FullOptions);
} else {
if (options !== undefined) {
new PNotify(options);
}
}
};
self.showEditorDialog = function () {
@ -92,6 +128,7 @@ $(function () {
var dialog = $("#klipper_graph_dialog");
dialog.modal({
show: "true",
width: "90%",
minHeight: "500px",
maxHeight: "600px",
});
@ -142,40 +179,57 @@ $(function () {
};
self.onDataUpdaterPluginMessage = function (plugin, data) {
if (plugin == "klipper") {
switch (data.type) {
case "PopUp":
self.showPopUp(data.subtype, data.title, data.payload);
break;
case "start":
break;
case "reload":
break;
case "console":
self.consoleMessage(data.subtype, data.payload);
break;
case "status":
if (data.payload.length > 36) {
var shortText = data.payload.substring(0, 31) + " [..]";
self.shortStatus_navbar(shortText);
} else {
self.shortStatus_navbar(data.payload);
}
self.shortStatus_sidebar(data.payload);
self.shortStatus(data.payload, data.subtype);
break;
default:
self.logMessage(data.time, data.subtype, data.payload);
self.shortStatus(data.payload, data.subtype)
self.consoleMessage(data.subtype, data.payload);
}
}
};
self.shortStatus = function(msg, type) {
var baseText = gettext("Go to OctoKlipper Tab");
if (msg.length > 36) {
var shortText = msg.substring(0, 31) + " [..]";
self.shortStatus_navbar(shortText);
self.shortStatus_navbar_hover(msg);
} else {
self.shortStatus_navbar(msg);
self.shortStatus_navbar_hover(baseText);
}
message = msg.replace(/\n/gi, "<br />");
self.shortStatus_sidebar(message);
};
self.logMessage = function (timestamp, type = "info", message) {
if (!timestamp) {
var today = new Date();
var timestamp =
today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
}
if (type == "error" && self.settings.settings.plugins.klipper.configuration.hide_error_popups() !== true) {
self.showPopUp(type, "Error:", message);
}
self.logMessages.push({
time: timestamp,
type: type,
@ -232,23 +286,67 @@ $(function () {
}
};
self.saveOption = function(dir, option, value) {
if (! (_.includes(["fontsize", "confirm_reload", "parse_check"], option)) ) {
return;
}
if (option && dir) {
let data = {
plugins: {
klipper:{
[dir]: {
[option]: value
}
}
}
};
OctoPrint.settings
.save(data);
} else if (option) {
let data = {
plugins: {
klipper:{
[option]: value
}
}
};
OctoPrint.settings
.save(data);
}
}
self.requestRestart = function () {
if (!self.loginState.hasPermission(self.access.permissions.PLUGIN_KLIPPER_CONFIG)) return;
var request = function () {
OctoPrint.plugins.klipper.restartKlipper().done(function () {
self.consoleMessage("debug", "requestRestart");
var request = function (index) {
OctoPrint.plugins.klipper.restartKlipper().done(function (response) {
self.consoleMessage("debug", "restartingKlipper");
self.showPopUp("success", gettext("Restarted Klipper"), "command: " + response.command);
});
if (index == 1) {
self.saveOption("configuration", "confirm_reload", false);
}
};
var html = "<h4>" + gettext("All ongoing Prints will be stopped!") + "</h4>";
var html = "<h4>" +
gettext("All ongoing Prints will be stopped!") +
"</h4>";
showConfirmationDialog({
title: gettext("Klipper restart?"),
html: html,
proceed: gettext("Proceed"),
onproceed: request,
});
if (self.settings.settings.plugins.klipper.configuration.confirm_reload() == true) {
showConfirmationDialog({
title: gettext("Restart Klipper?"),
html: html,
proceed: [gettext("Restart"), gettext("Restart and don't ask this again.")],
onproceed: function (idx) {
if (idx > -1) {
request(idx);
}
},
});
} else {
request(0);
}
};
// OctoKlipper settings link

View File

@ -119,7 +119,7 @@ $(function () {
};
showConfirmationDialog(
_.sprintf(gettext('You are about to delete backuped config file "%(name)s".'), {
_.sprintf(gettext('You are about to delete backed config file "%(name)s".'), {
name: _.escape(backup),
}),
perform
@ -165,7 +165,7 @@ $(function () {
};
showConfirmationDialog(
_.sprintf(gettext("You are about to restore %(count)d backuped config files."), {
_.sprintf(gettext("You are about to restore %(count)d backed config files."), {
count: self.markedForFileRestore().length,
}),
perform
@ -180,7 +180,7 @@ $(function () {
};
showConfirmationDialog(
_.sprintf(gettext("You are about to delete %(count)d backuped config files."), {
_.sprintf(gettext("You are about to delete %(count)d backed config files."), {
count: self.markedForFileRestore().length,
}),
perform
@ -192,7 +192,7 @@ $(function () {
title = gettext("Restoring klipper config files");
self.klipperViewModel.consoleMessage("debug", title);
message = _.sprintf(gettext("Restoring %(count)d backuped config files..."), {
message = _.sprintf(gettext("Restoring %(count)d backed config files..."), {
count: files.length,
});
@ -246,7 +246,7 @@ $(function () {
var title, message, handler;
title = gettext("Deleting backup files");
message = _.sprintf(gettext("Deleting %(count)d backup files..."), {
message = _.sprintf(gettext("Deleting %(count)d backed files..."), {
count: files.length,
});

View File

@ -16,58 +16,77 @@
$(function () {
function KlipperEditorViewModel(parameters) {
var self = this;
var obKlipperConfig = null;
var editor = null;
var editor_dirty = false;
var editordialog = $("#klipper_editor");
self.settings = parameters[0];
self.klipperViewModel = parameters[1];
self.CfgFilename = ko.observable("");
self.CfgContent = ko.observable("");
self.config = []
self.loadedConfig = "";
self.CfgChangedExtern = false;
self.header = OctoPrint.getRequestHeaders({
"content-type": "application/json",
"cache-control": "no-cache",
});
$('#klipper_editor').on('shown.bs.modal', function () {
editor.focus();
self.setEditorDivSize();
$(window).on('resize', function(){
self.klipperViewModel.sleep(500).then(
function () {
self.setEditorDivSize();
}
);
});
$(window).on('resize', function() {
self.klipperViewModel.sleep(200).then(
function () {
self.setEditorDivSize();
}
);
});
self.closeEditor = function () {
if (editor_dirty===true) {
showConfirmationDialog({
message: gettext(
"Your file seems to have changed."
),
question: gettext("Do you really want to close it?"),
cancel: gettext("No"),
proceed: gettext("Yes"),
onproceed: function () {
var dialog = $("#klipper_editor");
dialog.modal('hide');
},
nofade: true
});
} else {
var dialog = $("#klipper_editor");
dialog.modal('hide');
self.onShown = function () {
self.checkExternChange();
editor.focus();
self.setEditorDivSize();
};
self.close_selection = function (index) {
switch (index) {
case 0:
editordialog.modal('hide');
break;
case 1:
self.editorFocusDelay(1000);
break;
case 2:
self.saveCfg({closing: true});
break;
}
}
};
self.closeEditor = function () {
self.CfgContent(editor.getValue());
if (self.loadedConfig != self.CfgContent()) {
var opts = {
title: gettext("Closing without saving"),
message: gettext("Your file seems to have changed.")
+ "<br />"
+ gettext("Do you really want to close it?"),
selections: [gettext("Close"), gettext("Do not close"), gettext("Save & Close")],
maycancel: false,
onselect: function (index) {
if (index > -1) {
self.close_selection(index);
}
},
};
showSelectionDialog(opts);
} else {
editordialog.modal('hide');
}
};
self.addStyleAttribute = function ($element, styleAttribute) {
$element.attr('style', $element.attr('style') + '; ' + styleAttribute);
}
$element.attr('style', styleAttribute);
};
self.setEditorDivSize = function () {
var klipper_modal_body= $('#klipper_editor .modal-body');
@ -75,24 +94,23 @@ $(function () {
var height = $(window).height() - $('#klipper_editor .modal-header').outerHeight() - $('#klipper_editor .modal-footer').outerHeight() - 118;
self.addStyleAttribute(klipper_modal_body, 'height: ' + height + 'px !important;');
//self.addStyleAttribute(klipper_config, 'height: ' + height + 'px !important;');
klipper_config.css('height', height);
if (editor) {
editor.resize();
}
};
//initialize the modal window and return done when finished
self.process = function (config) {
return new Promise(function (resolve) {
self.config = config;
self.loadedConfig = config.content;
self.CfgFilename(config.file);
self.CfgContent(config.content);
if (editor) {
editor.session.setValue(self.CfgContent());
editor_dirty=false;
self.CfgChangedExtern = false;
editor.setFontSize(self.settings.settings.plugins.klipper.configuration.fontsize());
self.settings.settings.plugins.klipper.configuration.old_config(config.content);
editor.clearSelection();
self.klipperViewModel.sleep(500).then(
function() {
@ -102,56 +120,141 @@ $(function () {
);
}
});
}
self.checkSyntax = function () {
if (editor.session) {
self.klipperViewModel.consoleMessage("debug", "checkSyntax started");
OctoPrint.plugins.klipper.checkCfg(editor.session.getValue())
.done(function (response) {
var msg = ""
if (response.is_syntax_ok == true) {
self.klipperViewModel.showPopUp("success", gettext("SyntaxCheck"), gettext("SyntaxCheck OK"));
self.editorFocusDelay(1000);
} else {
msg = gettext('Syntax NOK')
showMessageDialog(
msg,
{
title: gettext("SyntaxCheck"),
onclose: function () { self.editorFocusDelay(1000); }
}
);
}
});
};
};
self.saveCfg = function () {
if (editor.session) {
self.klipperViewModel.consoleMessage("debug", "SaveCfg start");
self.onDataUpdaterPluginMessage = function (plugin, data) {
//receive from backend after a SAVE_CONFIG
if (plugin == "klipper" && data.type == "reload" && data.subtype == "config") {
self.klipperViewModel.consoleMessage("debug", "onDataUpdaterPluginMessage klipper reload baseconfig");
self.ConfigChangedAfterSave_Config();
}
};
OctoPrint.plugins.klipper.saveCfg(editor.session.getValue(), self.CfgFilename())
.done(function (response) {
var msg = ""
if (response.saved === true) {
self.klipperViewModel.showPopUp("success", gettext("Save Config"), gettext("File saved."));
editor_dirty = false;
if (self.settings.settings.plugins.klipper.configuration.restart_onsave()==true) {
self.klipperViewModel.requestRestart();
}
} else {
msg = gettext('File not saved!')
showMessageDialog(
msg,
{
title: gettext("Save Config"),
onclose: function () { self.editorFocusDelay(1000); }
}
)
}
//set externally changed config flag if the current file is the base config
self.ConfigChangedAfterSave_Config = function () {
if (!self.klipperViewModel.hasRight("CONFIG")) return;
if (self.CfgFilename() == self.settings.settings.plugins.klipper.configuration.baseconfig()) {
self.CfgChangedExtern = true;
self.checkExternChange();
}
};
//check if the config was externally changed and ask for a reload
self.checkExternChange = function() {
var baseconfig = self.settings.settings.plugins.klipper.configuration.baseconfig();
if (self.CfgChangedExtern && self.CfgFilename() == baseconfig) {
if (editordialog.is(":visible")) {
var perform = function () {
self.reloadFromFile();
}
var html = "<p>" + gettext("Reload Configfile after SAVE_CONFIG?") + "</p>";
showConfirmationDialog({
title: gettext("Externally changed config") + " " + baseconfig,
html: html,
proceed: gettext("Proceed"),
onproceed: perform,
});
}
}
};
self.askSaveFaulty = function () {
return new Promise(function (resolve) {
var html = "<h5>" +
gettext("Your configuration seems to be faulty.") +
"</h5>";
showConfirmationDialog({
title: gettext("Save faulty Configuration?"),
html: html,
cancel: gettext("Do not save!"),
proceed: [gettext("Save anyway!"), gettext("Save anyway and don't ask this again.")],
onproceed: function (idx) {
if (idx == 0) {
resolve(true);
} else {
self.klipperViewModel.saveOption("configuration", "parse_check", false);
resolve(true);
}
},
oncancel: function () {
resolve(false);
}
});
});
};
self.checkSyntax = function () {
return new Promise((resolve, reject) => {
if (editor.session) {
self.klipperViewModel.consoleMessage("debug", "checkSyntax started");
OctoPrint.plugins.klipper.checkCfg(editor.session.getValue())
.done(function (response) {
if (response.is_syntax_ok == true) {
self.klipperViewModel.showPopUp("success", gettext("SyntaxCheck"), gettext("SyntaxCheck OK"));
self.editorFocusDelay(1000);
resolve(true);
} else {
self.editorFocusDelay(1000);
resolve(false);
}
})
.fail(function () {
reject(false);
});
} else { reject(false); }
});
};
self.saveCfg = function (options) {
var options = options || {};
var closing = options.closing || false;
if (self.CfgFilename() != "") {
if (editor.session) {
if (self.settings.settings.plugins.klipper.configuration.parse_check() == true) {
// check Syntax and wait for response
self.checkSyntax().then((syntaxOK) => {
if (syntaxOK === false) {
// Ask if we should save a faulty config anyway
self.askSaveFaulty().then((areWeSaving) => {
if (areWeSaving === false) {
// Not saving
showMessageDialog(
gettext('Faulty config not saved!'),
{
title: gettext("Save Config"),
onclose: function () { self.editorFocusDelay(1000); }
}
);
} else {
// Save anyway
self.saveRequest(closing);
}
});
} else {
// Syntax is ok
self.saveRequest(closing);
}
});
} else {
self.saveRequest(closing);
}
}
} else {
showMessageDialog(
gettext("No filename set"),
{
title: gettext("Save Config")
}
);
}
};
@ -159,82 +262,78 @@ $(function () {
self.settings.settings.plugins.klipper.configuration.fontsize(
self.settings.settings.plugins.klipper.configuration.fontsize() - 1
);
if (self.settings.settings.plugins.klipper.configuration.fontsize() < 9) {
self.settings.settings.plugins.klipper.configuration.fontsize(9);
}
var fontsize = self.settings.settings.plugins.klipper.configuration.fontsize();
if (editor) {
editor.setFontSize(
self.settings.settings.plugins.klipper.configuration.fontsize()
);
editor.setFontSize(fontsize);
editor.resize();
}
self.klipperViewModel.saveOption("configuration", "fontsize", fontsize);
};
self.plusFontsize = function () {
self.settings.settings.plugins.klipper.configuration.fontsize(
self.settings.settings.plugins.klipper.configuration.fontsize() + 1
);
if (self.settings.settings.plugins.klipper.configuration.fontsize() > 20) {
self.settings.settings.plugins.klipper.configuration.fontsize(20);
}
var fontsize = self.settings.settings.plugins.klipper.configuration.fontsize();
if (editor) {
editor.setFontSize(
self.settings.settings.plugins.klipper.configuration.fontsize()
);
editor.setFontSize(fontsize);
editor.resize();
}
};
self.loadLastSession = function () {
if (self.settings.settings.plugins.klipper.configuration.old_config() != "") {
self.klipperViewModel.consoleMessage(
"info",
"lastSession:" +
self.settings.settings.plugins.klipper.configuration.old_config()
);
if (editor.session) {
editor.session.setValue(
self.settings.settings.plugins.klipper.configuration.old_config()
);
editor.clearSelection();
}
}
self.klipperViewModel.saveOption("configuration", "fontsize", fontsize);
};
self.reloadFromFile = function () {
OctoPrint.plugins.klipper.getCfg(self.CfgFilename())
if (self.CfgFilename() != "") {
OctoPrint.plugins.klipper.getCfg(self.CfgFilename())
.done(function (response) {
self.klipperViewModel.consoleMessage("debug", "reloadFromFile done");
if (response.response.text != "") {
var msg = response.response.text
showMessageDialog(
msg,
response.response.text,
{
title: gettext("Reload File")
}
)
);
} else {
self.klipperViewModel.showPopUp("success", gettext("Reload Config"), gettext("File reloaded."));
self.CfgChangedExtern = false;
if (editor) {
editor.session.setValue(response.response.config);
self.loadedConfig = response.response.config;
editor.clearSelection();
editor.focus();
}
}
})
.fail(function (response) {
var msg = response
showMessageDialog(
msg,
response,
{
title: gettext("Reload File")
}
)
);
});
} else {
showMessageDialog(
gettext("No filename set"),
{
title: gettext("Reload File")
}
);
}
};
self.onStartup = function () {
ace.config.set("basePath", "plugin/klipper/static/js/lib/ace/");
editor = ace.edit("plugin-klipper-config");
@ -252,7 +351,6 @@ $(function () {
editor.session.on('change', function (delta) {
self.CfgContent(editor.getValue());
editor_dirty = true;
editor.resize();
});
};
@ -264,6 +362,32 @@ $(function () {
}
);
};
self.saveRequest = function (closing) {
self.klipperViewModel.consoleMessage("debug", "SaveCfg start");
OctoPrint.plugins.klipper.saveCfg(editor.session.getValue(), self.CfgFilename())
.done(function (response) {
if (response.saved === true) {
self.klipperViewModel.showPopUp("success", gettext("Save Config"), gettext("File saved."));
self.loadedConfig = editor.session.getValue(); //set loaded config to current for resetting dirtyEditor
if (closing) {
editordialog.modal('hide');
}
if (self.settings.settings.plugins.klipper.configuration.restart_onsave() == true) {
self.klipperViewModel.requestRestart();
}
} else {
showMessageDialog(
gettext('File not saved!'),
{
title: gettext("Save Config"),
onclose: function () { self.editorFocusDelay(1000); }
}
);
}
});
};
}
OCTOPRINT_VIEWMODELS.push({

View File

@ -30,6 +30,11 @@ $(function () {
});
self.markedForFileRemove = ko.observableArray([]);
self.PathToConfigs = ko.observable("");
$(document).on('shown.bs.modal','#klipper_editor', function () {
self.klipperEditorViewModel.onShown();
});
self.checkFontsize = function () {
if (self.settings.settings.plugins.klipper.configuration.fontsize() > 20) {
@ -80,6 +85,7 @@ $(function () {
OctoPrint.plugins.klipper.listCfg().done(function (response) {
self.klipperViewModel.consoleMessage("debug", "listCfgFiles done");
self.configs.updateItems(response.files);
self.PathToConfigs(gettext("Path: ") + response.path);
self.configs.resetPage();
});
};
@ -87,13 +93,17 @@ $(function () {
self.loadBaseConfig = function () {
if (!self.klipperViewModel.hasRight("CONFIG")) return;
OctoPrint.plugins.klipper.getCfg("printer.cfg").done(function (response) {
var config = {
content: response.response.config,
file: "printer.cfg",
};
self.klipperEditorViewModel.process(config).then();
});
var baseconfig = self.settings.settings.plugins.klipper.configuration.baseconfig();
if (baseconfig != "") {
self.klipperViewModel.consoleMessage("debug", "loadBaseConfig:" + baseconfig);
OctoPrint.plugins.klipper.getCfg(baseconfig).done(function (response) {
var config = {
content: response.response.config,
file: baseconfig,
};
self.klipperEditorViewModel.process(config).then();
});
}
};
self.removeCfg = function (config) {
@ -245,8 +255,6 @@ $(function () {
self.klipperEditorViewModel.process(config).then(
function() { self.showEditor(); }
);
});
};
@ -312,21 +320,8 @@ $(function () {
if (plugin == "klipper" && data.type == "reload" && data.subtype == "configlist") {
self.klipperViewModel.consoleMessage("debug", "onDataUpdaterPluginMessage klipper reload configlist");
self.listCfgFiles();
} else if (plugin == "klipper" && data.type == "start" && data.subtype == "config") {
self.klipperViewModel.consoleMessage("debug", "onDataUpdaterPluginMessage klipper start config");
self.startConfig(data.title, data.payload);
}
};
self.startConfig = function (file, content) {
if (!self.klipperViewModel.hasRight("CONFIG")) return;
filename = file || "";
var config = {
content: content,
file: filename,
};
self.klipperEditorViewModel.process(config).then();
};
}
OCTOPRINT_VIEWMODELS.push({

View File

@ -31,14 +31,14 @@
<button class="btn btn-small" data-bind="click: reloadFromFile" title="{{ _('Reload from file') }}">
<i class="fas fa-upload"></i> {{ _('Reload from file') }}
</button>
<button class="btn btn-small" data-bind="click: loadLastSession" title="{{ _('Reload last version') }}">
<i class="fas fa-redo"></i> {{ _('Reload last version') }}
</button>
<button class="btn btn-small" data-bind="click: checkSyntax" title="{{ _('Check Syntax') }}">
<i class="fas fa-spell-check"></i> {{ _('Check Syntax') }}
</button>
<button class="btn btn-small" data-bind="click: function() { $root.saveCfg({closing: true}) }" title="{{ _('Save Config and Close') }}">
<i class="fas fa-save"></i> {{ _('Save & Close') }}
</button>
<button class="btn btn-small" data-bind="click: saveCfg" title="{{ _('Save Config') }}">
<i class="fas fa-save"></i> {{ _('Save Config') }}
<i class="fas fa-save"></i> {{ _('Save') }}
</button>
</div>
</div>

View File

@ -1,3 +1,3 @@
<!-- ko if: settings.settings.plugins.klipper.configuration.shortStatus_navbar -->
<a title="{{ _('Go to OctoKlipper Tab') }}" data-bind="text: shortStatus_navbar, click: navbarClicked"></a>
<a data-bind="attr: { title: shortStatus_navbar_hover }, text: shortStatus_navbar, click: navbarClicked"></a>
<!-- /ko -->

View File

@ -21,6 +21,13 @@
data-bind="checked: settings.settings.plugins.klipper.connection.replace_connection_panel">
</div>
</div>
<div class="control-group">
<label class="control-label">{{ _('Hide \'Open Editor\' Button\nin the Connection Panel') }}</label>
<div class="controls">
<input class="controls-checkbox" title="{{ _('Hide \'Open Editor\' Button\nin the Connection Panel') }}" type="checkbox"
data-bind="checked: settings.settings.plugins.klipper.connection.hide_editor_button">
</div>
</div>
<div class="control-group border">
<label class="control-label">{{ _('Show Short Messages') }}</label>
<div class="controls">
@ -37,6 +44,13 @@
data-bind="checked: settings.settings.plugins.klipper.configuration.debug_logging" />
</div>
</div>
<div class="control-group">
<label class="control-label">{{ _('Hide Error PopUps') }}</label>
<div class="controls">
<input class="controls-checkbox" title="{{ _('Hide Error PopUps') }}" type="checkbox"
data-bind="checked: settings.settings.plugins.klipper.configuration.hide_error_popups" />
</div>
</div>
<div class="control-group border">
<label class="control-label">{{ _('Config Editor') }}</label>
<div class="controls">
@ -52,7 +66,13 @@
<div class="control-group">
<label class="control-label">{{ _('Klipper Config Directory') }}</label>
<div class="controls">
<input type="text" class="input-block-level" data-bind="value: settings.settings.plugins.klipper.configuration.configpath" />
<input type="text" class="input-block-level" data-bind="value: settings.settings.plugins.klipper.configuration.config_path" />
</div>
</div>
<div class="control-group">
<label class="control-label" title="{{ _('The filename of the base config that Klipper is loading. (default is printer.cfg)') }}">{{ _('Klipper Base Config Filename') }}</label>
<div class="controls">
<input type="text" class="input-block-level" data-bind="value: settings.settings.plugins.klipper.configuration.baseconfig" />
</div>
</div>
<div class="control-group">
@ -62,7 +82,7 @@
</div>
</div>
<div class="control-group border">
<label class="control-label">{{ _('Configuration Reload Command') }}</label>
<label class="control-label">{{ _('Configuration Restart Command') }}</label>
<div class="controls">
<select data-bind="value: settings.settings.plugins.klipper.configuration.reload_command">
<option value="RESTART">RESTART</option>
@ -71,8 +91,11 @@
<span class="help-block" style="margin-top:5px;">
{{ _('The command that is executed if you want to restart klipper.') }}
</span>
<label class="checkbox" title="{{ _('Reload klipper on editor save?') }}"><input type="checkbox"
data-bind="checked: settings.settings.plugins.klipper.configuration.restart_onsave" /> {{ _('Reload klipper on editor save?') }}
<label class="checkbox" title="{{ _('Restart klipper on editor save?') }}"><input type="checkbox"
data-bind="checked: settings.settings.plugins.klipper.configuration.restart_onsave" /> {{ _('Restart Klipper on editor save?') }}
</label>
<label class="checkbox" title="{{ _('Show Confirmation before restarting Klipper?') }}"><input type="checkbox"
data-bind="checked: settings.settings.plugins.klipper.configuration.confirm_reload" /> {{ _('Confirmation before restarting Klipper?') }}
</label>
</div>
</div>
@ -87,6 +110,12 @@
</div>
<!-- Macros -->
<div class="tab-pane" id="macros">
<div class="control-group">
<span class="help-block">
{{ _('These macros are only meant to be used in OctoPrint.') }}
{{ _('They are not the ones that can be defined in the printer.cfg.') }}<br />
</span>
</div>
<div class="control-group" style="margin-bottom: 0px;">
<div class="controls" style="margin-left: 82px;">
<div class="row-fluid">
@ -151,9 +180,7 @@
<div class="tab-pane" id="level">
<div class="control-group">
<span class="help-block">
{{ _('This feature assists in manually leveling you print bed by moving the head to the defined points in
sequence.<br />
If you use a piece of paper for leveling, set "Probe Height" to the paper thickness eg. "0.1".') }}
{{ _('This feature assists in manually leveling your print bed by moving the head to the defined points in sequence.<br />If you use a piece of paper for leveling, set "Probe Height" to the paper thickness eg. "0.1".') }}
</span>
</div>
<div class="control-group">
@ -253,7 +280,8 @@
<i class="icon-refresh"></i> {{ _('Refresh Files') }}
</button>
<button class="btn btn-small"
data-bind="click: removeMarkedFiles, enable: markedForFileRemove().length > 0">{{ _('Delete selected') }}</button>
data-bind="click: removeMarkedFiles, enable: markedForFileRemove().length > 0">{{ _('Delete selected') }}
</button>
</div>
<div class="pull-right">
<div class="btn-group">
@ -272,6 +300,7 @@
</div>
</div>
</div>
<p class="klipper-inline" data-bind="text: PathToConfigs" title="{{ _('Path to the config files.')}}"></p>
<div class="scroll-y">
<table class="table table-striped table-hover table-condensed table-hover table-fixed" id="klipper_cfg_files">
<thead>

View File

@ -3,12 +3,16 @@
<label for="connection_printers" data-bind="css: {disabled: !connectionState.isErrorOrClosed()}, enable: connectionState.isErrorOrClosed() && loginState.isUser()">{{ _('Printer Profile') }}</label>
<select id="connection_printers" data-bind="options: connectionState.printerOptions, optionsText: 'name', optionsValue: 'id', value: connectionState.selectedPrinter, css: {disabled: !connectionState.isErrorOrClosed()}, enable: connectionState.isErrorOrClosed() && loginState.isUser()"></select>
<button class="btn btn-block" data-bind="click: connectionState.connect, text: connectionState.buttonText(), enable: loginState.isUser()">{{ _('Connect') }}</button>
<button class="btn btn-block" title="{{ _('Open Editor') }}" data-bind="visible: $root.loginState.hasPermissionKo($root.access.permissions.PLUGIN_KLIPPER_CONFIG), click: showEditorDialog">{{ _('Open Editor') }}</button>
</div>
<!-- ko ifnot: settings.settings.plugins.klipper.connection.hide_editor_button -->
<button class="btn btn-block" title="{{ _('Open Editor') }}" data-bind="visible: $root.loginState.hasPermissionKo($root.access.permissions.PLUGIN_KLIPPER_CONFIG), click: showEditorDialog">{{ _('Open Editor') }}</button>
<!-- /ko -->
</div>
</div>
<!-- ko if: settings.settings.plugins.klipper.configuration.shortStatus_sidebar -->
<div class="plugin-klipper-sidebar">
<a title="{{ _('Go to OctoKlipper Tab') }}" data-bind="text: shortStatus_sidebar, click: navbarClicked"></a>
<div id="shortStatus_SideBar" class="plugin-klipper-sidebar">
<a title="{{ _('Go to OctoKlipper Tab') }}" data-bind="click: navbarClicked">
<div data-bind="html: shortStatus_sidebar" class="msg"></div>
</a>
</div>
<!-- /ko -->
<div class="control-group" data-bind="visible: $root.loginState.hasPermissionKo($root.access.permissions.PLUGIN_KLIPPER_MACRO)">

View File

@ -1,6 +1,11 @@
<div class="row-fluid">
<div id="left-side">
<label> <i class="icon-tasks"></i> {{ _("Messages") }} </label>
<label class="klipper-inline"> <i class="icon-tasks"></i> {{ _("Messages") }} </label>
<button class="btn btn-small pull-right"
data-bind="visible: $root.loginState.hasPermissionKo($root.access.permissions.PLUGIN_KLIPPER_CONFIG), click: openOctoKlipperSettings('klipper-basic')"
title="{{ _('Open the OctoKlipper Settings') }}">
<i class="fa icon-black fa-wrench"></i>
</button>
<div class="plugin-klipper-log" data-bind="foreach: logMessages">
<div class="log-item" data-bind="css: type">
<div data-bind="text: time" class="ts"></div>
@ -21,11 +26,6 @@
title="{{ _('Query Klipper for its current status') }}">
<i class="fa icon-black fa-info-circle"></i> {{ _("Get Status") }}
</button>
<button class="btn btn-block btn-small"
data-bind="visible: $root.loginState.hasPermissionKo($root.access.permissions.PLUGIN_KLIPPER_CONFIG), click: openOctoKlipperSettings('klipper-basic')"
title="{{ _('Open the OctoKlipper Settings') }}">
{{ _("Open OctoKlipper Settings") }}
</button>
<button class="btn btn-block btn-small"
data-bind="visible: $root.loginState.hasPermissionKo($root.access.permissions.PLUGIN_KLIPPER_CONFIG), click: showEditorDialog"
title="{{ _('Show the Editor') }}">

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: OctoKlipper 0.3.8.2\n"
"Report-Msgid-Bugs-To: i18n@octoprint.org\n"
"POT-Creation-Date: 2021-09-17 08:18+0200\n"
"POT-Creation-Date: 2021-11-21 00:46+0100\n"
"PO-Revision-Date: 2021-05-13 17:32+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de\n"
@ -27,37 +27,74 @@ msgstr "Erlaubt Klipper zu konfigurieren"
msgid "Allows to use klipper macros"
msgstr "Erlaubt Makros zu benutzen"
#: octoprint_klipper/__init__.py:608
#: octoprint_klipper/__init__.py:599
msgid "Restart Klipper"
msgstr "Neustart Klipper"
msgstr "Klipper Neustart"
#: octoprint_klipper/__init__.py:609
#: octoprint_klipper/__init__.py:600
msgid "You are about to restart Klipper!"
msgstr "Sie sind dabei Klipper neuzustarten!"
msgstr "Sie sind dabei Klipper neu zu starten!"
#: octoprint_klipper/__init__.py:609
#: octoprint_klipper/__init__.py:600
msgid "This will stop ongoing prints!"
msgstr "Dies wird angehende Aufträge abbrechen!"
msgstr "Dies wird laufende Aufträge abbrechen!"
#: octoprint_klipper/cfgUtils.py:95
#: octoprint_klipper/cfgUtils.py:86
msgid "Error: Klipper config file not found at:"
msgstr "Fehler: Klipper Konfigurationsdatei nicht gefunden:"
#: octoprint_klipper/cfgUtils.py:89
msgid "IOError:"
msgstr "IOFehler"
#: octoprint_klipper/cfgUtils.py:96
msgid "Decode Error:"
msgstr "Dekodierungsfehler:"
#: octoprint_klipper/cfgUtils.py:100
msgid "Please convert your config files to utf-8!"
msgstr "Bitte die Konfigurationsdateien nach utf-8 konvertieren!"
#: octoprint_klipper/cfgUtils.py:102
msgid ""
"Or you can also paste your config \n"
"into the Editor and save it."
msgstr ""
"Sie können auch die Konfiguration \n"
"in den Editor einfügen und dann speichern."
#: octoprint_klipper/cfgUtils.py:109
msgid "File not found!"
msgstr "Datei nicht gefunden!"
#: octoprint_klipper/static/js/klipper.js:259
#: octoprint_klipper/static/js/klipper.js:220
#: octoprint_klipper/templates/klipper_sidebar.jinja2:13
msgid "Go to OctoKlipper Tab"
msgstr "Gehe zum OctoKlipper Reiter"
#: octoprint_klipper/static/js/klipper.js:340
msgid "Restarted Klipper"
msgstr "Klipper neu gestartet"
#: octoprint_klipper/static/js/klipper.js:348
msgid "All ongoing Prints will be stopped!"
msgstr "Alle laufende Drucke werden gestoppt!"
#: octoprint_klipper/static/js/klipper.js:262
msgid "Klipper restart?"
msgstr "Klipper neustarten?"
#: octoprint_klipper/static/js/klipper.js:353
msgid "Restart Klipper?"
msgstr "Klipper neu starten?"
#: octoprint_klipper/static/js/klipper.js:264
#: octoprint_klipper/static/js/klipper_backup.js:159
msgid "Proceed"
msgstr "Weiter"
#: octoprint_klipper/static/js/klipper.js:355
#: octoprint_klipper/templates/klipper_tab_main.jinja2:39
msgid "Restart"
msgstr "Neustart"
#: octoprint_klipper/static/js/klipper.js:355
msgid "Restart and don't ask this again."
msgstr "Neu starten und dies nicht wieder nachfragen."
#: octoprint_klipper/static/js/klipper_backup.js:126
#: octoprint_klipper/static/js/klipper_settings.js:124
#: octoprint_klipper/static/js/klipper_settings.js:134
#, python-format
msgid ""
"Failed to remove config %(name)s.</p><p>Please consult octoprint.log for "
@ -67,13 +104,13 @@ msgstr ""
"nachsehen für weitere Details.</p>"
#: octoprint_klipper/static/js/klipper_backup.js:129
#: octoprint_klipper/static/js/klipper_settings.js:127
#: octoprint_klipper/static/js/klipper_settings.js:137
msgid "Could not remove config"
msgstr "Konnte Konfiguration nicht löschen"
#: octoprint_klipper/static/js/klipper_backup.js:138
#, python-format
msgid "You are about to delete backuped config file \"%(name)s\"."
msgid "You are about to delete backed config file \"%(name)s\"."
msgstr "Sie sind dabei die gesicherte Konfigurationsdatei \"%(name)s\" zu löschen."
#: octoprint_klipper/static/js/klipper_backup.js:154
@ -86,16 +123,21 @@ msgstr ""
msgid "Are you sure you want to restore now?"
msgstr "Sind sie sicher jetzt wiederherzustellen?"
#: octoprint_klipper/static/js/klipper_backup.js:159
#: octoprint_klipper/static/js/klipper_editor.js:173
msgid "Proceed"
msgstr "Weiter"
#: octoprint_klipper/static/js/klipper_backup.js:184
#, python-format
msgid "You are about to restore %(count)d backuped config files."
msgid "You are about to restore %(count)d backed config files."
msgstr ""
"Sie sind dabei %(count)d gesicherte Konfigurationsdateien "
"wiederherzustellen."
#: octoprint_klipper/static/js/klipper_backup.js:199
#, python-format
msgid "You are about to delete %(count)d backuped config files."
msgid "You are about to delete %(count)d backed config files."
msgstr "Sie sind dabei %(count)d gesicherte Konfigurationsdateien zu löschen."
#: octoprint_klipper/static/js/klipper_backup.js:209
@ -104,7 +146,7 @@ msgstr "Stelle Klipper Konfigdatei wieder her"
#: octoprint_klipper/static/js/klipper_backup.js:211
#, python-format
msgid "Restoring %(count)d backuped config files..."
msgid "Restoring %(count)d backed config files..."
msgstr "Stelle %(count)d gesicherte Konfigurationsdateien wieder her."
#: octoprint_klipper/static/js/klipper_backup.js:220
@ -123,95 +165,141 @@ msgstr "Lösche gesicherte Dateien"
#: octoprint_klipper/static/js/klipper_backup.js:265
#, python-format
msgid "Deleting %(count)d backup files..."
msgid "Deleting %(count)d backed files..."
msgstr "Lösche %(count)d gesicherte Konfigurationsdateien..."
#: octoprint_klipper/static/js/klipper_backup.js:273
#: octoprint_klipper/static/js/klipper_settings.js:183
#: octoprint_klipper/static/js/klipper_settings.js:193
#, python-format
msgid "Deleted %(filename)s..."
msgstr "%(filename)s gelöscht..."
#: octoprint_klipper/static/js/klipper_backup.js:279
#: octoprint_klipper/static/js/klipper_settings.js:193
#: octoprint_klipper/static/js/klipper_settings.js:203
#, python-format
msgid "Deleting of %(filename)s failed, continuing..."
msgstr "Löschung von Datei %(filename)s gescheitert, setze fort... "
#: octoprint_klipper/static/js/klipper_editor.js:61
#: octoprint_klipper/static/js/klipper_editor.js:79
msgid "Closing without saving"
msgstr "Schließen ohne zu Speichern?"
#: octoprint_klipper/static/js/klipper_editor.js:80
msgid "Your file seems to have changed."
msgstr "Datei scheint geändert worden zu sein."
#: octoprint_klipper/static/js/klipper_editor.js:64
#: octoprint_klipper/static/js/klipper_editor.js:82
msgid "Do you really want to close it?"
msgstr "Wollen sie wirklich schliessen?"
msgstr "Wollen sie wirklich schließen?"
#: octoprint_klipper/static/js/klipper_editor.js:65
msgid "No"
msgstr "Nein"
#: octoprint_klipper/static/js/klipper_editor.js:83
#: octoprint_klipper/templates/klipper_graph_dialog.jinja2:27
msgid "Close"
msgstr "Schließen"
#: octoprint_klipper/static/js/klipper_editor.js:66
msgid "Yes"
msgstr "Ja"
#: octoprint_klipper/static/js/klipper_editor.js:83
msgid "Do not close"
msgstr "Nicht schließen"
#: octoprint_klipper/static/js/klipper_editor.js:127
#: octoprint_klipper/static/js/klipper_editor.js:134
#: octoprint_klipper/static/js/klipper_editor.js:83
#: octoprint_klipper/templates/klipper_editor.jinja2:38
msgid "Save & Close"
msgstr "Speichern & Schließen"
#: octoprint_klipper/static/js/klipper_editor.js:168
msgid "Reload Configfile after SAVE_CONFIG?"
msgstr "Konfiguration neuladen nach SAVE_CONFIG?"
#: octoprint_klipper/static/js/klipper_editor.js:171
msgid "Externally changed config"
msgstr "Extern geänderte Konfiguration"
#: octoprint_klipper/static/js/klipper_editor.js:183
msgid "Your configuration seems to be faulty."
msgstr "Ihre Konfiguration sieht fehlerhaft aus."
#: octoprint_klipper/static/js/klipper_editor.js:187
msgid "Save faulty Configuration?"
msgstr "Speichere fehlerhafte Konfiguration?"
#: octoprint_klipper/static/js/klipper_editor.js:189
msgid "Do not save!"
msgstr "Datei nicht speichern!"
#: octoprint_klipper/static/js/klipper_editor.js:190
msgid "Save anyway!"
msgstr "Speichere trotzdem!"
#: octoprint_klipper/static/js/klipper_editor.js:190
msgid "Save anyway and don't ask this again."
msgstr "Speichere trotzdem und dies nicht wieder nachfragen."
#: octoprint_klipper/static/js/klipper_editor.js:214
msgid "SyntaxCheck"
msgstr "Syntaxprüfung"
#: octoprint_klipper/static/js/klipper_editor.js:127
#, fuzzy
#: octoprint_klipper/static/js/klipper_editor.js:214
msgid "SyntaxCheck OK"
msgstr "Syntaxprüfung OK"
#: octoprint_klipper/static/js/klipper_editor.js:130
msgid "Syntax NOK"
msgstr "Syntax ist nicht ok!"
#: octoprint_klipper/static/js/klipper_editor.js:249
msgid "Faulty config not saved!"
msgstr "Fehlerhafte Datei nicht gespeichert!"
#: octoprint_klipper/static/js/klipper_editor.js:151
#: octoprint_klipper/static/js/klipper_editor.js:161
#: octoprint_klipper/static/js/klipper_editor.js:251
#: octoprint_klipper/static/js/klipper_editor.js:275
#: octoprint_klipper/static/js/klipper_editor.js:393
#: octoprint_klipper/static/js/klipper_editor.js:406
#: octoprint_klipper/templates/klipper_editor.jinja2:40
#: octoprint_klipper/templates/klipper_editor.jinja2:41
msgid "Save Config"
msgstr "Speichere Konfig"
#: octoprint_klipper/static/js/klipper_editor.js:151
msgid "File saved."
msgstr "Datei gespeichert."
#: octoprint_klipper/static/js/klipper_editor.js:273
#: octoprint_klipper/static/js/klipper_editor.js:349
msgid "No filename set"
msgstr "Dateiname nicht angegeben"
#: octoprint_klipper/static/js/klipper_editor.js:157
#, fuzzy
msgid "File not saved!"
msgstr "Datei nicht gespeichert."
#: octoprint_klipper/static/js/klipper_editor.js:226
#: octoprint_klipper/static/js/klipper_editor.js:243
#: octoprint_klipper/static/js/klipper_editor.js:325
#: octoprint_klipper/static/js/klipper_editor.js:343
#: octoprint_klipper/static/js/klipper_editor.js:351
msgid "Reload File"
msgstr "Datei neuladen"
#: octoprint_klipper/static/js/klipper_editor.js:230
#: octoprint_klipper/static/js/klipper_editor.js:329
msgid "Reload Config"
msgstr "Datei neuladen"
#: octoprint_klipper/static/js/klipper_editor.js:230
#: octoprint_klipper/static/js/klipper_editor.js:329
msgid "File reloaded."
msgstr "Datei neugeladen."
#: octoprint_klipper/static/js/klipper_settings.js:136
#: octoprint_klipper/static/js/klipper_editor.js:393
msgid "File saved."
msgstr "Datei gespeichert."
#: octoprint_klipper/static/js/klipper_editor.js:404
msgid "File not saved!"
msgstr "Datei nicht gespeichert."
#: octoprint_klipper/static/js/klipper_settings.js:103
msgid "Path: "
msgstr "Pfad: "
#: octoprint_klipper/static/js/klipper_settings.js:146
#, python-format
msgid "You are about to delete config file \"%(name)s\"."
msgstr "Sie sind dabei Konfigurationsdatei \"%(name)s\" zu löschen."
#: octoprint_klipper/static/js/klipper_settings.js:163
#: octoprint_klipper/static/js/klipper_settings.js:173
#, python-format
msgid "You are about to delete %(count)d config files."
msgstr "Sie sind dabei %(count)d Konfigurationsdateien zu löschen."
#: octoprint_klipper/static/js/klipper_settings.js:173
#: octoprint_klipper/static/js/klipper_settings.js:183
msgid "Deleting config files"
msgstr "Lösche Konfigurationsdateien"
#: octoprint_klipper/static/js/klipper_settings.js:174
#: octoprint_klipper/static/js/klipper_settings.js:184
#, python-format
msgid "Deleting %(count)d config files..."
msgstr "Lösche %(count)d Konfigurationsdateien..."
@ -221,27 +309,27 @@ msgid "Backups"
msgstr "Sicherungen"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:17
#: octoprint_klipper/templates/klipper_settings.jinja2:240
#: octoprint_klipper/templates/klipper_settings.jinja2:267
msgid "Select all on this page"
msgstr "Wähle alle auf dieser Seite aus"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:20
#: octoprint_klipper/templates/klipper_settings.jinja2:241
#: octoprint_klipper/templates/klipper_settings.jinja2:268
msgid "Select all"
msgstr "Alles Auswählen"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:25
#: octoprint_klipper/templates/klipper_settings.jinja2:243
#: octoprint_klipper/templates/klipper_settings.jinja2:270
msgid "Clear selection"
msgstr "Auswahl zurücksetzen"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:29
#: octoprint_klipper/templates/klipper_settings.jinja2:252
#: octoprint_klipper/templates/klipper_settings.jinja2:279
msgid "Refresh file list"
msgstr "Aktualisiere Dateiliste"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:30
#: octoprint_klipper/templates/klipper_settings.jinja2:253
#: octoprint_klipper/templates/klipper_settings.jinja2:280
msgid "Refresh Files"
msgstr "Aktualisieren"
@ -250,55 +338,55 @@ msgid "Restore selected"
msgstr "Ausgewählte wiederherstellen"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:36
#: octoprint_klipper/templates/klipper_settings.jinja2:256
#: octoprint_klipper/templates/klipper_settings.jinja2:283
msgid "Delete selected"
msgstr "Ausgewählte löschen"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:46
#: octoprint_klipper/templates/klipper_settings.jinja2:263
#: octoprint_klipper/templates/klipper_settings.jinja2:291
msgid "Sort by name"
msgstr "Sortiere nach Name"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:47
#: octoprint_klipper/templates/klipper_settings.jinja2:264
#: octoprint_klipper/templates/klipper_settings.jinja2:292
msgid "ascending"
msgstr "aufwärts"
msgstr "aufsteigend"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:50
#: octoprint_klipper/templates/klipper_settings.jinja2:266
#: octoprint_klipper/templates/klipper_settings.jinja2:294
msgid "Sort by date"
msgstr "Sortiere nach Datum"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:51
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:55
#: octoprint_klipper/templates/klipper_settings.jinja2:267
#: octoprint_klipper/templates/klipper_settings.jinja2:270
#: octoprint_klipper/templates/klipper_settings.jinja2:295
#: octoprint_klipper/templates/klipper_settings.jinja2:298
msgid "descending"
msgstr "abwärts"
msgstr "absteigend"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:54
#: octoprint_klipper/templates/klipper_settings.jinja2:269
#: octoprint_klipper/templates/klipper_settings.jinja2:297
msgid "Sort by file size"
msgstr "Sortie nach Dateigröße"
msgstr "Sortiere nach Dateigröße"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:65
#: octoprint_klipper/templates/klipper_settings.jinja2:101
#: octoprint_klipper/templates/klipper_settings.jinja2:280
#: octoprint_klipper/templates/klipper_settings.jinja2:130
#: octoprint_klipper/templates/klipper_settings.jinja2:309
msgid "Name"
msgstr "Name"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:66
#: octoprint_klipper/templates/klipper_settings.jinja2:281
#: octoprint_klipper/templates/klipper_settings.jinja2:310
msgid "Size"
msgstr "Größe"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:67
#: octoprint_klipper/templates/klipper_settings.jinja2:282
#: octoprint_klipper/templates/klipper_settings.jinja2:311
msgid "Action"
msgstr "Aktion"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:78
#: octoprint_klipper/templates/klipper_settings.jinja2:294
#: octoprint_klipper/templates/klipper_settings.jinja2:323
msgid "Delete"
msgstr "Löschen"
@ -307,7 +395,7 @@ msgid "Restore"
msgstr "Wiederherstellen"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:84
#: octoprint_klipper/templates/klipper_settings.jinja2:297
#: octoprint_klipper/templates/klipper_settings.jinja2:326
msgid "Download"
msgstr "Runterladen"
@ -334,14 +422,17 @@ msgstr "Datei neuladen"
#: octoprint_klipper/templates/klipper_editor.jinja2:34
#: octoprint_klipper/templates/klipper_editor.jinja2:35
msgid "Reload last version"
msgstr "Lade letzte Version"
#: octoprint_klipper/templates/klipper_editor.jinja2:37
#: octoprint_klipper/templates/klipper_editor.jinja2:38
msgid "Check Syntax"
msgstr "Syntax prüfen"
#: octoprint_klipper/templates/klipper_editor.jinja2:37
msgid "Save Config and Close"
msgstr "Speichern und schließen"
#: octoprint_klipper/templates/klipper_editor.jinja2:41
msgid "Save"
msgstr "Speichern"
#: octoprint_klipper/templates/klipper_graph_dialog.jinja2:4
msgid "Performance Graph"
msgstr "Performancediagramm"
@ -362,10 +453,6 @@ msgstr "Auswählen"
msgid "Analyze Log"
msgstr "Log analysieren"
#: octoprint_klipper/templates/klipper_graph_dialog.jinja2:27
msgid "Close"
msgstr "Schließen"
#: octoprint_klipper/templates/klipper_graph_dialog.jinja2:35
msgid "Depending on the size of the log file this might take a while."
msgstr "Abhängig von der Größe der Logdatei kann es etwas dauern."
@ -395,11 +482,6 @@ msgstr "Nächster"
msgid "Stop"
msgstr "Stop"
#: octoprint_klipper/templates/klipper_navbar.jinja2:2
#: octoprint_klipper/templates/klipper_sidebar.jinja2:11
msgid "Go to OctoKlipper Tab"
msgstr "Gehe zum OctoKlipper Reiter"
#: octoprint_klipper/templates/klipper_offset_dialog.jinja2:4
#: octoprint_klipper/templates/klipper_tab_main.jinja2:63
msgid "Coordinate Offset"
@ -455,7 +537,7 @@ msgid "Basic"
msgstr "Haupteinstellungen"
#: octoprint_klipper/templates/klipper_settings.jinja2:4
#: octoprint_klipper/templates/klipper_sidebar.jinja2:16
#: octoprint_klipper/templates/klipper_sidebar.jinja2:20
#: octoprint_klipper/templates/klipper_tab_main.jinja2:72
msgid "Macros"
msgstr "Makros"
@ -478,169 +560,215 @@ msgid "Replace Connection Panel"
msgstr "Ersetze Verbindungsmenu"
#: octoprint_klipper/templates/klipper_settings.jinja2:25
#: octoprint_klipper/templates/klipper_settings.jinja2:27
msgid ""
"Hide 'Open Editor' Button\n"
"in the Connection Panel"
msgstr ""
"Verberge 'Öffne Editor' Schaltfläche\n"
"auf der Seitenleiste"
#: octoprint_klipper/templates/klipper_settings.jinja2:32
msgid "Show Short Messages"
msgstr "Zeige Kurzmeldungen"
#: octoprint_klipper/templates/klipper_settings.jinja2:27
#: octoprint_klipper/templates/klipper_settings.jinja2:28
#: octoprint_klipper/templates/klipper_settings.jinja2:34
#: octoprint_klipper/templates/klipper_settings.jinja2:35
msgid "on NavBar"
msgstr "auf Nav-leiste"
#: octoprint_klipper/templates/klipper_settings.jinja2:29
#: octoprint_klipper/templates/klipper_settings.jinja2:30
#: octoprint_klipper/templates/klipper_settings.jinja2:36
#: octoprint_klipper/templates/klipper_settings.jinja2:37
msgid "on SideBar"
msgstr "auf Seitenleiste"
#: octoprint_klipper/templates/klipper_settings.jinja2:34
#: octoprint_klipper/templates/klipper_settings.jinja2:36
#: octoprint_klipper/templates/klipper_settings.jinja2:41
#: octoprint_klipper/templates/klipper_settings.jinja2:43
msgid "Enable debug logging"
msgstr "Aktiviere Debugloging"
#: octoprint_klipper/templates/klipper_settings.jinja2:41
#: octoprint_klipper/templates/klipper_settings.jinja2:48
#: octoprint_klipper/templates/klipper_settings.jinja2:50
msgid "Hide Error PopUps"
msgstr "Verberge Fehler PopUps"
#: octoprint_klipper/templates/klipper_settings.jinja2:55
msgid "Config Editor"
msgstr "Konfig Editor"
#: octoprint_klipper/templates/klipper_settings.jinja2:43
#: octoprint_klipper/templates/klipper_settings.jinja2:44
#: octoprint_klipper/templates/klipper_settings.jinja2:57
#: octoprint_klipper/templates/klipper_settings.jinja2:58
msgid "Check parsing on save"
msgstr "Prüfe Syntax beim speichern"
#: octoprint_klipper/templates/klipper_settings.jinja2:46
#: octoprint_klipper/templates/klipper_settings.jinja2:48
#: octoprint_klipper/templates/klipper_settings.jinja2:60
#: octoprint_klipper/templates/klipper_settings.jinja2:62
msgid "Fontsize"
msgstr "Fontgröße"
#: octoprint_klipper/templates/klipper_settings.jinja2:53
#: octoprint_klipper/templates/klipper_settings.jinja2:67
msgid "Klipper Config Directory"
msgstr "Klipper Konfig Pfad"
#: octoprint_klipper/templates/klipper_settings.jinja2:59
#: octoprint_klipper/templates/klipper_settings.jinja2:73
msgid ""
"The filename of the base config that Klipper is loading. (default is "
"printer.cfg)"
msgstr ""
"Der Dateiname der Haupt-Konfigurationsdatei, die Klipper läd.(Standard "
"ist printer.cfg)"
#: octoprint_klipper/templates/klipper_settings.jinja2:73
msgid "Klipper Base Config Filename"
msgstr "Klipper Haupt-Konfigurationsdatei"
#: octoprint_klipper/templates/klipper_settings.jinja2:79
msgid "Klipper Log File"
msgstr "Klipper Logdatei"
#: octoprint_klipper/templates/klipper_settings.jinja2:65
msgid "Configuration Reload Command"
#: octoprint_klipper/templates/klipper_settings.jinja2:85
msgid "Configuration Restart Command"
msgstr "Konfiguration Neustart Befehl"
#: octoprint_klipper/templates/klipper_settings.jinja2:72
#: octoprint_klipper/templates/klipper_settings.jinja2:92
msgid "The command that is executed if you want to restart klipper."
msgstr "Der Befehl, der ausgeführt wird, um Klipper neu zu starten."
#: octoprint_klipper/templates/klipper_settings.jinja2:74
#: octoprint_klipper/templates/klipper_settings.jinja2:75
msgid "Reload klipper on editor save?"
#: octoprint_klipper/templates/klipper_settings.jinja2:94
msgid "Restart klipper on editor save?"
msgstr "Klipper neu starten nach speichern im Editor?"
#: octoprint_klipper/templates/klipper_settings.jinja2:80
#: octoprint_klipper/templates/klipper_settings.jinja2:95
msgid "Restart Klipper on editor save?"
msgstr "Klipper neu starten nach speichern im Editor?"
#: octoprint_klipper/templates/klipper_settings.jinja2:97
msgid "Show Confirmation before restarting Klipper?"
msgstr "Zeige Bestätigung vor Klipper Neustart?"
#: octoprint_klipper/templates/klipper_settings.jinja2:98
msgid "Confirmation before restarting Klipper?"
msgstr "Bestätigung vor Klipper Neustart?"
#: octoprint_klipper/templates/klipper_settings.jinja2:103
msgid "Config Backup"
msgstr "Konfig Sicherungen"
#: octoprint_klipper/templates/klipper_settings.jinja2:82
#: octoprint_klipper/templates/klipper_settings.jinja2:83
#: octoprint_klipper/templates/klipper_settings.jinja2:105
#: octoprint_klipper/templates/klipper_settings.jinja2:106
msgid "Show Backups"
msgstr "Zeige Sicherungen"
#: octoprint_klipper/templates/klipper_settings.jinja2:93
msgid "Add macro button to:"
msgstr "Makroschaltfläche anzeigen auf:"
#: octoprint_klipper/templates/klipper_settings.jinja2:115
msgid "These macros are only meant to be used in OctoPrint."
msgstr "Diese Makros sind nur für OctoPrint gedacht."
#: octoprint_klipper/templates/klipper_settings.jinja2:94
#: octoprint_klipper/templates/klipper_settings.jinja2:108
#: octoprint_klipper/templates/klipper_settings.jinja2:116
msgid "They are not the ones that can be defined in the printer.cfg."
msgstr "Es sind nicht die, die in der printer.cfg definiert werden können."
#: octoprint_klipper/templates/klipper_settings.jinja2:122
msgid "Add macro button to:"
msgstr "Zeige Makroschaltfläche auf:"
#: octoprint_klipper/templates/klipper_settings.jinja2:123
#: octoprint_klipper/templates/klipper_settings.jinja2:137
msgid "Klipper Tab"
msgstr "Klipper Reiter"
#: octoprint_klipper/templates/klipper_settings.jinja2:95
#: octoprint_klipper/templates/klipper_settings.jinja2:111
#: octoprint_klipper/templates/klipper_settings.jinja2:124
#: octoprint_klipper/templates/klipper_settings.jinja2:140
msgid "Sidebar"
msgstr "Seitenleiste"
#: octoprint_klipper/templates/klipper_settings.jinja2:120
#: octoprint_klipper/templates/klipper_settings.jinja2:149
msgid "Command"
msgstr "Befehl"
#: octoprint_klipper/templates/klipper_settings.jinja2:133
#: octoprint_klipper/templates/klipper_settings.jinja2:162
msgid "Add Macro"
msgstr "Makro hinzufügen"
#: octoprint_klipper/templates/klipper_settings.jinja2:138
#: octoprint_klipper/templates/klipper_settings.jinja2:167
msgid ""
"To show a dialog that asks for parameters you can write your macro like "
"in the following example:"
msgstr ""
"Um ein Dialog anzeigen zu lassen, welches nach Parametern fragt, <br>\n"
"kann man ein Makro wie im nächsten Beispiel schreiben:"
"Um ein Dialog anzeigen zu lassen, welches nach Parametern fragt, kann man"
" ein Makro wie im nächsten Beispiel schreiben:"
#: octoprint_klipper/templates/klipper_settings.jinja2:154
#: octoprint_klipper/templates/klipper_settings.jinja2:183
msgid ""
"This feature assists in manually leveling you print bed by moving the "
"head to the defined points in\n"
" sequence.<br />\n"
" If you use a piece of paper for leveling, set \"Probe Height\" "
"to the paper thickness eg. \"0.1\"."
"This feature assists in manually leveling your print bed by moving the "
"head to the defined points in sequence.<br />If you use a piece of paper "
"for leveling, set \"Probe Height\" to the paper thickness eg. \"0.1\"."
msgstr ""
"Diese Funktion hilft beim Einstellen des Druckbettes, <br>\n"
"da es die angegebenen Punkte automatisch nacheinander anfährt.<br>\n"
"Wenn man ein Papier zum messen nimmt, setzt man \"Messhöhe\" <br>\n"
"auf die Papierstärke zBsp.: \"0.1\"."
"Diese Funktion hilft beim Einstellen des Druckbettes, da es die "
"angegebenen Punkte automatisch nacheinander anfährt. <br />Wenn man ein "
"Papier zum messen nimmt, setzt man \"Messhöhe\" auf die Papierstärke "
"zBsp.: \"0.1\"."
#: octoprint_klipper/templates/klipper_settings.jinja2:160
#: octoprint_klipper/templates/klipper_settings.jinja2:187
msgid "Probe Height"
msgstr "Messhöhe"
#: octoprint_klipper/templates/klipper_settings.jinja2:166
#: octoprint_klipper/templates/klipper_settings.jinja2:193
msgid "Z-height to probe at"
msgstr "Höhe bei der gemessen wird"
#: octoprint_klipper/templates/klipper_settings.jinja2:170
#: octoprint_klipper/templates/klipper_settings.jinja2:197
msgid "Probe Lift"
msgstr "Höhe für Seitenbewegung"
#: octoprint_klipper/templates/klipper_settings.jinja2:176
#: octoprint_klipper/templates/klipper_settings.jinja2:203
msgid "Lift Head by this amount before moving."
msgstr "Hebe Druckkopf auf diese Höhe vor einer Seitenbewegung"
#: octoprint_klipper/templates/klipper_settings.jinja2:180
#: octoprint_klipper/templates/klipper_settings.jinja2:207
msgid "Probe Feedrate Z"
msgstr "Geschwindigkeit Z"
#: octoprint_klipper/templates/klipper_settings.jinja2:189
#: octoprint_klipper/templates/klipper_settings.jinja2:216
msgid "Feedrate X/Y"
msgstr "Geschwindigkeit X/Y"
#: octoprint_klipper/templates/klipper_settings.jinja2:198
#: octoprint_klipper/templates/klipper_settings.jinja2:225
msgid "Probe Points"
msgstr "Messpunkte"
#: octoprint_klipper/templates/klipper_settings.jinja2:225
#: octoprint_klipper/templates/klipper_settings.jinja2:252
msgid "Add Point"
msgstr "Füge Messpunkt hinzu"
#: octoprint_klipper/templates/klipper_settings.jinja2:232
#: octoprint_klipper/templates/klipper_settings.jinja2:259
msgid "Config Files"
msgstr "Konfig Dateien"
#: octoprint_klipper/templates/klipper_settings.jinja2:246
#: octoprint_klipper/templates/klipper_settings.jinja2:273
msgid "Add new File"
msgstr "Erstelle neue Datei"
#: octoprint_klipper/templates/klipper_settings.jinja2:247
#: octoprint_klipper/templates/klipper_settings.jinja2:274
msgid "New File"
msgstr "Neue Datei"
#: octoprint_klipper/templates/klipper_settings.jinja2:249
#: octoprint_klipper/templates/klipper_settings.jinja2:276
msgid "Open last config"
msgstr "Öffne letzte Konfig"
#: octoprint_klipper/templates/klipper_settings.jinja2:250
#, fuzzy
#: octoprint_klipper/templates/klipper_settings.jinja2:277
msgid "Open last Editor"
msgstr "Öffne Editor"
#: octoprint_klipper/templates/klipper_settings.jinja2:300
#: octoprint_klipper/templates/klipper_settings.jinja2:303
msgid "Path to the config files."
msgstr "Pfad zu den Konfigurationsdateien"
#: octoprint_klipper/templates/klipper_settings.jinja2:329
msgid "Edit"
msgstr "Bearbeiten"
#: octoprint_klipper/templates/klipper_settings.jinja2:329
#: octoprint_klipper/templates/klipper_settings.jinja2:358
msgid "Donate"
msgstr "Spenden"
@ -652,7 +780,7 @@ msgstr "Druckerprofil"
msgid "Connect"
msgstr "Verbinde"
#: octoprint_klipper/templates/klipper_sidebar.jinja2:6
#: octoprint_klipper/templates/klipper_sidebar.jinja2:7
msgid "Open Editor"
msgstr "Öffne Editor"
@ -660,39 +788,31 @@ msgstr "Öffne Editor"
msgid "Messages"
msgstr "Nachricht"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:11
#: octoprint_klipper/templates/klipper_tab_main.jinja2:12
msgid "Clear Log"
msgstr "Log löschen"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:21
msgid "Query Klipper for its current status"
msgstr "Aktuellen Status von Klipper anfordern"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:22
msgid "Get Status"
msgstr "Statusabfrage"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:26
#: octoprint_klipper/templates/klipper_tab_main.jinja2:6
msgid "Open the OctoKlipper Settings"
msgstr "Öffne die OctoKlipper Einstellungen"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:16
#: octoprint_klipper/templates/klipper_tab_main.jinja2:17
msgid "Clear Log"
msgstr "Log löschen"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:26
msgid "Query Klipper for its current status"
msgstr "Aktuellen Status von Klipper anfordern"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:27
msgid "Open OctoKlipper Settings"
msgstr "Öffne OctoKlipper Einstellungen"
msgid "Get Status"
msgstr "Statusabfrage"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:31
msgid "Show the Editor"
msgstr "Öffne Editor"
msgstr "Öffne den Editor"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:33
msgid "Show Editor"
msgstr "Öffne Editor"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:39
msgid "Restart"
msgstr "Neustart"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:41
msgid ""
"This will cause the host software to reload its config and perform an "

View File

@ -1,8 +1,96 @@
def log_info(self, message):
self._octoklipper_logger.info(message)
send_message(
self,
type = "log",
subtype = "info",
title = message,
payload = message
)
def log_debug(self, message):
self._octoklipper_logger.debug(message)
self._logger.info(message)
send_message(
self,
type = "console",
subtype = "debug",
title = message,
payload = message
)
def log_error(self, error):
self._octoklipper_logger.error(error)
self._logger.error(error)
send_message(
self,
type = "log",
subtype = "error",
title = error,
payload = error
)
def migrate_old_settings(self, settings):
'''
For Old settings
'''
migrate_settings(settings, "serialport", "connection", "port")
migrate_settings(settings, "replace_connection_panel", "connection", "replace_connection_panel")
migrate_settings(settings, "probeHeight", "probe", "height")
migrate_settings(settings, "probeLift", "probe", "lift")
migrate_settings(settings, "probeSpeedXy", "probe", "speed_xy")
migrate_settings(settings, "probeSpeedZ", "probe", "speed_z")
migrate_settings(settings, "configPath", "configuration", "configpath")
if settings.has(["probePoints"]):
points = settings.get(["probePoints"])
points_new = [dict(name="", x=int(p["x"]), y=int(p["y"]), z=0) for p in points]
settings.set(["probe", "points"], points_new)
settings.remove(["probePoints"])
def migrate_settings(self, settings, old, new, new2=""):
"""migrate setting to setting with an additional path
Args:
settings (any): instance of self._settings
old (str): the old setting to migrate
new (str): group or only new setting if there is no new2
new2 (str, optional): the new setting to migrate to. Defaults to "".
""" ''''''
if settings.has(old):
if new2 != "":
log_info(self, "migrate setting for '" + old + "' -> '" + new + "/" + new2 + "'")
settings.set([new, new2], settings.get(old))
else:
log_info(self, "migrate setting for '" + old + "' -> '" + new + "'")
settings.set([new], settings.get(old))
settings.remove(old)
def migrate_settings_configuration(self, settings, new, old):
"""migrate setting in path configuration to new name
:param settings: the class of the mixin
:type settings: class
:param new: new name
:type new: str
:param old: the old name
:type old: str
"""
if settings.has(["configuration", old]):
log_info(self, "migrate setting for 'configuration/" + old + "' -> 'configuration/" + new + "'")
settings.set(["configuration", new], settings.get(["configuration", old]))
settings.remove(["configuration", old])
def poll_status(self):
self._printer.commands("STATUS")
def update_status(self, type, status):
send_message(self, "status", type, status, status)
def update_status(self, subtype, status):
send_message(
self,
type = "status",
subtype = subtype,
payload = status)
def file_exist(self, filepath):
'''
@ -10,8 +98,13 @@ def file_exist(self, filepath):
'''
from os import path
if not path.isfile(filepath):
send_message(self, "PopUp", "warning", "OctoKlipper Settings",
"File: <br />" + filepath + "<br /> does not exist!")
log_debug(self, "File: <br />" + filepath + "<br /> does not exist!")
send_message(
self,
type = "PopUp",
subtype = "warning",
title = "OctoKlipper Settings",
payload = "File: <br />" + filepath + "<br /> does not exist!")
return False
else:
return True
@ -24,7 +117,7 @@ def key_exist(dict, key1, key2):
else:
return True
def send_message(self, type, subtype, title, payload):
def send_message(self, type, subtype, title = "", payload = ""):
"""
Send Message over API to FrontEnd
"""
@ -32,10 +125,10 @@ def send_message(self, type, subtype, title, payload):
self._plugin_manager.send_plugin_message(
self._identifier,
dict(
time=datetime.datetime.now().strftime("%H:%M:%S"),
type=type,
subtype=subtype,
title=title,
payload=payload
time = datetime.datetime.now().strftime("%H:%M:%S"),
type = type,
subtype = subtype,
title = title,
payload = payload
)
)

View File

@ -19,7 +19,7 @@ plugin_package = "octoprint_klipper"
plugin_name = "OctoKlipper"
plugin_version = "0.3.8.3"
plugin_version = "0.3.9.3"
plugin_description = """A plugin for OctoPrint to configure,control and monitor the Klipper 3D printer software."""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: OctoKlipper 0.3.8.2\n"
"Report-Msgid-Bugs-To: i18n@octoprint.org\n"
"POT-Creation-Date: 2021-09-17 08:18+0200\n"
"POT-Creation-Date: 2021-11-21 00:46+0100\n"
"PO-Revision-Date: 2021-05-13 17:32+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de\n"
@ -27,37 +27,74 @@ msgstr "Erlaubt Klipper zu konfigurieren"
msgid "Allows to use klipper macros"
msgstr "Erlaubt Makros zu benutzen"
#: octoprint_klipper/__init__.py:608
#: octoprint_klipper/__init__.py:599
msgid "Restart Klipper"
msgstr "Neustart Klipper"
msgstr "Klipper Neustart"
#: octoprint_klipper/__init__.py:609
#: octoprint_klipper/__init__.py:600
msgid "You are about to restart Klipper!"
msgstr "Sie sind dabei Klipper neuzustarten!"
msgstr "Sie sind dabei Klipper neu zu starten!"
#: octoprint_klipper/__init__.py:609
#: octoprint_klipper/__init__.py:600
msgid "This will stop ongoing prints!"
msgstr "Dies wird angehende Aufträge abbrechen!"
msgstr "Dies wird laufende Aufträge abbrechen!"
#: octoprint_klipper/cfgUtils.py:95
#: octoprint_klipper/cfgUtils.py:86
msgid "Error: Klipper config file not found at:"
msgstr "Fehler: Klipper Konfigurationsdatei nicht gefunden:"
#: octoprint_klipper/cfgUtils.py:89
msgid "IOError:"
msgstr "IOFehler"
#: octoprint_klipper/cfgUtils.py:96
msgid "Decode Error:"
msgstr "Dekodierungsfehler:"
#: octoprint_klipper/cfgUtils.py:100
msgid "Please convert your config files to utf-8!"
msgstr "Bitte die Konfigurationsdateien nach utf-8 konvertieren!"
#: octoprint_klipper/cfgUtils.py:102
msgid ""
"Or you can also paste your config \n"
"into the Editor and save it."
msgstr ""
"Sie können auch die Konfiguration \n"
"in den Editor einfügen und dann speichern."
#: octoprint_klipper/cfgUtils.py:109
msgid "File not found!"
msgstr "Datei nicht gefunden!"
#: octoprint_klipper/static/js/klipper.js:259
#: octoprint_klipper/static/js/klipper.js:220
#: octoprint_klipper/templates/klipper_sidebar.jinja2:13
msgid "Go to OctoKlipper Tab"
msgstr "Gehe zum OctoKlipper Reiter"
#: octoprint_klipper/static/js/klipper.js:340
msgid "Restarted Klipper"
msgstr "Klipper neu gestartet"
#: octoprint_klipper/static/js/klipper.js:348
msgid "All ongoing Prints will be stopped!"
msgstr "Alle laufende Drucke werden gestoppt!"
#: octoprint_klipper/static/js/klipper.js:262
msgid "Klipper restart?"
msgstr "Klipper neustarten?"
#: octoprint_klipper/static/js/klipper.js:353
msgid "Restart Klipper?"
msgstr "Klipper neu starten?"
#: octoprint_klipper/static/js/klipper.js:264
#: octoprint_klipper/static/js/klipper_backup.js:159
msgid "Proceed"
msgstr "Weiter"
#: octoprint_klipper/static/js/klipper.js:355
#: octoprint_klipper/templates/klipper_tab_main.jinja2:39
msgid "Restart"
msgstr "Neustart"
#: octoprint_klipper/static/js/klipper.js:355
msgid "Restart and don't ask this again."
msgstr "Neu starten und dies nicht wieder nachfragen."
#: octoprint_klipper/static/js/klipper_backup.js:126
#: octoprint_klipper/static/js/klipper_settings.js:124
#: octoprint_klipper/static/js/klipper_settings.js:134
#, python-format
msgid ""
"Failed to remove config %(name)s.</p><p>Please consult octoprint.log for "
@ -67,13 +104,13 @@ msgstr ""
"nachsehen für weitere Details.</p>"
#: octoprint_klipper/static/js/klipper_backup.js:129
#: octoprint_klipper/static/js/klipper_settings.js:127
#: octoprint_klipper/static/js/klipper_settings.js:137
msgid "Could not remove config"
msgstr "Konnte Konfiguration nicht löschen"
#: octoprint_klipper/static/js/klipper_backup.js:138
#, python-format
msgid "You are about to delete backuped config file \"%(name)s\"."
msgid "You are about to delete backed config file \"%(name)s\"."
msgstr "Sie sind dabei die gesicherte Konfigurationsdatei \"%(name)s\" zu löschen."
#: octoprint_klipper/static/js/klipper_backup.js:154
@ -86,16 +123,21 @@ msgstr ""
msgid "Are you sure you want to restore now?"
msgstr "Sind sie sicher jetzt wiederherzustellen?"
#: octoprint_klipper/static/js/klipper_backup.js:159
#: octoprint_klipper/static/js/klipper_editor.js:173
msgid "Proceed"
msgstr "Weiter"
#: octoprint_klipper/static/js/klipper_backup.js:184
#, python-format
msgid "You are about to restore %(count)d backuped config files."
msgid "You are about to restore %(count)d backed config files."
msgstr ""
"Sie sind dabei %(count)d gesicherte Konfigurationsdateien "
"wiederherzustellen."
#: octoprint_klipper/static/js/klipper_backup.js:199
#, python-format
msgid "You are about to delete %(count)d backuped config files."
msgid "You are about to delete %(count)d backed config files."
msgstr "Sie sind dabei %(count)d gesicherte Konfigurationsdateien zu löschen."
#: octoprint_klipper/static/js/klipper_backup.js:209
@ -104,7 +146,7 @@ msgstr "Stelle Klipper Konfigdatei wieder her"
#: octoprint_klipper/static/js/klipper_backup.js:211
#, python-format
msgid "Restoring %(count)d backuped config files..."
msgid "Restoring %(count)d backed config files..."
msgstr "Stelle %(count)d gesicherte Konfigurationsdateien wieder her."
#: octoprint_klipper/static/js/klipper_backup.js:220
@ -123,95 +165,141 @@ msgstr "Lösche gesicherte Dateien"
#: octoprint_klipper/static/js/klipper_backup.js:265
#, python-format
msgid "Deleting %(count)d backup files..."
msgid "Deleting %(count)d backed files..."
msgstr "Lösche %(count)d gesicherte Konfigurationsdateien..."
#: octoprint_klipper/static/js/klipper_backup.js:273
#: octoprint_klipper/static/js/klipper_settings.js:183
#: octoprint_klipper/static/js/klipper_settings.js:193
#, python-format
msgid "Deleted %(filename)s..."
msgstr "%(filename)s gelöscht..."
#: octoprint_klipper/static/js/klipper_backup.js:279
#: octoprint_klipper/static/js/klipper_settings.js:193
#: octoprint_klipper/static/js/klipper_settings.js:203
#, python-format
msgid "Deleting of %(filename)s failed, continuing..."
msgstr "Löschung von Datei %(filename)s gescheitert, setze fort... "
#: octoprint_klipper/static/js/klipper_editor.js:61
#: octoprint_klipper/static/js/klipper_editor.js:79
msgid "Closing without saving"
msgstr "Schließen ohne zu Speichern?"
#: octoprint_klipper/static/js/klipper_editor.js:80
msgid "Your file seems to have changed."
msgstr "Datei scheint geändert worden zu sein."
#: octoprint_klipper/static/js/klipper_editor.js:64
#: octoprint_klipper/static/js/klipper_editor.js:82
msgid "Do you really want to close it?"
msgstr "Wollen sie wirklich schliessen?"
msgstr "Wollen sie wirklich schließen?"
#: octoprint_klipper/static/js/klipper_editor.js:65
msgid "No"
msgstr "Nein"
#: octoprint_klipper/static/js/klipper_editor.js:83
#: octoprint_klipper/templates/klipper_graph_dialog.jinja2:27
msgid "Close"
msgstr "Schließen"
#: octoprint_klipper/static/js/klipper_editor.js:66
msgid "Yes"
msgstr "Ja"
#: octoprint_klipper/static/js/klipper_editor.js:83
msgid "Do not close"
msgstr "Nicht schließen"
#: octoprint_klipper/static/js/klipper_editor.js:127
#: octoprint_klipper/static/js/klipper_editor.js:134
#: octoprint_klipper/static/js/klipper_editor.js:83
#: octoprint_klipper/templates/klipper_editor.jinja2:38
msgid "Save & Close"
msgstr "Speichern & Schließen"
#: octoprint_klipper/static/js/klipper_editor.js:168
msgid "Reload Configfile after SAVE_CONFIG?"
msgstr "Konfiguration neuladen nach SAVE_CONFIG?"
#: octoprint_klipper/static/js/klipper_editor.js:171
msgid "Externally changed config"
msgstr "Extern geänderte Konfiguration"
#: octoprint_klipper/static/js/klipper_editor.js:183
msgid "Your configuration seems to be faulty."
msgstr "Ihre Konfiguration sieht fehlerhaft aus."
#: octoprint_klipper/static/js/klipper_editor.js:187
msgid "Save faulty Configuration?"
msgstr "Speichere fehlerhafte Konfiguration?"
#: octoprint_klipper/static/js/klipper_editor.js:189
msgid "Do not save!"
msgstr "Datei nicht speichern!"
#: octoprint_klipper/static/js/klipper_editor.js:190
msgid "Save anyway!"
msgstr "Speichere trotzdem!"
#: octoprint_klipper/static/js/klipper_editor.js:190
msgid "Save anyway and don't ask this again."
msgstr "Speichere trotzdem und dies nicht wieder nachfragen."
#: octoprint_klipper/static/js/klipper_editor.js:214
msgid "SyntaxCheck"
msgstr "Syntaxprüfung"
#: octoprint_klipper/static/js/klipper_editor.js:127
#, fuzzy
#: octoprint_klipper/static/js/klipper_editor.js:214
msgid "SyntaxCheck OK"
msgstr "Syntaxprüfung OK"
#: octoprint_klipper/static/js/klipper_editor.js:130
msgid "Syntax NOK"
msgstr "Syntax ist nicht ok!"
#: octoprint_klipper/static/js/klipper_editor.js:249
msgid "Faulty config not saved!"
msgstr "Fehlerhafte Datei nicht gespeichert!"
#: octoprint_klipper/static/js/klipper_editor.js:151
#: octoprint_klipper/static/js/klipper_editor.js:161
#: octoprint_klipper/static/js/klipper_editor.js:251
#: octoprint_klipper/static/js/klipper_editor.js:275
#: octoprint_klipper/static/js/klipper_editor.js:393
#: octoprint_klipper/static/js/klipper_editor.js:406
#: octoprint_klipper/templates/klipper_editor.jinja2:40
#: octoprint_klipper/templates/klipper_editor.jinja2:41
msgid "Save Config"
msgstr "Speichere Konfig"
#: octoprint_klipper/static/js/klipper_editor.js:151
msgid "File saved."
msgstr "Datei gespeichert."
#: octoprint_klipper/static/js/klipper_editor.js:273
#: octoprint_klipper/static/js/klipper_editor.js:349
msgid "No filename set"
msgstr "Dateiname nicht angegeben"
#: octoprint_klipper/static/js/klipper_editor.js:157
#, fuzzy
msgid "File not saved!"
msgstr "Datei nicht gespeichert."
#: octoprint_klipper/static/js/klipper_editor.js:226
#: octoprint_klipper/static/js/klipper_editor.js:243
#: octoprint_klipper/static/js/klipper_editor.js:325
#: octoprint_klipper/static/js/klipper_editor.js:343
#: octoprint_klipper/static/js/klipper_editor.js:351
msgid "Reload File"
msgstr "Datei neuladen"
#: octoprint_klipper/static/js/klipper_editor.js:230
#: octoprint_klipper/static/js/klipper_editor.js:329
msgid "Reload Config"
msgstr "Datei neuladen"
#: octoprint_klipper/static/js/klipper_editor.js:230
#: octoprint_klipper/static/js/klipper_editor.js:329
msgid "File reloaded."
msgstr "Datei neugeladen."
#: octoprint_klipper/static/js/klipper_settings.js:136
#: octoprint_klipper/static/js/klipper_editor.js:393
msgid "File saved."
msgstr "Datei gespeichert."
#: octoprint_klipper/static/js/klipper_editor.js:404
msgid "File not saved!"
msgstr "Datei nicht gespeichert."
#: octoprint_klipper/static/js/klipper_settings.js:103
msgid "Path: "
msgstr "Pfad: "
#: octoprint_klipper/static/js/klipper_settings.js:146
#, python-format
msgid "You are about to delete config file \"%(name)s\"."
msgstr "Sie sind dabei Konfigurationsdatei \"%(name)s\" zu löschen."
#: octoprint_klipper/static/js/klipper_settings.js:163
#: octoprint_klipper/static/js/klipper_settings.js:173
#, python-format
msgid "You are about to delete %(count)d config files."
msgstr "Sie sind dabei %(count)d Konfigurationsdateien zu löschen."
#: octoprint_klipper/static/js/klipper_settings.js:173
#: octoprint_klipper/static/js/klipper_settings.js:183
msgid "Deleting config files"
msgstr "Lösche Konfigurationsdateien"
#: octoprint_klipper/static/js/klipper_settings.js:174
#: octoprint_klipper/static/js/klipper_settings.js:184
#, python-format
msgid "Deleting %(count)d config files..."
msgstr "Lösche %(count)d Konfigurationsdateien..."
@ -221,27 +309,27 @@ msgid "Backups"
msgstr "Sicherungen"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:17
#: octoprint_klipper/templates/klipper_settings.jinja2:240
#: octoprint_klipper/templates/klipper_settings.jinja2:267
msgid "Select all on this page"
msgstr "Wähle alle auf dieser Seite aus"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:20
#: octoprint_klipper/templates/klipper_settings.jinja2:241
#: octoprint_klipper/templates/klipper_settings.jinja2:268
msgid "Select all"
msgstr "Alles Auswählen"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:25
#: octoprint_klipper/templates/klipper_settings.jinja2:243
#: octoprint_klipper/templates/klipper_settings.jinja2:270
msgid "Clear selection"
msgstr "Auswahl zurücksetzen"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:29
#: octoprint_klipper/templates/klipper_settings.jinja2:252
#: octoprint_klipper/templates/klipper_settings.jinja2:279
msgid "Refresh file list"
msgstr "Aktualisiere Dateiliste"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:30
#: octoprint_klipper/templates/klipper_settings.jinja2:253
#: octoprint_klipper/templates/klipper_settings.jinja2:280
msgid "Refresh Files"
msgstr "Aktualisieren"
@ -250,55 +338,55 @@ msgid "Restore selected"
msgstr "Ausgewählte wiederherstellen"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:36
#: octoprint_klipper/templates/klipper_settings.jinja2:256
#: octoprint_klipper/templates/klipper_settings.jinja2:283
msgid "Delete selected"
msgstr "Ausgewählte löschen"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:46
#: octoprint_klipper/templates/klipper_settings.jinja2:263
#: octoprint_klipper/templates/klipper_settings.jinja2:291
msgid "Sort by name"
msgstr "Sortiere nach Name"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:47
#: octoprint_klipper/templates/klipper_settings.jinja2:264
#: octoprint_klipper/templates/klipper_settings.jinja2:292
msgid "ascending"
msgstr "aufwärts"
msgstr "aufsteigend"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:50
#: octoprint_klipper/templates/klipper_settings.jinja2:266
#: octoprint_klipper/templates/klipper_settings.jinja2:294
msgid "Sort by date"
msgstr "Sortiere nach Datum"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:51
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:55
#: octoprint_klipper/templates/klipper_settings.jinja2:267
#: octoprint_klipper/templates/klipper_settings.jinja2:270
#: octoprint_klipper/templates/klipper_settings.jinja2:295
#: octoprint_klipper/templates/klipper_settings.jinja2:298
msgid "descending"
msgstr "abwärts"
msgstr "absteigend"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:54
#: octoprint_klipper/templates/klipper_settings.jinja2:269
#: octoprint_klipper/templates/klipper_settings.jinja2:297
msgid "Sort by file size"
msgstr "Sortie nach Dateigröße"
msgstr "Sortiere nach Dateigröße"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:65
#: octoprint_klipper/templates/klipper_settings.jinja2:101
#: octoprint_klipper/templates/klipper_settings.jinja2:280
#: octoprint_klipper/templates/klipper_settings.jinja2:130
#: octoprint_klipper/templates/klipper_settings.jinja2:309
msgid "Name"
msgstr "Name"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:66
#: octoprint_klipper/templates/klipper_settings.jinja2:281
#: octoprint_klipper/templates/klipper_settings.jinja2:310
msgid "Size"
msgstr "Größe"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:67
#: octoprint_klipper/templates/klipper_settings.jinja2:282
#: octoprint_klipper/templates/klipper_settings.jinja2:311
msgid "Action"
msgstr "Aktion"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:78
#: octoprint_klipper/templates/klipper_settings.jinja2:294
#: octoprint_klipper/templates/klipper_settings.jinja2:323
msgid "Delete"
msgstr "Löschen"
@ -307,7 +395,7 @@ msgid "Restore"
msgstr "Wiederherstellen"
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:84
#: octoprint_klipper/templates/klipper_settings.jinja2:297
#: octoprint_klipper/templates/klipper_settings.jinja2:326
msgid "Download"
msgstr "Runterladen"
@ -334,14 +422,17 @@ msgstr "Datei neuladen"
#: octoprint_klipper/templates/klipper_editor.jinja2:34
#: octoprint_klipper/templates/klipper_editor.jinja2:35
msgid "Reload last version"
msgstr "Lade letzte Version"
#: octoprint_klipper/templates/klipper_editor.jinja2:37
#: octoprint_klipper/templates/klipper_editor.jinja2:38
msgid "Check Syntax"
msgstr "Syntax prüfen"
#: octoprint_klipper/templates/klipper_editor.jinja2:37
msgid "Save Config and Close"
msgstr "Speichern und schließen"
#: octoprint_klipper/templates/klipper_editor.jinja2:41
msgid "Save"
msgstr "Speichern"
#: octoprint_klipper/templates/klipper_graph_dialog.jinja2:4
msgid "Performance Graph"
msgstr "Performancediagramm"
@ -362,10 +453,6 @@ msgstr "Auswählen"
msgid "Analyze Log"
msgstr "Log analysieren"
#: octoprint_klipper/templates/klipper_graph_dialog.jinja2:27
msgid "Close"
msgstr "Schließen"
#: octoprint_klipper/templates/klipper_graph_dialog.jinja2:35
msgid "Depending on the size of the log file this might take a while."
msgstr "Abhängig von der Größe der Logdatei kann es etwas dauern."
@ -395,11 +482,6 @@ msgstr "Nächster"
msgid "Stop"
msgstr "Stop"
#: octoprint_klipper/templates/klipper_navbar.jinja2:2
#: octoprint_klipper/templates/klipper_sidebar.jinja2:11
msgid "Go to OctoKlipper Tab"
msgstr "Gehe zum OctoKlipper Reiter"
#: octoprint_klipper/templates/klipper_offset_dialog.jinja2:4
#: octoprint_klipper/templates/klipper_tab_main.jinja2:63
msgid "Coordinate Offset"
@ -455,7 +537,7 @@ msgid "Basic"
msgstr "Haupteinstellungen"
#: octoprint_klipper/templates/klipper_settings.jinja2:4
#: octoprint_klipper/templates/klipper_sidebar.jinja2:16
#: octoprint_klipper/templates/klipper_sidebar.jinja2:20
#: octoprint_klipper/templates/klipper_tab_main.jinja2:72
msgid "Macros"
msgstr "Makros"
@ -478,169 +560,215 @@ msgid "Replace Connection Panel"
msgstr "Ersetze Verbindungsmenu"
#: octoprint_klipper/templates/klipper_settings.jinja2:25
#: octoprint_klipper/templates/klipper_settings.jinja2:27
msgid ""
"Hide 'Open Editor' Button\n"
"in the Connection Panel"
msgstr ""
"Verberge 'Öffne Editor' Schaltfläche\n"
"auf der Seitenleiste"
#: octoprint_klipper/templates/klipper_settings.jinja2:32
msgid "Show Short Messages"
msgstr "Zeige Kurzmeldungen"
#: octoprint_klipper/templates/klipper_settings.jinja2:27
#: octoprint_klipper/templates/klipper_settings.jinja2:28
#: octoprint_klipper/templates/klipper_settings.jinja2:34
#: octoprint_klipper/templates/klipper_settings.jinja2:35
msgid "on NavBar"
msgstr "auf Nav-leiste"
#: octoprint_klipper/templates/klipper_settings.jinja2:29
#: octoprint_klipper/templates/klipper_settings.jinja2:30
#: octoprint_klipper/templates/klipper_settings.jinja2:36
#: octoprint_klipper/templates/klipper_settings.jinja2:37
msgid "on SideBar"
msgstr "auf Seitenleiste"
#: octoprint_klipper/templates/klipper_settings.jinja2:34
#: octoprint_klipper/templates/klipper_settings.jinja2:36
#: octoprint_klipper/templates/klipper_settings.jinja2:41
#: octoprint_klipper/templates/klipper_settings.jinja2:43
msgid "Enable debug logging"
msgstr "Aktiviere Debugloging"
#: octoprint_klipper/templates/klipper_settings.jinja2:41
#: octoprint_klipper/templates/klipper_settings.jinja2:48
#: octoprint_klipper/templates/klipper_settings.jinja2:50
msgid "Hide Error PopUps"
msgstr "Verberge Fehler PopUps"
#: octoprint_klipper/templates/klipper_settings.jinja2:55
msgid "Config Editor"
msgstr "Konfig Editor"
#: octoprint_klipper/templates/klipper_settings.jinja2:43
#: octoprint_klipper/templates/klipper_settings.jinja2:44
#: octoprint_klipper/templates/klipper_settings.jinja2:57
#: octoprint_klipper/templates/klipper_settings.jinja2:58
msgid "Check parsing on save"
msgstr "Prüfe Syntax beim speichern"
#: octoprint_klipper/templates/klipper_settings.jinja2:46
#: octoprint_klipper/templates/klipper_settings.jinja2:48
#: octoprint_klipper/templates/klipper_settings.jinja2:60
#: octoprint_klipper/templates/klipper_settings.jinja2:62
msgid "Fontsize"
msgstr "Fontgröße"
#: octoprint_klipper/templates/klipper_settings.jinja2:53
#: octoprint_klipper/templates/klipper_settings.jinja2:67
msgid "Klipper Config Directory"
msgstr "Klipper Konfig Pfad"
#: octoprint_klipper/templates/klipper_settings.jinja2:59
#: octoprint_klipper/templates/klipper_settings.jinja2:73
msgid ""
"The filename of the base config that Klipper is loading. (default is "
"printer.cfg)"
msgstr ""
"Der Dateiname der Haupt-Konfigurationsdatei, die Klipper läd.(Standard "
"ist printer.cfg)"
#: octoprint_klipper/templates/klipper_settings.jinja2:73
msgid "Klipper Base Config Filename"
msgstr "Klipper Haupt-Konfigurationsdatei"
#: octoprint_klipper/templates/klipper_settings.jinja2:79
msgid "Klipper Log File"
msgstr "Klipper Logdatei"
#: octoprint_klipper/templates/klipper_settings.jinja2:65
msgid "Configuration Reload Command"
#: octoprint_klipper/templates/klipper_settings.jinja2:85
msgid "Configuration Restart Command"
msgstr "Konfiguration Neustart Befehl"
#: octoprint_klipper/templates/klipper_settings.jinja2:72
#: octoprint_klipper/templates/klipper_settings.jinja2:92
msgid "The command that is executed if you want to restart klipper."
msgstr "Der Befehl, der ausgeführt wird, um Klipper neu zu starten."
#: octoprint_klipper/templates/klipper_settings.jinja2:74
#: octoprint_klipper/templates/klipper_settings.jinja2:75
msgid "Reload klipper on editor save?"
#: octoprint_klipper/templates/klipper_settings.jinja2:94
msgid "Restart klipper on editor save?"
msgstr "Klipper neu starten nach speichern im Editor?"
#: octoprint_klipper/templates/klipper_settings.jinja2:80
#: octoprint_klipper/templates/klipper_settings.jinja2:95
msgid "Restart Klipper on editor save?"
msgstr "Klipper neu starten nach speichern im Editor?"
#: octoprint_klipper/templates/klipper_settings.jinja2:97
msgid "Show Confirmation before restarting Klipper?"
msgstr "Zeige Bestätigung vor Klipper Neustart?"
#: octoprint_klipper/templates/klipper_settings.jinja2:98
msgid "Confirmation before restarting Klipper?"
msgstr "Bestätigung vor Klipper Neustart?"
#: octoprint_klipper/templates/klipper_settings.jinja2:103
msgid "Config Backup"
msgstr "Konfig Sicherungen"
#: octoprint_klipper/templates/klipper_settings.jinja2:82
#: octoprint_klipper/templates/klipper_settings.jinja2:83
#: octoprint_klipper/templates/klipper_settings.jinja2:105
#: octoprint_klipper/templates/klipper_settings.jinja2:106
msgid "Show Backups"
msgstr "Zeige Sicherungen"
#: octoprint_klipper/templates/klipper_settings.jinja2:93
msgid "Add macro button to:"
msgstr "Makroschaltfläche anzeigen auf:"
#: octoprint_klipper/templates/klipper_settings.jinja2:115
msgid "These macros are only meant to be used in OctoPrint."
msgstr "Diese Makros sind nur für OctoPrint gedacht."
#: octoprint_klipper/templates/klipper_settings.jinja2:94
#: octoprint_klipper/templates/klipper_settings.jinja2:108
#: octoprint_klipper/templates/klipper_settings.jinja2:116
msgid "They are not the ones that can be defined in the printer.cfg."
msgstr "Es sind nicht die, die in der printer.cfg definiert werden können."
#: octoprint_klipper/templates/klipper_settings.jinja2:122
msgid "Add macro button to:"
msgstr "Zeige Makroschaltfläche auf:"
#: octoprint_klipper/templates/klipper_settings.jinja2:123
#: octoprint_klipper/templates/klipper_settings.jinja2:137
msgid "Klipper Tab"
msgstr "Klipper Reiter"
#: octoprint_klipper/templates/klipper_settings.jinja2:95
#: octoprint_klipper/templates/klipper_settings.jinja2:111
#: octoprint_klipper/templates/klipper_settings.jinja2:124
#: octoprint_klipper/templates/klipper_settings.jinja2:140
msgid "Sidebar"
msgstr "Seitenleiste"
#: octoprint_klipper/templates/klipper_settings.jinja2:120
#: octoprint_klipper/templates/klipper_settings.jinja2:149
msgid "Command"
msgstr "Befehl"
#: octoprint_klipper/templates/klipper_settings.jinja2:133
#: octoprint_klipper/templates/klipper_settings.jinja2:162
msgid "Add Macro"
msgstr "Makro hinzufügen"
#: octoprint_klipper/templates/klipper_settings.jinja2:138
#: octoprint_klipper/templates/klipper_settings.jinja2:167
msgid ""
"To show a dialog that asks for parameters you can write your macro like "
"in the following example:"
msgstr ""
"Um ein Dialog anzeigen zu lassen, welches nach Parametern fragt, <br>\n"
"kann man ein Makro wie im nächsten Beispiel schreiben:"
"Um ein Dialog anzeigen zu lassen, welches nach Parametern fragt, kann man"
" ein Makro wie im nächsten Beispiel schreiben:"
#: octoprint_klipper/templates/klipper_settings.jinja2:154
#: octoprint_klipper/templates/klipper_settings.jinja2:183
msgid ""
"This feature assists in manually leveling you print bed by moving the "
"head to the defined points in\n"
" sequence.<br />\n"
" If you use a piece of paper for leveling, set \"Probe Height\" "
"to the paper thickness eg. \"0.1\"."
"This feature assists in manually leveling your print bed by moving the "
"head to the defined points in sequence.<br />If you use a piece of paper "
"for leveling, set \"Probe Height\" to the paper thickness eg. \"0.1\"."
msgstr ""
"Diese Funktion hilft beim Einstellen des Druckbettes, <br>\n"
"da es die angegebenen Punkte automatisch nacheinander anfährt.<br>\n"
"Wenn man ein Papier zum messen nimmt, setzt man \"Messhöhe\" <br>\n"
"auf die Papierstärke zBsp.: \"0.1\"."
"Diese Funktion hilft beim Einstellen des Druckbettes, da es die "
"angegebenen Punkte automatisch nacheinander anfährt. <br />Wenn man ein "
"Papier zum messen nimmt, setzt man \"Messhöhe\" auf die Papierstärke "
"zBsp.: \"0.1\"."
#: octoprint_klipper/templates/klipper_settings.jinja2:160
#: octoprint_klipper/templates/klipper_settings.jinja2:187
msgid "Probe Height"
msgstr "Messhöhe"
#: octoprint_klipper/templates/klipper_settings.jinja2:166
#: octoprint_klipper/templates/klipper_settings.jinja2:193
msgid "Z-height to probe at"
msgstr "Höhe bei der gemessen wird"
#: octoprint_klipper/templates/klipper_settings.jinja2:170
#: octoprint_klipper/templates/klipper_settings.jinja2:197
msgid "Probe Lift"
msgstr "Höhe für Seitenbewegung"
#: octoprint_klipper/templates/klipper_settings.jinja2:176
#: octoprint_klipper/templates/klipper_settings.jinja2:203
msgid "Lift Head by this amount before moving."
msgstr "Hebe Druckkopf auf diese Höhe vor einer Seitenbewegung"
#: octoprint_klipper/templates/klipper_settings.jinja2:180
#: octoprint_klipper/templates/klipper_settings.jinja2:207
msgid "Probe Feedrate Z"
msgstr "Geschwindigkeit Z"
#: octoprint_klipper/templates/klipper_settings.jinja2:189
#: octoprint_klipper/templates/klipper_settings.jinja2:216
msgid "Feedrate X/Y"
msgstr "Geschwindigkeit X/Y"
#: octoprint_klipper/templates/klipper_settings.jinja2:198
#: octoprint_klipper/templates/klipper_settings.jinja2:225
msgid "Probe Points"
msgstr "Messpunkte"
#: octoprint_klipper/templates/klipper_settings.jinja2:225
#: octoprint_klipper/templates/klipper_settings.jinja2:252
msgid "Add Point"
msgstr "Füge Messpunkt hinzu"
#: octoprint_klipper/templates/klipper_settings.jinja2:232
#: octoprint_klipper/templates/klipper_settings.jinja2:259
msgid "Config Files"
msgstr "Konfig Dateien"
#: octoprint_klipper/templates/klipper_settings.jinja2:246
#: octoprint_klipper/templates/klipper_settings.jinja2:273
msgid "Add new File"
msgstr "Erstelle neue Datei"
#: octoprint_klipper/templates/klipper_settings.jinja2:247
#: octoprint_klipper/templates/klipper_settings.jinja2:274
msgid "New File"
msgstr "Neue Datei"
#: octoprint_klipper/templates/klipper_settings.jinja2:249
#: octoprint_klipper/templates/klipper_settings.jinja2:276
msgid "Open last config"
msgstr "Öffne letzte Konfig"
#: octoprint_klipper/templates/klipper_settings.jinja2:250
#, fuzzy
#: octoprint_klipper/templates/klipper_settings.jinja2:277
msgid "Open last Editor"
msgstr "Öffne Editor"
#: octoprint_klipper/templates/klipper_settings.jinja2:300
#: octoprint_klipper/templates/klipper_settings.jinja2:303
msgid "Path to the config files."
msgstr "Pfad zu den Konfigurationsdateien"
#: octoprint_klipper/templates/klipper_settings.jinja2:329
msgid "Edit"
msgstr "Bearbeiten"
#: octoprint_klipper/templates/klipper_settings.jinja2:329
#: octoprint_klipper/templates/klipper_settings.jinja2:358
msgid "Donate"
msgstr "Spenden"
@ -652,7 +780,7 @@ msgstr "Druckerprofil"
msgid "Connect"
msgstr "Verbinde"
#: octoprint_klipper/templates/klipper_sidebar.jinja2:6
#: octoprint_klipper/templates/klipper_sidebar.jinja2:7
msgid "Open Editor"
msgstr "Öffne Editor"
@ -660,39 +788,31 @@ msgstr "Öffne Editor"
msgid "Messages"
msgstr "Nachricht"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:11
#: octoprint_klipper/templates/klipper_tab_main.jinja2:12
msgid "Clear Log"
msgstr "Log löschen"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:21
msgid "Query Klipper for its current status"
msgstr "Aktuellen Status von Klipper anfordern"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:22
msgid "Get Status"
msgstr "Statusabfrage"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:26
#: octoprint_klipper/templates/klipper_tab_main.jinja2:6
msgid "Open the OctoKlipper Settings"
msgstr "Öffne die OctoKlipper Einstellungen"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:16
#: octoprint_klipper/templates/klipper_tab_main.jinja2:17
msgid "Clear Log"
msgstr "Log löschen"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:26
msgid "Query Klipper for its current status"
msgstr "Aktuellen Status von Klipper anfordern"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:27
msgid "Open OctoKlipper Settings"
msgstr "Öffne OctoKlipper Einstellungen"
msgid "Get Status"
msgstr "Statusabfrage"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:31
msgid "Show the Editor"
msgstr "Öffne Editor"
msgstr "Öffne den Editor"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:33
msgid "Show Editor"
msgstr "Öffne Editor"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:39
msgid "Restart"
msgstr "Neustart"
#: octoprint_klipper/templates/klipper_tab_main.jinja2:41
msgid ""
"This will cause the host software to reload its config and perform an "

View File

@ -7,9 +7,9 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: OctoKlipper 0.3.8.3\n"
"Project-Id-Version: OctoKlipper 0.3.9.1\n"
"Report-Msgid-Bugs-To: i18n@octoprint.org\n"
"POT-Creation-Date: 2021-09-17 08:18+0200\n"
"POT-Creation-Date: 2021-11-21 00:46+0100\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"
@ -26,37 +26,72 @@ msgstr ""
msgid "Allows to use klipper macros"
msgstr ""
#: octoprint_klipper/__init__.py:608
#: octoprint_klipper/__init__.py:599
msgid "Restart Klipper"
msgstr ""
#: octoprint_klipper/__init__.py:609
#: octoprint_klipper/__init__.py:600
msgid "You are about to restart Klipper!"
msgstr ""
#: octoprint_klipper/__init__.py:609
#: octoprint_klipper/__init__.py:600
msgid "This will stop ongoing prints!"
msgstr ""
#: octoprint_klipper/cfgUtils.py:95
#: octoprint_klipper/cfgUtils.py:86
msgid "Error: Klipper config file not found at:"
msgstr ""
#: octoprint_klipper/cfgUtils.py:89
msgid "IOError:"
msgstr ""
#: octoprint_klipper/cfgUtils.py:96
msgid "Decode Error:"
msgstr ""
#: octoprint_klipper/cfgUtils.py:100
msgid "Please convert your config files to utf-8!"
msgstr ""
#: octoprint_klipper/cfgUtils.py:102
msgid ""
"Or you can also paste your config \n"
"into the Editor and save it."
msgstr ""
#: octoprint_klipper/cfgUtils.py:109
msgid "File not found!"
msgstr ""
#: octoprint_klipper/static/js/klipper.js:259
#: octoprint_klipper/static/js/klipper.js:220
#: octoprint_klipper/templates/klipper_sidebar.jinja2:13
msgid "Go to OctoKlipper Tab"
msgstr ""
#: octoprint_klipper/static/js/klipper.js:340
msgid "Restarted Klipper"
msgstr ""
#: octoprint_klipper/static/js/klipper.js:348
msgid "All ongoing Prints will be stopped!"
msgstr ""
#: octoprint_klipper/static/js/klipper.js:262
msgid "Klipper restart?"
#: octoprint_klipper/static/js/klipper.js:353
msgid "Restart Klipper?"
msgstr ""
#: octoprint_klipper/static/js/klipper.js:264
#: octoprint_klipper/static/js/klipper_backup.js:159
msgid "Proceed"
#: octoprint_klipper/static/js/klipper.js:355
#: octoprint_klipper/templates/klipper_tab_main.jinja2:39
msgid "Restart"
msgstr ""
#: octoprint_klipper/static/js/klipper.js:355
msgid "Restart and don't ask this again."
msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:126
#: octoprint_klipper/static/js/klipper_settings.js:124
#: octoprint_klipper/static/js/klipper_settings.js:134
#, python-format
msgid ""
"Failed to remove config %(name)s.</p><p>Please consult octoprint.log for "
@ -64,13 +99,13 @@ msgid ""
msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:129
#: octoprint_klipper/static/js/klipper_settings.js:127
#: octoprint_klipper/static/js/klipper_settings.js:137
msgid "Could not remove config"
msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:138
#, python-format
msgid "You are about to delete backuped config file \"%(name)s\"."
msgid "You are about to delete backed config file \"%(name)s\"."
msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:154
@ -81,14 +116,19 @@ msgstr ""
msgid "Are you sure you want to restore now?"
msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:159
#: octoprint_klipper/static/js/klipper_editor.js:173
msgid "Proceed"
msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:184
#, python-format
msgid "You are about to restore %(count)d backuped config files."
msgid "You are about to restore %(count)d backed config files."
msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:199
#, python-format
msgid "You are about to delete %(count)d backuped config files."
msgid "You are about to delete %(count)d backed config files."
msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:209
@ -97,7 +137,7 @@ msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:211
#, python-format
msgid "Restoring %(count)d backuped config files..."
msgid "Restoring %(count)d backed config files..."
msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:220
@ -116,93 +156,141 @@ msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:265
#, python-format
msgid "Deleting %(count)d backup files..."
msgid "Deleting %(count)d backed files..."
msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:273
#: octoprint_klipper/static/js/klipper_settings.js:183
#: octoprint_klipper/static/js/klipper_settings.js:193
#, python-format
msgid "Deleted %(filename)s..."
msgstr ""
#: octoprint_klipper/static/js/klipper_backup.js:279
#: octoprint_klipper/static/js/klipper_settings.js:193
#: octoprint_klipper/static/js/klipper_settings.js:203
#, python-format
msgid "Deleting of %(filename)s failed, continuing..."
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:61
#: octoprint_klipper/static/js/klipper_editor.js:79
msgid "Closing without saving"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:80
msgid "Your file seems to have changed."
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:64
#: octoprint_klipper/static/js/klipper_editor.js:82
msgid "Do you really want to close it?"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:65
msgid "No"
#: octoprint_klipper/static/js/klipper_editor.js:83
#: octoprint_klipper/templates/klipper_graph_dialog.jinja2:27
msgid "Close"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:66
msgid "Yes"
#: octoprint_klipper/static/js/klipper_editor.js:83
msgid "Do not close"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:127
#: octoprint_klipper/static/js/klipper_editor.js:134
#: octoprint_klipper/static/js/klipper_editor.js:83
#: octoprint_klipper/templates/klipper_editor.jinja2:38
msgid "Save & Close"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:168
msgid "Reload Configfile after SAVE_CONFIG?"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:171
msgid "Externally changed config"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:183
msgid "Your configuration seems to be faulty."
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:187
msgid "Save faulty Configuration?"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:189
msgid "Do not save!"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:190
msgid "Save anyway!"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:190
msgid "Save anyway and don't ask this again."
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:214
msgid "SyntaxCheck"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:127
#: octoprint_klipper/static/js/klipper_editor.js:214
msgid "SyntaxCheck OK"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:130
msgid "Syntax NOK"
#: octoprint_klipper/static/js/klipper_editor.js:249
msgid "Faulty config not saved!"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:151
#: octoprint_klipper/static/js/klipper_editor.js:161
#: octoprint_klipper/static/js/klipper_editor.js:251
#: octoprint_klipper/static/js/klipper_editor.js:275
#: octoprint_klipper/static/js/klipper_editor.js:393
#: octoprint_klipper/static/js/klipper_editor.js:406
#: octoprint_klipper/templates/klipper_editor.jinja2:40
#: octoprint_klipper/templates/klipper_editor.jinja2:41
msgid "Save Config"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:151
msgid "File saved."
#: octoprint_klipper/static/js/klipper_editor.js:273
#: octoprint_klipper/static/js/klipper_editor.js:349
msgid "No filename set"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:157
msgid "File not saved!"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:226
#: octoprint_klipper/static/js/klipper_editor.js:243
#: octoprint_klipper/static/js/klipper_editor.js:325
#: octoprint_klipper/static/js/klipper_editor.js:343
#: octoprint_klipper/static/js/klipper_editor.js:351
msgid "Reload File"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:230
#: octoprint_klipper/static/js/klipper_editor.js:329
msgid "Reload Config"
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:230
#: octoprint_klipper/static/js/klipper_editor.js:329
msgid "File reloaded."
msgstr ""
#: octoprint_klipper/static/js/klipper_settings.js:136
#: octoprint_klipper/static/js/klipper_editor.js:393
msgid "File saved."
msgstr ""
#: octoprint_klipper/static/js/klipper_editor.js:404
msgid "File not saved!"
msgstr ""
#: octoprint_klipper/static/js/klipper_settings.js:103
msgid "Path: "
msgstr ""
#: octoprint_klipper/static/js/klipper_settings.js:146
#, python-format
msgid "You are about to delete config file \"%(name)s\"."
msgstr ""
#: octoprint_klipper/static/js/klipper_settings.js:163
#: octoprint_klipper/static/js/klipper_settings.js:173
#, python-format
msgid "You are about to delete %(count)d config files."
msgstr ""
#: octoprint_klipper/static/js/klipper_settings.js:173
#: octoprint_klipper/static/js/klipper_settings.js:183
msgid "Deleting config files"
msgstr ""
#: octoprint_klipper/static/js/klipper_settings.js:174
#: octoprint_klipper/static/js/klipper_settings.js:184
#, python-format
msgid "Deleting %(count)d config files..."
msgstr ""
@ -212,27 +300,27 @@ msgid "Backups"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:17
#: octoprint_klipper/templates/klipper_settings.jinja2:240
#: octoprint_klipper/templates/klipper_settings.jinja2:267
msgid "Select all on this page"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:20
#: octoprint_klipper/templates/klipper_settings.jinja2:241
#: octoprint_klipper/templates/klipper_settings.jinja2:268
msgid "Select all"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:25
#: octoprint_klipper/templates/klipper_settings.jinja2:243
#: octoprint_klipper/templates/klipper_settings.jinja2:270
msgid "Clear selection"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:29
#: octoprint_klipper/templates/klipper_settings.jinja2:252
#: octoprint_klipper/templates/klipper_settings.jinja2:279
msgid "Refresh file list"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:30
#: octoprint_klipper/templates/klipper_settings.jinja2:253
#: octoprint_klipper/templates/klipper_settings.jinja2:280
msgid "Refresh Files"
msgstr ""
@ -241,55 +329,55 @@ msgid "Restore selected"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:36
#: octoprint_klipper/templates/klipper_settings.jinja2:256
#: octoprint_klipper/templates/klipper_settings.jinja2:283
msgid "Delete selected"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:46
#: octoprint_klipper/templates/klipper_settings.jinja2:263
#: octoprint_klipper/templates/klipper_settings.jinja2:291
msgid "Sort by name"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:47
#: octoprint_klipper/templates/klipper_settings.jinja2:264
#: octoprint_klipper/templates/klipper_settings.jinja2:292
msgid "ascending"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:50
#: octoprint_klipper/templates/klipper_settings.jinja2:266
#: octoprint_klipper/templates/klipper_settings.jinja2:294
msgid "Sort by date"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:51
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:55
#: octoprint_klipper/templates/klipper_settings.jinja2:267
#: octoprint_klipper/templates/klipper_settings.jinja2:270
#: octoprint_klipper/templates/klipper_settings.jinja2:295
#: octoprint_klipper/templates/klipper_settings.jinja2:298
msgid "descending"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:54
#: octoprint_klipper/templates/klipper_settings.jinja2:269
#: octoprint_klipper/templates/klipper_settings.jinja2:297
msgid "Sort by file size"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:65
#: octoprint_klipper/templates/klipper_settings.jinja2:101
#: octoprint_klipper/templates/klipper_settings.jinja2:280
#: octoprint_klipper/templates/klipper_settings.jinja2:130
#: octoprint_klipper/templates/klipper_settings.jinja2:309
msgid "Name"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:66
#: octoprint_klipper/templates/klipper_settings.jinja2:281
#: octoprint_klipper/templates/klipper_settings.jinja2:310
msgid "Size"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:67
#: octoprint_klipper/templates/klipper_settings.jinja2:282
#: octoprint_klipper/templates/klipper_settings.jinja2:311
msgid "Action"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:78
#: octoprint_klipper/templates/klipper_settings.jinja2:294
#: octoprint_klipper/templates/klipper_settings.jinja2:323
msgid "Delete"
msgstr ""
@ -298,7 +386,7 @@ msgid "Restore"
msgstr ""
#: octoprint_klipper/templates/klipper_backups_dialog.jinja2:84
#: octoprint_klipper/templates/klipper_settings.jinja2:297
#: octoprint_klipper/templates/klipper_settings.jinja2:326
msgid "Download"
msgstr ""
@ -325,12 +413,15 @@ msgstr ""
#: octoprint_klipper/templates/klipper_editor.jinja2:34
#: octoprint_klipper/templates/klipper_editor.jinja2:35
msgid "Reload last version"
msgid "Check Syntax"
msgstr ""
#: octoprint_klipper/templates/klipper_editor.jinja2:37
#: octoprint_klipper/templates/klipper_editor.jinja2:38
msgid "Check Syntax"
msgid "Save Config and Close"
msgstr ""
#: octoprint_klipper/templates/klipper_editor.jinja2:41
msgid "Save"
msgstr ""
#: octoprint_klipper/templates/klipper_graph_dialog.jinja2:4
@ -353,10 +444,6 @@ msgstr ""
msgid "Analyze Log"
msgstr ""
#: octoprint_klipper/templates/klipper_graph_dialog.jinja2:27
msgid "Close"
msgstr ""
#: octoprint_klipper/templates/klipper_graph_dialog.jinja2:35
msgid "Depending on the size of the log file this might take a while."
msgstr ""
@ -386,11 +473,6 @@ msgstr ""
msgid "Stop"
msgstr ""
#: octoprint_klipper/templates/klipper_navbar.jinja2:2
#: octoprint_klipper/templates/klipper_sidebar.jinja2:11
msgid "Go to OctoKlipper Tab"
msgstr ""
#: octoprint_klipper/templates/klipper_offset_dialog.jinja2:4
#: octoprint_klipper/templates/klipper_tab_main.jinja2:63
msgid "Coordinate Offset"
@ -446,7 +528,7 @@ msgid "Basic"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:4
#: octoprint_klipper/templates/klipper_sidebar.jinja2:16
#: octoprint_klipper/templates/klipper_sidebar.jinja2:20
#: octoprint_klipper/templates/klipper_tab_main.jinja2:72
msgid "Macros"
msgstr ""
@ -469,162 +551,205 @@ msgid "Replace Connection Panel"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:25
#: octoprint_klipper/templates/klipper_settings.jinja2:27
msgid ""
"Hide 'Open Editor' Button\n"
"in the Connection Panel"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:32
msgid "Show Short Messages"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:27
#: octoprint_klipper/templates/klipper_settings.jinja2:28
#: octoprint_klipper/templates/klipper_settings.jinja2:34
#: octoprint_klipper/templates/klipper_settings.jinja2:35
msgid "on NavBar"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:29
#: octoprint_klipper/templates/klipper_settings.jinja2:30
#: octoprint_klipper/templates/klipper_settings.jinja2:36
#: octoprint_klipper/templates/klipper_settings.jinja2:37
msgid "on SideBar"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:34
#: octoprint_klipper/templates/klipper_settings.jinja2:36
#: octoprint_klipper/templates/klipper_settings.jinja2:41
#: octoprint_klipper/templates/klipper_settings.jinja2:43
msgid "Enable debug logging"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:41
#: octoprint_klipper/templates/klipper_settings.jinja2:48
#: octoprint_klipper/templates/klipper_settings.jinja2:50
msgid "Hide Error PopUps"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:55
msgid "Config Editor"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:43
#: octoprint_klipper/templates/klipper_settings.jinja2:44
#: octoprint_klipper/templates/klipper_settings.jinja2:57
#: octoprint_klipper/templates/klipper_settings.jinja2:58
msgid "Check parsing on save"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:46
#: octoprint_klipper/templates/klipper_settings.jinja2:48
#: octoprint_klipper/templates/klipper_settings.jinja2:60
#: octoprint_klipper/templates/klipper_settings.jinja2:62
msgid "Fontsize"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:53
#: octoprint_klipper/templates/klipper_settings.jinja2:67
msgid "Klipper Config Directory"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:59
#: octoprint_klipper/templates/klipper_settings.jinja2:73
msgid ""
"The filename of the base config that Klipper is loading. (default is "
"printer.cfg)"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:73
msgid "Klipper Base Config Filename"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:79
msgid "Klipper Log File"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:65
msgid "Configuration Reload Command"
#: octoprint_klipper/templates/klipper_settings.jinja2:85
msgid "Configuration Restart Command"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:72
#: octoprint_klipper/templates/klipper_settings.jinja2:92
msgid "The command that is executed if you want to restart klipper."
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:74
#: octoprint_klipper/templates/klipper_settings.jinja2:75
msgid "Reload klipper on editor save?"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:80
msgid "Config Backup"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:82
#: octoprint_klipper/templates/klipper_settings.jinja2:83
msgid "Show Backups"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:93
msgid "Add macro button to:"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:94
#: octoprint_klipper/templates/klipper_settings.jinja2:108
msgid "Klipper Tab"
msgid "Restart klipper on editor save?"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:95
#: octoprint_klipper/templates/klipper_settings.jinja2:111
msgid "Restart Klipper on editor save?"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:97
msgid "Show Confirmation before restarting Klipper?"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:98
msgid "Confirmation before restarting Klipper?"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:103
msgid "Config Backup"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:105
#: octoprint_klipper/templates/klipper_settings.jinja2:106
msgid "Show Backups"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:115
msgid "These macros are only meant to be used in OctoPrint."
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:116
msgid "They are not the ones that can be defined in the printer.cfg."
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:122
msgid "Add macro button to:"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:123
#: octoprint_klipper/templates/klipper_settings.jinja2:137
msgid "Klipper Tab"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:124
#: octoprint_klipper/templates/klipper_settings.jinja2:140
msgid "Sidebar"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:120
#: octoprint_klipper/templates/klipper_settings.jinja2:149
msgid "Command"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:133
#: octoprint_klipper/templates/klipper_settings.jinja2:162
msgid "Add Macro"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:138
#: octoprint_klipper/templates/klipper_settings.jinja2:167
msgid ""
"To show a dialog that asks for parameters you can write your macro like "
"in the following example:"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:154
#: octoprint_klipper/templates/klipper_settings.jinja2:183
msgid ""
"This feature assists in manually leveling you print bed by moving the "
"head to the defined points in\n"
" sequence.<br />\n"
" If you use a piece of paper for leveling, set \"Probe Height\" "
"to the paper thickness eg. \"0.1\"."
"This feature assists in manually leveling your print bed by moving the "
"head to the defined points in sequence.<br />If you use a piece of paper "
"for leveling, set \"Probe Height\" to the paper thickness eg. \"0.1\"."
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:160
#: octoprint_klipper/templates/klipper_settings.jinja2:187
msgid "Probe Height"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:166
#: octoprint_klipper/templates/klipper_settings.jinja2:193
msgid "Z-height to probe at"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:170
#: octoprint_klipper/templates/klipper_settings.jinja2:197
msgid "Probe Lift"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:176
#: octoprint_klipper/templates/klipper_settings.jinja2:203
msgid "Lift Head by this amount before moving."
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:180
#: octoprint_klipper/templates/klipper_settings.jinja2:207
msgid "Probe Feedrate Z"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:189
#: octoprint_klipper/templates/klipper_settings.jinja2:216
msgid "Feedrate X/Y"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:198
#: octoprint_klipper/templates/klipper_settings.jinja2:225
msgid "Probe Points"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:225
#: octoprint_klipper/templates/klipper_settings.jinja2:252
msgid "Add Point"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:232
#: octoprint_klipper/templates/klipper_settings.jinja2:259
msgid "Config Files"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:246
#: octoprint_klipper/templates/klipper_settings.jinja2:273
msgid "Add new File"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:247
#: octoprint_klipper/templates/klipper_settings.jinja2:274
msgid "New File"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:249
#: octoprint_klipper/templates/klipper_settings.jinja2:276
msgid "Open last config"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:250
#: octoprint_klipper/templates/klipper_settings.jinja2:277
msgid "Open last Editor"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:300
msgid "Edit"
#: octoprint_klipper/templates/klipper_settings.jinja2:303
msgid "Path to the config files."
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:329
msgid "Edit"
msgstr ""
#: octoprint_klipper/templates/klipper_settings.jinja2:358
msgid "Donate"
msgstr ""
@ -636,7 +761,7 @@ msgstr ""
msgid "Connect"
msgstr ""
#: octoprint_klipper/templates/klipper_sidebar.jinja2:6
#: octoprint_klipper/templates/klipper_sidebar.jinja2:7
msgid "Open Editor"
msgstr ""
@ -644,25 +769,21 @@ msgstr ""
msgid "Messages"
msgstr ""
#: octoprint_klipper/templates/klipper_tab_main.jinja2:11
#: octoprint_klipper/templates/klipper_tab_main.jinja2:12
msgid "Clear Log"
msgstr ""
#: octoprint_klipper/templates/klipper_tab_main.jinja2:21
msgid "Query Klipper for its current status"
msgstr ""
#: octoprint_klipper/templates/klipper_tab_main.jinja2:22
msgid "Get Status"
msgstr ""
#: octoprint_klipper/templates/klipper_tab_main.jinja2:26
#: octoprint_klipper/templates/klipper_tab_main.jinja2:6
msgid "Open the OctoKlipper Settings"
msgstr ""
#: octoprint_klipper/templates/klipper_tab_main.jinja2:16
#: octoprint_klipper/templates/klipper_tab_main.jinja2:17
msgid "Clear Log"
msgstr ""
#: octoprint_klipper/templates/klipper_tab_main.jinja2:26
msgid "Query Klipper for its current status"
msgstr ""
#: octoprint_klipper/templates/klipper_tab_main.jinja2:27
msgid "Open OctoKlipper Settings"
msgid "Get Status"
msgstr ""
#: octoprint_klipper/templates/klipper_tab_main.jinja2:31
@ -673,10 +794,6 @@ msgstr ""
msgid "Show Editor"
msgstr ""
#: octoprint_klipper/templates/klipper_tab_main.jinja2:39
msgid "Restart"
msgstr ""
#: octoprint_klipper/templates/klipper_tab_main.jinja2:41
msgid ""
"This will cause the host software to reload its config and perform an "