From 449dd4301ee8459065c0fa3c9e2df2cf8d1b6d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Fri, 29 May 2015 19:44:11 +0200 Subject: [PATCH 1/4] Allow translations to be stored in ~/.octoprint That is the first step towards downloadable (and separately managed) translation packages, decoupled from the software's release cycle and source control. Since it will be impossible to properly maintain all languages concurrently with OctoPrint's releases, decoupling that will hopefully increase the user experience through preventing broken translations (or stalling releases due to having to wait for the translations to be updated). --- src/octoprint/server/__init__.py | 611 +++++------------------------ src/octoprint/server/util/flask.py | 41 +- src/octoprint/server/views.py | 445 +++++++++++++++++++++ src/octoprint/settings.py | 3 +- 4 files changed, 588 insertions(+), 512 deletions(-) create mode 100644 src/octoprint/server/views.py diff --git a/src/octoprint/server/__init__.py b/src/octoprint/server/__init__.py index 6f9e5f19..148704d2 100644 --- a/src/octoprint/server/__init__.py +++ b/src/octoprint/server/__init__.py @@ -7,7 +7,7 @@ __copyright__ = "Copyright (C) 2014 The OctoPrint Project - Released under terms import uuid from sockjs.tornado import SockJSRouter -from flask import Flask, render_template, send_from_directory, g, request, make_response, session, url_for +from flask import Flask, g, request, session from flask.ext.login import LoginManager, current_user from flask.ext.principal import Principal, Permission, RoleNeed, identity_loaded, UserNeed from flask.ext.babel import Babel, gettext, ngettext @@ -24,7 +24,7 @@ SUCCESS = {} NO_CONTENT = ("", 204) app = Flask("octoprint") -babel = Babel(app) +babel = None debug = False printer = None @@ -58,9 +58,6 @@ import octoprint.filemanager.analysis import octoprint.slicing from . import util -util.tornado.fix_ioloop_scheduling() -util.flask.enable_plugin_translations() - UI_API_KEY = ''.join('%02X' % ord(z) for z in uuid.uuid4().bytes) @@ -71,481 +68,8 @@ DISPLAY_VERSION = "%s (%s branch)" % (VERSION, BRANCH) if BRANCH else VERSION del versions -def get_available_locale_identifiers(locales): - result = set() - - # add available translations - for locale in locales: - result.add(locale.language) - if locale.territory: - # if a territory is specified, add that too - result.add("%s_%s" % (locale.language, locale.territory)) - - return result - - -LOCALES = [Locale.parse("en")] + babel.list_translations() -LANGUAGES = get_available_locale_identifiers(LOCALES) - - -@app.before_request -def before_request(): - g.locale = get_locale() - -@app.after_request -def after_request(response): - # send no-cache headers with all POST responses - if request.method == "POST": - response.cache_control.no_cache = True - response.headers.add("X-Clacks-Overhead", "GNU Terry Pratchett") - return response - - -@babel.localeselector -def get_locale(): - if "l10n" in request.values: - return Locale.negotiate([request.values["l10n"]], LANGUAGES) - - if hasattr(g, "identity") and g.identity and userManager is not None: - userid = g.identity.id - try: - user_language = userManager.getUserSetting(userid, ("interface", "language")) - if user_language is not None and not user_language == "_default": - return Locale.negotiate([user_language], LANGUAGES) - except octoprint.users.UnknownUser: - pass - - default_language = settings().get(["appearance", "defaultLanguage"]) - if default_language is not None and not default_language == "_default" and default_language in LANGUAGES: - return Locale.negotiate([default_language], LANGUAGES) - - return request.accept_languages.best_match(LANGUAGES) - - -@app.route("/") -@util.flask.cached(refreshif=lambda: util.flask.cache_check_headers() or "_refresh" in request.values, key=lambda: "view/%s/%s" % (request.path, g.locale)) -def index(): - - #~~ a bunch of settings - - enable_gcodeviewer = settings().getBoolean(["gcodeViewer", "enabled"]) - enable_timelapse = (settings().get(["webcam", "snapshot"]) and settings().get(["webcam", "ffmpeg"])) - enable_systemmenu = settings().get(["system"]) is not None and settings().get(["system", "actions"]) is not None and len(settings().get(["system", "actions"])) > 0 - enable_accesscontrol = userManager is not None - preferred_stylesheet = settings().get(["devel", "stylesheet"]) - locales = dict((l.language, dict(language=l.language, display=l.display_name, english=l.english_name)) for l in LOCALES) - -#~~ prepare assets - - supported_stylesheets = ("css", "less") - assets = dict( - js=[], - stylesheets=[] - ) - assets["js"] = [ - url_for('static', filename='js/app/viewmodels/appearance.js'), - url_for('static', filename='js/app/viewmodels/connection.js'), - url_for('static', filename='js/app/viewmodels/control.js'), - url_for('static', filename='js/app/viewmodels/firstrun.js'), - url_for('static', filename='js/app/viewmodels/files.js'), - url_for('static', filename='js/app/viewmodels/loginstate.js'), - url_for('static', filename='js/app/viewmodels/navigation.js'), - url_for('static', filename='js/app/viewmodels/printerstate.js'), - url_for('static', filename='js/app/viewmodels/printerprofiles.js'), - url_for('static', filename='js/app/viewmodels/settings.js'), - url_for('static', filename='js/app/viewmodels/slicing.js'), - url_for('static', filename='js/app/viewmodels/temperature.js'), - url_for('static', filename='js/app/viewmodels/terminal.js'), - url_for('static', filename='js/app/viewmodels/users.js'), - url_for('static', filename='js/app/viewmodels/log.js'), - url_for('static', filename='js/app/viewmodels/usersettings.js') - ] - if enable_gcodeviewer: - assets["js"] += [ - url_for('static', filename='js/app/viewmodels/gcode.js'), - url_for('static', filename='gcodeviewer/js/ui.js'), - url_for('static', filename='gcodeviewer/js/gCodeReader.js'), - url_for('static', filename='gcodeviewer/js/renderer.js') - ] - if enable_timelapse: - assets["js"].append(url_for('static', filename='js/app/viewmodels/timelapse.js')) - - if preferred_stylesheet == "less": - assets["stylesheets"].append(("less", url_for('static', filename='less/octoprint.less'))) - elif preferred_stylesheet == "css": - assets["stylesheets"].append(("css", url_for('static', filename='css/octoprint.css'))) - - asset_plugins = pluginManager.get_implementations(octoprint.plugin.AssetPlugin) - for implementation in asset_plugins: - name = implementation._identifier - all_assets = implementation.get_assets() - - if "js" in all_assets: - for asset in all_assets["js"]: - assets["js"].append(url_for('plugin_assets', name=name, filename=asset)) - - if preferred_stylesheet in all_assets: - for asset in all_assets[preferred_stylesheet]: - assets["stylesheets"].append((preferred_stylesheet, url_for('plugin_assets', name=name, filename=asset))) - else: - for stylesheet in supported_stylesheets: - if not stylesheet in all_assets: - continue - - for asset in all_assets[stylesheet]: - assets["stylesheets"].append((stylesheet, url_for('plugin_assets', name=name, filename=asset))) - break - - ##~~ prepare templates - - templates = dict( - navbar=dict(order=[], entries=dict()), - sidebar=dict(order=[], entries=dict()), - tab=dict(order=[], entries=dict()), - settings=dict(order=[], entries=dict()), - usersettings=dict(order=[], entries=dict()), - generic=dict(order=[], entries=dict()) - ) - template_types = templates.keys() - - # navbar - - templates["navbar"]["entries"] = dict( - settings=dict(template="navbar/settings.jinja2", _div="navbar_settings", styles=["display: none"], data_bind="visible: loginState.isAdmin") - ) - if enable_accesscontrol: - templates["navbar"]["entries"]["login"] = dict(template="navbar/login.jinja2", _div="navbar_login", classes=["dropdown"], custom_bindings=False) - if enable_systemmenu: - templates["navbar"]["entries"]["systemmenu"] = dict(template="navbar/systemmenu.jinja2", _div="navbar_systemmenu", styles=["display: none"], classes=["dropdown"], data_bind="visible: loginState.isAdmin", custom_bindings=False) - - # sidebar - - templates["sidebar"]["entries"]= dict( - connection=(gettext("Connection"), dict(template="sidebar/connection.jinja2", _div="connection", icon="signal", styles_wrapper=["display: none"], data_bind="visible: loginState.isAdmin")), - state=(gettext("State"), dict(template="sidebar/state.jinja2", _div="state", icon="info-sign")), - files=(gettext("Files"), dict(template="sidebar/files.jinja2", _div="files", icon="list", classes_content=["overflow_visible"], template_header="sidebar/files_header.jinja2")) - ) - - # tabs - - templates["tab"]["entries"] = dict( - temperature=(gettext("Temperature"), dict(template="tabs/temperature.jinja2", _div="temp")), - control=(gettext("Control"), dict(template="tabs/control.jinja2", _div="control")), - terminal=(gettext("Terminal"), dict(template="tabs/terminal.jinja2", _div="term")), - ) - if enable_gcodeviewer: - templates["tab"]["entries"]["gcodeviewer"] = (gettext("GCode Viewer"), dict(template="tabs/gcodeviewer.jinja2", _div="gcode")) - if enable_timelapse: - templates["tab"]["entries"]["timelapse"] = (gettext("Timelapse"), dict(template="tabs/timelapse.jinja2", _div="timelapse")) - - # settings dialog - - templates["settings"]["entries"] = dict( - section_printer=(gettext("Printer"), None), - - serial=(gettext("Serial Connection"), dict(template="dialogs/settings/serialconnection.jinja2", _div="settings_serialConnection", custom_bindings=False)), - printerprofiles=(gettext("Printer Profiles"), dict(template="dialogs/settings/printerprofiles.jinja2", _div="settings_printerProfiles", custom_bindings=False)), - temperatures=(gettext("Temperatures"), dict(template="dialogs/settings/temperatures.jinja2", _div="settings_temperature", custom_bindings=False)), - terminalfilters=(gettext("Terminal Filters"), dict(template="dialogs/settings/terminalfilters.jinja2", _div="settings_terminalFilters", custom_bindings=False)), - gcodescripts=(gettext("GCODE Scripts"), dict(template="dialogs/settings/gcodescripts.jinja2", _div="settings_gcodeScripts", custom_bindings=False)), - - section_features=(gettext("Features"), None), - - features=(gettext("Features"), dict(template="dialogs/settings/features.jinja2", _div="settings_features", custom_bindings=False)), - webcam=(gettext("Webcam"), dict(template="dialogs/settings/webcam.jinja2", _div="settings_webcam", custom_bindings=False)), - api=(gettext("API"), dict(template="dialogs/settings/api.jinja2", _div="settings_api", custom_bindings=False)), - - section_octoprint=(gettext("OctoPrint"), None), - - folders=(gettext("Folders"), dict(template="dialogs/settings/folders.jinja2", _div="settings_folders", custom_bindings=False)), - appearance=(gettext("Appearance"), dict(template="dialogs/settings/appearance.jinja2", _div="settings_appearance", custom_bindings=False)), - logs=(gettext("Logs"), dict(template="dialogs/settings/logs.jinja2", _div="settings_logs")), - ) - if enable_accesscontrol: - templates["settings"]["entries"]["accesscontrol"] = (gettext("Access Control"), dict(template="dialogs/settings/accesscontrol.jinja2", _div="settings_users", custom_bindings=False)) - - # user settings dialog - - if enable_accesscontrol: - templates["usersettings"]["entries"] = dict( - access=(gettext("Access"), dict(template="dialogs/usersettings/access.jinja2", _div="usersettings_access", custom_bindings=False)), - interface=(gettext("Interface"), dict(template="dialogs/usersettings/interface.jinja2", _div="usersettings_interface", custom_bindings=False)), - ) - - # extract data from template plugins - - template_plugins = pluginManager.get_implementations(octoprint.plugin.TemplatePlugin) - - # rules for transforming template configs to template entries - rules = dict( - navbar=dict(div=lambda x: "navbar_plugin_" + x, template=lambda x: x + "_navbar.jinja2", to_entry=lambda data: data), - sidebar=dict(div=lambda x: "sidebar_plugin_" + x, template=lambda x: x + "_sidebar.jinja2", to_entry=lambda data: (data["name"], data)), - tab=dict(div=lambda x: "tab_plugin_" + x, template=lambda x: x + "_tab.jinja2", to_entry=lambda data: (data["name"], data)), - settings=dict(div=lambda x: "settings_plugin_" + x, template=lambda x: x + "_settings.jinja2", to_entry=lambda data: (data["name"], data)), - usersettings=dict(div=lambda x: "usersettings_plugin_" + x, template=lambda x: x + "_usersettings.jinja2", to_entry=lambda data: (data["name"], data)), - generic=dict(template=lambda x: x + ".jinja2", to_entry=lambda data: data) - ) - - plugin_vars = dict() - plugin_names = set() - for implementation in template_plugins: - name = implementation._identifier - plugin_names.add(name) - - vars = implementation.get_template_vars() - if not isinstance(vars, dict): - vars = dict() - - for var_name, var_value in vars.items(): - plugin_vars["plugin_" + name + "_" + var_name] = var_value - - configs = implementation.get_template_configs() - if not isinstance(configs, (list, tuple)): - configs = [] - - includes = _process_template_configs(name, implementation, configs, rules) - - for t in template_types: - for include in includes[t]: - if t == "navbar" or t == "generic": - data = include - else: - data = include[1] - - key = data["_key"] - if "replaces" in data: - key = data["replaces"] - templates[t]["entries"][key] = include - - #~~ order internal templates and plugins - - # make sure that - # 1) we only have keys in our ordered list that we have entries for and - # 2) we have all entries located somewhere within the order - - for t in template_types: - default_order = settings().get(["appearance", "components", "order", t], merged=True, config=dict()) - configured_order = settings().get(["appearance", "components", "order", t], merged=True) - configured_disabled = settings().get(["appearance", "components", "disabled", t]) - - # first create the ordered list of all component ids according to the configured order - templates[t]["order"] = [x for x in configured_order if x in templates[t]["entries"] and not x in configured_disabled] - - # now append the entries from the default order that are not already in there - templates[t]["order"] += [x for x in default_order if not x in templates[t]["order"] and x in templates[t]["entries"] and not x in configured_disabled] - - all_ordered = set(templates[t]["order"]) - all_disabled = set(configured_disabled) - - # check if anything is missing, if not we are done here - missing_in_order = set(templates[t]["entries"].keys()).difference(all_ordered).difference(all_disabled) - if len(missing_in_order) == 0: - continue - - # finally add anything that's not included in our order yet - sorted_missing = list(missing_in_order) - if not t == "navbar" and not t == "generic": - # anything but navbar and generic components get sorted by their name - sorted_missing = sorted(missing_in_order, key=lambda x: templates[t]["entries"][x][0]) - - if t == "navbar": - # additional navbar components are prepended - templates[t]["order"] = sorted_missing + templates[t]["order"] - elif t == "sidebar" or t == "tab" or t == "generic" or t == "usersettings": - # additional sidebar, generic or usersettings components are appended - templates[t]["order"] += sorted_missing - elif t == "settings": - # additional settings items are added to the plugin section - templates[t]["entries"]["section_plugins"] = (gettext("Plugins"), None) - templates[t]["order"] += ["section_plugins"] + sorted_missing - - #~~ prepare full set of template vars for rendering - - render_kwargs = dict( - webcamStream=settings().get(["webcam", "stream"]), - enableTemperatureGraph=settings().get(["feature", "temperatureGraph"]), - enableAccessControl=userManager is not None, - enableSdSupport=settings().get(["feature", "sdSupport"]), - firstRun=settings().getBoolean(["server", "firstRun"]) and (userManager is None or not userManager.hasBeenCustomized()), - debug=debug, - version=VERSION, - display_version=DISPLAY_VERSION, - gcodeMobileThreshold=settings().get(["gcodeViewer", "mobileSizeThreshold"]), - gcodeThreshold=settings().get(["gcodeViewer", "sizeThreshold"]), - uiApiKey=UI_API_KEY, - templates=templates, - assets=assets, - pluginNames=plugin_names, - locales=locales - ) - render_kwargs.update(plugin_vars) - - #~~ render! - - return render_template( - "index.jinja2", - **render_kwargs - ) - - -def _process_template_configs(name, implementation, configs, rules): - from jinja2.exceptions import TemplateNotFound - - counters = dict( - navbar=1, - sidebar=1, - tab=1, - settings=1, - generic=1 - ) - includes = defaultdict(list) - - for config in configs: - if not isinstance(config, dict): - continue - if not "type" in config: - continue - - template_type = config["type"] - del config["type"] - - if not template_type in rules: - continue - rule = rules[template_type] - - data = _process_template_config(name, implementation, rule, config=config, counter=counters[template_type]) - if data is None: - continue - - includes[template_type].append(rule["to_entry"](data)) - counters[template_type] += 1 - - for template_type in rules: - if len(includes[template_type]) == 0: - # if no template of that type was added by the config, we'll try to use the default template name - rule = rules[template_type] - data = _process_template_config(name, implementation, rule) - if data is not None: - try: - app.jinja_env.get_or_select_template(data["template"]) - except TemplateNotFound: - pass - else: - includes[template_type].append(rule["to_entry"](data)) - - return includes - -def _process_template_config(name, implementation, rule, config=None, counter=1): - if "mandatory" in rule: - for mandatory in rule["mandatory"]: - if not mandatory in config: - return None - - if config is None: - config = dict() - data = dict(config) - - if not "suffix" in data and counter > 1: - data["suffix"] = "_%d" % counter - - if "div" in data: - data["_div"] = data["div"] - elif "div" in rule: - data["_div"] = rule["div"](name) - if "suffix" in data: - data["_div"] = data["_div"] + data["suffix"] - - if not "template" in data: - data["template"] = rule["template"](name) - - if not "name" in data: - data["name"] = implementation._plugin_name - - if not "custom_bindings" in data or data["custom_bindings"]: - data_bind = "allowBindings: true" - if "data_bind" in data: - data_bind = data_bind + ", " + data["data_bind"] - data["data_bind"] = data_bind - - data["_key"] = "plugin_" + name - if "suffix" in data: - data["_key"] += data["suffix"] - - return data - -@app.route("/robots.txt") -def robotsTxt(): - return send_from_directory(app.static_folder, "robots.txt") - - -@app.route("/i18n//.js") -@util.flask.cached(refreshif=lambda: util.flask.cache_check_headers() or "_refresh" in request.values, key=lambda: "view/%s/%s" % (request.path, g.locale)) -def localeJs(locale, domain): - from flask import _request_ctx_stack - from babel.messages.pofile import read_po - - def messages_from_po(base_path, locale, domain): - path = os.path.join(base_path, locale) - if not os.path.isdir(path): - return dict(), None - - path = os.path.join(path, "LC_MESSAGES", "{domain}.po".format(**locals())) - if not os.path.isfile(path): - return dict(), None - - messages = dict() - with file(path) as f: - catalog = read_po(f, locale=locale, domain=domain) - - for message in catalog: - message_id = message.id - if isinstance(message_id, (list, tuple)): - message_id = message_id[0] - messages[message_id] = message.string - - return messages, catalog.plural_expr - - messages = dict() - - ctx = _request_ctx_stack.top - base_path = os.path.join(ctx.app.root_path, "translations") - - plugins = octoprint.plugin.plugin_manager().enabled_plugins - for name, plugin in plugins.items(): - plugin_path = os.path.join(plugin.location, 'translations') - plugin_messages, _ = messages_from_po(plugin_path, locale, domain) - messages = octoprint.util.dict_merge(messages, plugin_messages) - - core_messages, plural_expr = messages_from_po(base_path, locale, domain) - messages = octoprint.util.dict_merge(messages, core_messages) - - catalog = dict( - messages=messages, - plural_expr=plural_expr, - locale=locale, - domain=domain - ) - - return render_template("i18n.js.jinja2", catalog=catalog) - - -@app.route("/plugin_assets//") -def plugin_assets(name, filename): - asset_plugins = pluginManager.get_filtered_implementations(lambda p: p._identifier == name, octoprint.plugin.AssetPlugin) - - if not asset_plugins: - return make_response("Asset not found", 404) - - if len(asset_plugins) > 1: - return make_response("More than one asset provider for {name}, can't proceed".format(name=name), 500) - - asset_plugin = asset_plugins[0] - asset_folder = asset_plugin.get_asset_folder() - if asset_folder is None: - return make_response("Asset not found", 404) - - return send_from_directory(asset_folder, filename) - +LOCALES = [] +LANGUAGES = set() @identity_loaded.connect_via(app) def on_identity_loaded(sender, identity): @@ -559,7 +83,6 @@ def on_identity_loaded(sender, identity): if user.is_admin(): identity.provides.add(RoleNeed("admin")) - def load_user(id): if id == "_api": return users.ApiUser() @@ -601,6 +124,9 @@ class Server(): if not self._allowRoot: self._check_for_root() + global app + global babel + global printer global printerProfileManager global fileManager @@ -621,7 +147,17 @@ class Server(): debug = self._debug # first initialize the settings singleton and make sure it uses given configfile and basedir if available - settings(init=True, basedir=self._basedir, configfile=self._configfile) + s = settings(init=True, basedir=self._basedir, configfile=self._configfile) + + # then monkey patch a bunch of stuff + util.tornado.fix_ioloop_scheduling() + util.flask.enable_additional_translations(additional_folders=[s.getBaseFolder("translations")]) + + # setup app + self._setup_app() + + # setup i18n + self._setup_i18n(app) # then initialize logging self._setup_logging(self._debug, self._logConf) @@ -637,9 +173,9 @@ class Server(): printerProfileManager = PrinterProfileManager() eventManager = events.eventManager() analysisQueue = octoprint.filemanager.analysis.AnalysisQueue() - slicingManager = octoprint.slicing.SlicingManager(settings().getBaseFolder("slicingProfiles"), printerProfileManager) + slicingManager = octoprint.slicing.SlicingManager(s.getBaseFolder("slicingProfiles"), printerProfileManager) storage_managers = dict() - storage_managers[octoprint.filemanager.FileDestinations.LOCAL] = octoprint.filemanager.storage.LocalFileStorage(settings().getBaseFolder("uploads")) + storage_managers[octoprint.filemanager.FileDestinations.LOCAL] = octoprint.filemanager.storage.LocalFileStorage(s.getBaseFolder("uploads")) fileManager = octoprint.filemanager.FileManager(analysisQueue, slicingManager, printerProfileManager, initial_storage_managers=storage_managers) printer = Printer(fileManager, analysisQueue, printerProfileManager) appSessionManager = util.flask.AppSessionManager() @@ -705,8 +241,8 @@ class Server(): if self._debug: events.DebugEventListener() - if settings().getBoolean(["accessControl", "enabled"]): - userManagerName = settings().get(["accessControl", "userManager"]) + if s.getBoolean(["accessControl", "enabled"]): + userManagerName = s.get(["accessControl", "userManager"]) try: clazz = octoprint.util.get_class(userManagerName) userManager = clazz() @@ -715,22 +251,22 @@ class Server(): app.wsgi_app = util.ReverseProxied( app.wsgi_app, - settings().get(["server", "reverseProxy", "prefixHeader"]), - settings().get(["server", "reverseProxy", "schemeHeader"]), - settings().get(["server", "reverseProxy", "hostHeader"]), - settings().get(["server", "reverseProxy", "prefixFallback"]), - settings().get(["server", "reverseProxy", "schemeFallback"]), - settings().get(["server", "reverseProxy", "hostFallback"]) + s.get(["server", "reverseProxy", "prefixHeader"]), + s.get(["server", "reverseProxy", "schemeHeader"]), + s.get(["server", "reverseProxy", "hostHeader"]), + s.get(["server", "reverseProxy", "prefixFallback"]), + s.get(["server", "reverseProxy", "schemeFallback"]), + s.get(["server", "reverseProxy", "hostFallback"]) ) - secret_key = settings().get(["server", "secretKey"]) + secret_key = s.get(["server", "secretKey"]) if not secret_key: import string from random import choice chars = string.ascii_lowercase + string.ascii_uppercase + string.digits secret_key = "".join(choice(chars) for _ in xrange(32)) - settings().set(["server", "secretKey"], secret_key) - settings().save() + s.set(["server", "secretKey"], secret_key) + s.save() app.secret_key = secret_key loginManager = LoginManager() loginManager.session_protection = "strong" @@ -741,9 +277,9 @@ class Server(): loginManager.init_app(app) if self._host is None: - self._host = settings().get(["server", "host"]) + self._host = s.get(["server", "host"]) if self._port is None: - self._port = settings().getInt(["server", "port"]) + self._port = s.getInt(["server", "port"]) app.debug = self._debug @@ -762,13 +298,13 @@ class Server(): self._router = SockJSRouter(self._create_socket_connection, "/sockjs") - upload_suffixes = dict(name=settings().get(["server", "uploads", "nameSuffix"]), path=settings().get(["server", "uploads", "pathSuffix"])) + upload_suffixes = dict(name=s.get(["server", "uploads", "nameSuffix"]), path=s.get(["server", "uploads", "pathSuffix"])) server_routes = self._router.urls + [ - (r"/downloads/timelapse/([^/]*\.mpg)", util.tornado.LargeResponseHandler, dict(path=settings().getBaseFolder("timelapse"), as_attachment=True)), - (r"/downloads/files/local/(.*)", util.tornado.LargeResponseHandler, dict(path=settings().getBaseFolder("uploads"), as_attachment=True, path_validation=util.tornado.path_validation_factory(lambda path: not os.path.basename(path).startswith("."), status_code=404))), - (r"/downloads/logs/([^/]*)", util.tornado.LargeResponseHandler, dict(path=settings().getBaseFolder("logs"), as_attachment=True, access_validation=util.tornado.access_validation_factory(app, loginManager, util.flask.admin_validator))), - (r"/downloads/camera/current", util.tornado.UrlForwardHandler, dict(url=settings().get(["webcam", "snapshot"]), as_attachment=True, access_validation=util.tornado.access_validation_factory(app, loginManager, util.flask.user_validator))), + (r"/downloads/timelapse/([^/]*\.mpg)", util.tornado.LargeResponseHandler, dict(path=s.getBaseFolder("timelapse"), as_attachment=True)), + (r"/downloads/files/local/(.*)", util.tornado.LargeResponseHandler, dict(path=s.getBaseFolder("uploads"), as_attachment=True, path_validation=util.tornado.path_validation_factory(lambda path: not os.path.basename(path).startswith("."), status_code=404))), + (r"/downloads/logs/([^/]*)", util.tornado.LargeResponseHandler, dict(path=s.getBaseFolder("logs"), as_attachment=True, access_validation=util.tornado.access_validation_factory(app, loginManager, util.flask.admin_validator))), + (r"/downloads/camera/current", util.tornado.UrlForwardHandler, dict(url=s.get(["webcam", "snapshot"]), as_attachment=True, access_validation=util.tornado.access_validation_factory(app, loginManager, util.flask.user_validator))), ] for name, hook in pluginManager.get_hooks("octoprint.server.http.routes").items(): try: @@ -795,7 +331,7 @@ class Server(): self._tornado_app = Application(server_routes) max_body_sizes = [ - ("POST", r"/api/files/([^/]*)", settings().getInt(["server", "uploads", "maxSize"])) + ("POST", r"/api/files/([^/]*)", s.getInt(["server", "uploads", "maxSize"])) ] # allow plugins to extend allowed maximum body sizes @@ -820,12 +356,12 @@ class Server(): self._logger.debug("Adding maximum body size of {size}B for {method} requests to {route})".format(**locals())) max_body_sizes.append((method, route, size)) - self._server = util.tornado.CustomHTTPServer(self._tornado_app, max_body_sizes=max_body_sizes, default_max_body_size=settings().getInt(["server", "maxSize"])) + self._server = util.tornado.CustomHTTPServer(self._tornado_app, max_body_sizes=max_body_sizes, default_max_body_size=s.getInt(["server", "maxSize"])) self._server.listen(self._port, address=self._host) eventManager.fire(events.Events.STARTUP) - if settings().getBoolean(["serial", "autoconnect"]): - (port, baudrate) = settings().get(["serial", "port"]), settings().getInt(["serial", "baudrate"]) + if s.getBoolean(["serial", "autoconnect"]): + (port, baudrate) = s.get(["serial", "port"]), s.getInt(["serial", "baudrate"]) printer_profile = printerProfileManager.get_default() connectionOptions = get_connection_options() if port in connectionOptions["ports"]: @@ -833,7 +369,7 @@ class Server(): # start up watchdogs observer = Observer() - observer.schedule(util.watchdog.GcodeWatchdogHandler(fileManager, printer), settings().getBaseFolder("watched")) + observer.schedule(util.watchdog.GcodeWatchdogHandler(fileManager, printer), s.getBaseFolder("watched")) observer.start() # run our startup plugins @@ -897,6 +433,27 @@ class Server(): if "geteuid" in dir(os) and os.geteuid() == 0: exit("You should not run OctoPrint as root!") + def _get_locale(self): + global LANGUAGES + + if "l10n" in request.values: + return Locale.negotiate([request.values["l10n"]], LANGUAGES) + + if hasattr(g, "identity") and g.identity and userManager is not None: + userid = g.identity.id + try: + user_language = userManager.getUserSetting(userid, ("interface", "language")) + if user_language is not None and not user_language == "_default": + return Locale.negotiate([user_language], LANGUAGES) + except octoprint.users.UnknownUser: + pass + + default_language = settings().get(["appearance", "defaultLanguage"]) + if default_language is not None and not default_language == "_default" and default_language in LANGUAGES: + return Locale.negotiate([default_language], LANGUAGES) + + return request.accept_languages.best_match(LANGUAGES) + def _setup_logging(self, debug, logConf=None): defaultConfig = { "version": 1, @@ -971,6 +528,45 @@ class Server(): logging.getLogger("SERIAL").setLevel(logging.DEBUG) logging.getLogger("SERIAL").debug("Enabling serial logging") + def _setup_app(self): + @app.before_request + def before_request(): + g.locale = self._get_locale() + + @app.after_request + def after_request(response): + # send no-cache headers with all POST responses + if request.method == "POST": + response.cache_control.no_cache = True + response.headers.add("X-Clacks-Overhead", "GNU Terry Pratchett") + return response + + def _setup_i18n(self, app): + global babel + global LOCALES + global LANGUAGES + + babel = Babel(app) + + def get_available_locale_identifiers(locales): + result = set() + + # add available translations + for locale in locales: + result.add(locale.language) + if locale.territory: + # if a territory is specified, add that too + result.add("%s_%s" % (locale.language, locale.territory)) + + return result + + LOCALES = [Locale.parse("en")] + babel.list_translations() + LANGUAGES = get_available_locale_identifiers(LOCALES) + + @babel.localeselector + def get_locale(): + return self._get_locale() + def _setup_jinja2(self): app.jinja_env.add_extension("jinja2.ext.do") @@ -1006,6 +602,7 @@ class Server(): def _setup_blueprints(self): from octoprint.server.api import api from octoprint.server.apps import apps + import octoprint.server.views app.register_blueprint(api, url_prefix="/api") app.register_blueprint(apps, url_prefix="/apps") diff --git a/src/octoprint/server/util/flask.py b/src/octoprint/server/util/flask.py index e1aa70e2..6333de91 100644 --- a/src/octoprint/server/util/flask.py +++ b/src/octoprint/server/util/flask.py @@ -26,14 +26,43 @@ from werkzeug.contrib.cache import SimpleCache #~~ monkey patching -def enable_plugin_translations(): +def enable_additional_translations(additional_folders=None): import os from flask import _request_ctx_stack - from babel import support + from babel import support, Locale import flask.ext.babel import octoprint.plugin + if additional_folders is None: + additional_folders = [] + + def fixed_list_translations(self): + """Returns a list of all the locales translations exist for. The + list returned will be filled with actual locale objects and not just + strings. + """ + def list_translations(dirname): + if not os.path.isdir(dirname): + return [] + result = [] + for folder in os.listdir(dirname): + locale_dir = os.path.join(dirname, folder, 'LC_MESSAGES') + if not os.path.isdir(locale_dir): + continue + if filter(lambda x: x.endswith('.mo'), os.listdir(locale_dir)): + result.append(Locale.parse(folder)) + if not result: + result.append(Locale.parse(self._default_locale)) + return result + + dirs = [os.path.join(self.app.root_path, 'translations')] + additional_folders + + result = [] + for dir in dirs: + result += list_translations(dir) + return result + def fixed_get_translations(): """Returns the correct gettext translations that should be used for this request. This will never fail and return a dummy translation @@ -63,13 +92,17 @@ def enable_plugin_translations(): else: translations = translations.merge(plugin_translations) - dirname = os.path.join(ctx.app.root_path, 'translations') - core_translations = support.Translations.load(dirname, [locale]) + dirs = [os.path.join(ctx.app.root_path, 'translations')] + additional_folders + for dirname in dirs: + core_translations = support.Translations.load(dirname, [locale]) + if not isinstance(core_translations, support.NullTranslations): + break translations = translations.merge(core_translations) ctx.babel_translations = translations return translations + flask.ext.babel.Babel.list_translations = fixed_list_translations flask.ext.babel.get_translations = fixed_get_translations #~~ passive login helper diff --git a/src/octoprint/server/views.py b/src/octoprint/server/views.py new file mode 100644 index 00000000..c0a2386d --- /dev/null +++ b/src/octoprint/server/views.py @@ -0,0 +1,445 @@ +# coding=utf-8 +from __future__ import absolute_import + +__author__ = "Gina Häußge " +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' +__copyright__ = "Copyright (C) 2015 The OctoPrint Project - Released under terms of the AGPLv3 License" + +import os + +from collections import defaultdict +from flask import request, g, url_for, make_response, render_template, send_from_directory + +import octoprint.plugin + +from octoprint.server import app, userManager, pluginManager, gettext, debug, LOCALES, VERSION, DISPLAY_VERSION, UI_API_KEY +from octoprint.settings import settings + +from . import util + + +@app.route("/") +@util.flask.cached(refreshif=lambda: util.flask.cache_check_headers() or "_refresh" in request.values, key=lambda: "view/%s/%s" % (request.path, g.locale)) +def index(): + + #~~ a bunch of settings + + enable_gcodeviewer = settings().getBoolean(["gcodeViewer", "enabled"]) + enable_timelapse = (settings().get(["webcam", "snapshot"]) and settings().get(["webcam", "ffmpeg"])) + enable_systemmenu = settings().get(["system"]) is not None and settings().get(["system", "actions"]) is not None and len(settings().get(["system", "actions"])) > 0 + enable_accesscontrol = userManager is not None + preferred_stylesheet = settings().get(["devel", "stylesheet"]) + locales = dict((l.language, dict(language=l.language, display=l.display_name, english=l.english_name)) for l in LOCALES) + + #~~ prepare assets + + supported_stylesheets = ("css", "less") + assets = dict( + js=[], + stylesheets=[] + ) + assets["js"] = [ + url_for('static', filename='js/app/viewmodels/appearance.js'), + url_for('static', filename='js/app/viewmodels/connection.js'), + url_for('static', filename='js/app/viewmodels/control.js'), + url_for('static', filename='js/app/viewmodels/firstrun.js'), + url_for('static', filename='js/app/viewmodels/files.js'), + url_for('static', filename='js/app/viewmodels/loginstate.js'), + url_for('static', filename='js/app/viewmodels/navigation.js'), + url_for('static', filename='js/app/viewmodels/printerstate.js'), + url_for('static', filename='js/app/viewmodels/printerprofiles.js'), + url_for('static', filename='js/app/viewmodels/settings.js'), + url_for('static', filename='js/app/viewmodels/slicing.js'), + url_for('static', filename='js/app/viewmodels/temperature.js'), + url_for('static', filename='js/app/viewmodels/terminal.js'), + url_for('static', filename='js/app/viewmodels/users.js'), + url_for('static', filename='js/app/viewmodels/log.js'), + url_for('static', filename='js/app/viewmodels/usersettings.js') + ] + if enable_gcodeviewer: + assets["js"] += [ + url_for('static', filename='js/app/viewmodels/gcode.js'), + url_for('static', filename='gcodeviewer/js/ui.js'), + url_for('static', filename='gcodeviewer/js/gCodeReader.js'), + url_for('static', filename='gcodeviewer/js/renderer.js') + ] + if enable_timelapse: + assets["js"].append(url_for('static', filename='js/app/viewmodels/timelapse.js')) + + if preferred_stylesheet == "less": + assets["stylesheets"].append(("less", url_for('static', filename='less/octoprint.less'))) + elif preferred_stylesheet == "css": + assets["stylesheets"].append(("css", url_for('static', filename='css/octoprint.css'))) + + asset_plugins = pluginManager.get_implementations(octoprint.plugin.AssetPlugin) + for implementation in asset_plugins: + name = implementation._identifier + all_assets = implementation.get_assets() + + if "js" in all_assets: + for asset in all_assets["js"]: + assets["js"].append(url_for('plugin_assets', name=name, filename=asset)) + + if preferred_stylesheet in all_assets: + for asset in all_assets[preferred_stylesheet]: + assets["stylesheets"].append((preferred_stylesheet, url_for('plugin_assets', name=name, filename=asset))) + else: + for stylesheet in supported_stylesheets: + if not stylesheet in all_assets: + continue + + for asset in all_assets[stylesheet]: + assets["stylesheets"].append((stylesheet, url_for('plugin_assets', name=name, filename=asset))) + break + + ##~~ prepare templates + + templates = dict( + navbar=dict(order=[], entries=dict()), + sidebar=dict(order=[], entries=dict()), + tab=dict(order=[], entries=dict()), + settings=dict(order=[], entries=dict()), + usersettings=dict(order=[], entries=dict()), + generic=dict(order=[], entries=dict()) + ) + template_types = templates.keys() + + # navbar + + templates["navbar"]["entries"] = dict( + settings=dict(template="navbar/settings.jinja2", _div="navbar_settings", styles=["display: none"], data_bind="visible: loginState.isAdmin") + ) + if enable_accesscontrol: + templates["navbar"]["entries"]["login"] = dict(template="navbar/login.jinja2", _div="navbar_login", classes=["dropdown"], custom_bindings=False) + if enable_systemmenu: + templates["navbar"]["entries"]["systemmenu"] = dict(template="navbar/systemmenu.jinja2", _div="navbar_systemmenu", styles=["display: none"], classes=["dropdown"], data_bind="visible: loginState.isAdmin", custom_bindings=False) + + # sidebar + + templates["sidebar"]["entries"]= dict( + connection=(gettext("Connection"), dict(template="sidebar/connection.jinja2", _div="connection", icon="signal", styles_wrapper=["display: none"], data_bind="visible: loginState.isAdmin")), + state=(gettext("State"), dict(template="sidebar/state.jinja2", _div="state", icon="info-sign")), + files=(gettext("Files"), dict(template="sidebar/files.jinja2", _div="files", icon="list", classes_content=["overflow_visible"], template_header="sidebar/files_header.jinja2")) + ) + + # tabs + + templates["tab"]["entries"] = dict( + temperature=(gettext("Temperature"), dict(template="tabs/temperature.jinja2", _div="temp")), + control=(gettext("Control"), dict(template="tabs/control.jinja2", _div="control")), + terminal=(gettext("Terminal"), dict(template="tabs/terminal.jinja2", _div="term")), + ) + if enable_gcodeviewer: + templates["tab"]["entries"]["gcodeviewer"] = (gettext("GCode Viewer"), dict(template="tabs/gcodeviewer.jinja2", _div="gcode")) + if enable_timelapse: + templates["tab"]["entries"]["timelapse"] = (gettext("Timelapse"), dict(template="tabs/timelapse.jinja2", _div="timelapse")) + + # settings dialog + + templates["settings"]["entries"] = dict( + section_printer=(gettext("Printer"), None), + + serial=(gettext("Serial Connection"), dict(template="dialogs/settings/serialconnection.jinja2", _div="settings_serialConnection", custom_bindings=False)), + printerprofiles=(gettext("Printer Profiles"), dict(template="dialogs/settings/printerprofiles.jinja2", _div="settings_printerProfiles", custom_bindings=False)), + temperatures=(gettext("Temperatures"), dict(template="dialogs/settings/temperatures.jinja2", _div="settings_temperature", custom_bindings=False)), + terminalfilters=(gettext("Terminal Filters"), dict(template="dialogs/settings/terminalfilters.jinja2", _div="settings_terminalFilters", custom_bindings=False)), + gcodescripts=(gettext("GCODE Scripts"), dict(template="dialogs/settings/gcodescripts.jinja2", _div="settings_gcodeScripts", custom_bindings=False)), + + section_features=(gettext("Features"), None), + + features=(gettext("Features"), dict(template="dialogs/settings/features.jinja2", _div="settings_features", custom_bindings=False)), + webcam=(gettext("Webcam"), dict(template="dialogs/settings/webcam.jinja2", _div="settings_webcam", custom_bindings=False)), + api=(gettext("API"), dict(template="dialogs/settings/api.jinja2", _div="settings_api", custom_bindings=False)), + + section_octoprint=(gettext("OctoPrint"), None), + + folders=(gettext("Folders"), dict(template="dialogs/settings/folders.jinja2", _div="settings_folders", custom_bindings=False)), + appearance=(gettext("Appearance"), dict(template="dialogs/settings/appearance.jinja2", _div="settings_appearance", custom_bindings=False)), + logs=(gettext("Logs"), dict(template="dialogs/settings/logs.jinja2", _div="settings_logs")), + ) + if enable_accesscontrol: + templates["settings"]["entries"]["accesscontrol"] = (gettext("Access Control"), dict(template="dialogs/settings/accesscontrol.jinja2", _div="settings_users", custom_bindings=False)) + + # user settings dialog + + if enable_accesscontrol: + templates["usersettings"]["entries"] = dict( + access=(gettext("Access"), dict(template="dialogs/usersettings/access.jinja2", _div="usersettings_access", custom_bindings=False)), + interface=(gettext("Interface"), dict(template="dialogs/usersettings/interface.jinja2", _div="usersettings_interface", custom_bindings=False)), + ) + + # extract data from template plugins + + template_plugins = pluginManager.get_implementations(octoprint.plugin.TemplatePlugin) + + # rules for transforming template configs to template entries + rules = dict( + navbar=dict(div=lambda x: "navbar_plugin_" + x, template=lambda x: x + "_navbar.jinja2", to_entry=lambda data: data), + sidebar=dict(div=lambda x: "sidebar_plugin_" + x, template=lambda x: x + "_sidebar.jinja2", to_entry=lambda data: (data["name"], data)), + tab=dict(div=lambda x: "tab_plugin_" + x, template=lambda x: x + "_tab.jinja2", to_entry=lambda data: (data["name"], data)), + settings=dict(div=lambda x: "settings_plugin_" + x, template=lambda x: x + "_settings.jinja2", to_entry=lambda data: (data["name"], data)), + usersettings=dict(div=lambda x: "usersettings_plugin_" + x, template=lambda x: x + "_usersettings.jinja2", to_entry=lambda data: (data["name"], data)), + generic=dict(template=lambda x: x + ".jinja2", to_entry=lambda data: data) + ) + + plugin_vars = dict() + plugin_names = set() + for implementation in template_plugins: + name = implementation._identifier + plugin_names.add(name) + + vars = implementation.get_template_vars() + if not isinstance(vars, dict): + vars = dict() + + for var_name, var_value in vars.items(): + plugin_vars["plugin_" + name + "_" + var_name] = var_value + + configs = implementation.get_template_configs() + if not isinstance(configs, (list, tuple)): + configs = [] + + includes = _process_template_configs(name, implementation, configs, rules) + + for t in template_types: + for include in includes[t]: + if t == "navbar" or t == "generic": + data = include + else: + data = include[1] + + key = data["_key"] + if "replaces" in data: + key = data["replaces"] + templates[t]["entries"][key] = include + + #~~ order internal templates and plugins + + # make sure that + # 1) we only have keys in our ordered list that we have entries for and + # 2) we have all entries located somewhere within the order + + for t in template_types: + default_order = settings().get(["appearance", "components", "order", t], merged=True, config=dict()) + configured_order = settings().get(["appearance", "components", "order", t], merged=True) + configured_disabled = settings().get(["appearance", "components", "disabled", t]) + + # first create the ordered list of all component ids according to the configured order + templates[t]["order"] = [x for x in configured_order if x in templates[t]["entries"] and not x in configured_disabled] + + # now append the entries from the default order that are not already in there + templates[t]["order"] += [x for x in default_order if not x in templates[t]["order"] and x in templates[t]["entries"] and not x in configured_disabled] + + all_ordered = set(templates[t]["order"]) + all_disabled = set(configured_disabled) + + # check if anything is missing, if not we are done here + missing_in_order = set(templates[t]["entries"].keys()).difference(all_ordered).difference(all_disabled) + if len(missing_in_order) == 0: + continue + + # finally add anything that's not included in our order yet + sorted_missing = list(missing_in_order) + if not t == "navbar" and not t == "generic": + # anything but navbar and generic components get sorted by their name + sorted_missing = sorted(missing_in_order, key=lambda x: templates[t]["entries"][x][0]) + + if t == "navbar": + # additional navbar components are prepended + templates[t]["order"] = sorted_missing + templates[t]["order"] + elif t == "sidebar" or t == "tab" or t == "generic" or t == "usersettings": + # additional sidebar, generic or usersettings components are appended + templates[t]["order"] += sorted_missing + elif t == "settings": + # additional settings items are added to the plugin section + templates[t]["entries"]["section_plugins"] = (gettext("Plugins"), None) + templates[t]["order"] += ["section_plugins"] + sorted_missing + + #~~ prepare full set of template vars for rendering + + render_kwargs = dict( + webcamStream=settings().get(["webcam", "stream"]), + enableTemperatureGraph=settings().get(["feature", "temperatureGraph"]), + enableAccessControl=userManager is not None, + enableSdSupport=settings().get(["feature", "sdSupport"]), + firstRun=settings().getBoolean(["server", "firstRun"]) and (userManager is None or not userManager.hasBeenCustomized()), + debug=debug, + version=VERSION, + display_version=DISPLAY_VERSION, + gcodeMobileThreshold=settings().get(["gcodeViewer", "mobileSizeThreshold"]), + gcodeThreshold=settings().get(["gcodeViewer", "sizeThreshold"]), + uiApiKey=UI_API_KEY, + templates=templates, + assets=assets, + pluginNames=plugin_names, + locales=locales + ) + render_kwargs.update(plugin_vars) + + #~~ render! + + return render_template( + "index.jinja2", + **render_kwargs + ) + + +def _process_template_configs(name, implementation, configs, rules): + from jinja2.exceptions import TemplateNotFound + + counters = dict( + navbar=1, + sidebar=1, + tab=1, + settings=1, + generic=1 + ) + includes = defaultdict(list) + + for config in configs: + if not isinstance(config, dict): + continue + if not "type" in config: + continue + + template_type = config["type"] + del config["type"] + + if not template_type in rules: + continue + rule = rules[template_type] + + data = _process_template_config(name, implementation, rule, config=config, counter=counters[template_type]) + if data is None: + continue + + includes[template_type].append(rule["to_entry"](data)) + counters[template_type] += 1 + + for template_type in rules: + if len(includes[template_type]) == 0: + # if no template of that type was added by the config, we'll try to use the default template name + rule = rules[template_type] + data = _process_template_config(name, implementation, rule) + if data is not None: + try: + app.jinja_env.get_or_select_template(data["template"]) + except TemplateNotFound: + pass + else: + includes[template_type].append(rule["to_entry"](data)) + + return includes + +def _process_template_config(name, implementation, rule, config=None, counter=1): + if "mandatory" in rule: + for mandatory in rule["mandatory"]: + if not mandatory in config: + return None + + if config is None: + config = dict() + data = dict(config) + + if not "suffix" in data and counter > 1: + data["suffix"] = "_%d" % counter + + if "div" in data: + data["_div"] = data["div"] + elif "div" in rule: + data["_div"] = rule["div"](name) + if "suffix" in data: + data["_div"] = data["_div"] + data["suffix"] + + if not "template" in data: + data["template"] = rule["template"](name) + + if not "name" in data: + data["name"] = implementation._plugin_name + + if not "custom_bindings" in data or data["custom_bindings"]: + data_bind = "allowBindings: true" + if "data_bind" in data: + data_bind = data_bind + ", " + data["data_bind"] + data["data_bind"] = data_bind + + data["_key"] = "plugin_" + name + if "suffix" in data: + data["_key"] += data["suffix"] + + return data + +@app.route("/robots.txt") +def robotsTxt(): + return send_from_directory(app.static_folder, "robots.txt") + + +@app.route("/i18n//.js") +@util.flask.cached(refreshif=lambda: util.flask.cache_check_headers() or "_refresh" in request.values, key=lambda: "view/%s/%s" % (request.path, g.locale)) +def localeJs(locale, domain): + from flask import _request_ctx_stack + from babel.messages.pofile import read_po + + def messages_from_po(base_path, locale, domain): + path = os.path.join(base_path, locale) + if not os.path.isdir(path): + return dict(), None + + path = os.path.join(path, "LC_MESSAGES", "{domain}.po".format(**locals())) + if not os.path.isfile(path): + return dict(), None + + messages = dict() + with file(path) as f: + catalog = read_po(f, locale=locale, domain=domain) + + for message in catalog: + message_id = message.id + if isinstance(message_id, (list, tuple)): + message_id = message_id[0] + messages[message_id] = message.string + + return messages, catalog.plural_expr + + messages = dict() + + ctx = _request_ctx_stack.top + base_path = os.path.join(ctx.app.root_path, "translations") + + plugins = octoprint.plugin.plugin_manager().enabled_plugins + for name, plugin in plugins.items(): + plugin_path = os.path.join(plugin.location, 'translations') + plugin_messages, _ = messages_from_po(plugin_path, locale, domain) + messages = octoprint.util.dict_merge(messages, plugin_messages) + + core_messages, plural_expr = messages_from_po(base_path, locale, domain) + messages = octoprint.util.dict_merge(messages, core_messages) + + catalog = dict( + messages=messages, + plural_expr=plural_expr, + locale=locale, + domain=domain + ) + + return render_template("i18n.js.jinja2", catalog=catalog) + + +@app.route("/plugin_assets//") +def plugin_assets(name, filename): + asset_plugins = pluginManager.get_filtered_implementations(lambda p: p._identifier == name, octoprint.plugin.AssetPlugin) + + if not asset_plugins: + return make_response("Asset not found", 404) + + if len(asset_plugins) > 1: + return make_response("More than one asset provider for {name}, can't proceed".format(name=name), 500) + + asset_plugin = asset_plugins[0] + asset_folder = asset_plugin.get_asset_folder() + if asset_folder is None: + return make_response("Asset not found", 404) + + return send_from_directory(asset_folder, filename) + + diff --git a/src/octoprint/settings.py b/src/octoprint/settings.py index 8a4ad5c5..954b01e5 100644 --- a/src/octoprint/settings.py +++ b/src/octoprint/settings.py @@ -153,7 +153,8 @@ default_settings = { "plugins": None, "slicingProfiles": None, "printerProfiles": None, - "scripts": None + "scripts": None, + "translations": None }, "temperature": { "profiles": [ From 7f8a3849c797b27a3c84ffcdec3483951a5bc458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Fri, 29 May 2015 19:44:11 +0200 Subject: [PATCH 2/4] Adjusted messages.js compilation, debugged new i18n handling and added logging --- src/octoprint/server/__init__.py | 611 +++++------------------------ src/octoprint/server/util/flask.py | 81 +++- src/octoprint/server/views.py | 473 ++++++++++++++++++++++ src/octoprint/settings.py | 3 +- 4 files changed, 642 insertions(+), 526 deletions(-) create mode 100644 src/octoprint/server/views.py diff --git a/src/octoprint/server/__init__.py b/src/octoprint/server/__init__.py index 6f9e5f19..43fd5247 100644 --- a/src/octoprint/server/__init__.py +++ b/src/octoprint/server/__init__.py @@ -7,7 +7,7 @@ __copyright__ = "Copyright (C) 2014 The OctoPrint Project - Released under terms import uuid from sockjs.tornado import SockJSRouter -from flask import Flask, render_template, send_from_directory, g, request, make_response, session, url_for +from flask import Flask, g, request, session from flask.ext.login import LoginManager, current_user from flask.ext.principal import Principal, Permission, RoleNeed, identity_loaded, UserNeed from flask.ext.babel import Babel, gettext, ngettext @@ -24,7 +24,7 @@ SUCCESS = {} NO_CONTENT = ("", 204) app = Flask("octoprint") -babel = Babel(app) +babel = None debug = False printer = None @@ -58,9 +58,6 @@ import octoprint.filemanager.analysis import octoprint.slicing from . import util -util.tornado.fix_ioloop_scheduling() -util.flask.enable_plugin_translations() - UI_API_KEY = ''.join('%02X' % ord(z) for z in uuid.uuid4().bytes) @@ -71,481 +68,8 @@ DISPLAY_VERSION = "%s (%s branch)" % (VERSION, BRANCH) if BRANCH else VERSION del versions -def get_available_locale_identifiers(locales): - result = set() - - # add available translations - for locale in locales: - result.add(locale.language) - if locale.territory: - # if a territory is specified, add that too - result.add("%s_%s" % (locale.language, locale.territory)) - - return result - - -LOCALES = [Locale.parse("en")] + babel.list_translations() -LANGUAGES = get_available_locale_identifiers(LOCALES) - - -@app.before_request -def before_request(): - g.locale = get_locale() - -@app.after_request -def after_request(response): - # send no-cache headers with all POST responses - if request.method == "POST": - response.cache_control.no_cache = True - response.headers.add("X-Clacks-Overhead", "GNU Terry Pratchett") - return response - - -@babel.localeselector -def get_locale(): - if "l10n" in request.values: - return Locale.negotiate([request.values["l10n"]], LANGUAGES) - - if hasattr(g, "identity") and g.identity and userManager is not None: - userid = g.identity.id - try: - user_language = userManager.getUserSetting(userid, ("interface", "language")) - if user_language is not None and not user_language == "_default": - return Locale.negotiate([user_language], LANGUAGES) - except octoprint.users.UnknownUser: - pass - - default_language = settings().get(["appearance", "defaultLanguage"]) - if default_language is not None and not default_language == "_default" and default_language in LANGUAGES: - return Locale.negotiate([default_language], LANGUAGES) - - return request.accept_languages.best_match(LANGUAGES) - - -@app.route("/") -@util.flask.cached(refreshif=lambda: util.flask.cache_check_headers() or "_refresh" in request.values, key=lambda: "view/%s/%s" % (request.path, g.locale)) -def index(): - - #~~ a bunch of settings - - enable_gcodeviewer = settings().getBoolean(["gcodeViewer", "enabled"]) - enable_timelapse = (settings().get(["webcam", "snapshot"]) and settings().get(["webcam", "ffmpeg"])) - enable_systemmenu = settings().get(["system"]) is not None and settings().get(["system", "actions"]) is not None and len(settings().get(["system", "actions"])) > 0 - enable_accesscontrol = userManager is not None - preferred_stylesheet = settings().get(["devel", "stylesheet"]) - locales = dict((l.language, dict(language=l.language, display=l.display_name, english=l.english_name)) for l in LOCALES) - -#~~ prepare assets - - supported_stylesheets = ("css", "less") - assets = dict( - js=[], - stylesheets=[] - ) - assets["js"] = [ - url_for('static', filename='js/app/viewmodels/appearance.js'), - url_for('static', filename='js/app/viewmodels/connection.js'), - url_for('static', filename='js/app/viewmodels/control.js'), - url_for('static', filename='js/app/viewmodels/firstrun.js'), - url_for('static', filename='js/app/viewmodels/files.js'), - url_for('static', filename='js/app/viewmodels/loginstate.js'), - url_for('static', filename='js/app/viewmodels/navigation.js'), - url_for('static', filename='js/app/viewmodels/printerstate.js'), - url_for('static', filename='js/app/viewmodels/printerprofiles.js'), - url_for('static', filename='js/app/viewmodels/settings.js'), - url_for('static', filename='js/app/viewmodels/slicing.js'), - url_for('static', filename='js/app/viewmodels/temperature.js'), - url_for('static', filename='js/app/viewmodels/terminal.js'), - url_for('static', filename='js/app/viewmodels/users.js'), - url_for('static', filename='js/app/viewmodels/log.js'), - url_for('static', filename='js/app/viewmodels/usersettings.js') - ] - if enable_gcodeviewer: - assets["js"] += [ - url_for('static', filename='js/app/viewmodels/gcode.js'), - url_for('static', filename='gcodeviewer/js/ui.js'), - url_for('static', filename='gcodeviewer/js/gCodeReader.js'), - url_for('static', filename='gcodeviewer/js/renderer.js') - ] - if enable_timelapse: - assets["js"].append(url_for('static', filename='js/app/viewmodels/timelapse.js')) - - if preferred_stylesheet == "less": - assets["stylesheets"].append(("less", url_for('static', filename='less/octoprint.less'))) - elif preferred_stylesheet == "css": - assets["stylesheets"].append(("css", url_for('static', filename='css/octoprint.css'))) - - asset_plugins = pluginManager.get_implementations(octoprint.plugin.AssetPlugin) - for implementation in asset_plugins: - name = implementation._identifier - all_assets = implementation.get_assets() - - if "js" in all_assets: - for asset in all_assets["js"]: - assets["js"].append(url_for('plugin_assets', name=name, filename=asset)) - - if preferred_stylesheet in all_assets: - for asset in all_assets[preferred_stylesheet]: - assets["stylesheets"].append((preferred_stylesheet, url_for('plugin_assets', name=name, filename=asset))) - else: - for stylesheet in supported_stylesheets: - if not stylesheet in all_assets: - continue - - for asset in all_assets[stylesheet]: - assets["stylesheets"].append((stylesheet, url_for('plugin_assets', name=name, filename=asset))) - break - - ##~~ prepare templates - - templates = dict( - navbar=dict(order=[], entries=dict()), - sidebar=dict(order=[], entries=dict()), - tab=dict(order=[], entries=dict()), - settings=dict(order=[], entries=dict()), - usersettings=dict(order=[], entries=dict()), - generic=dict(order=[], entries=dict()) - ) - template_types = templates.keys() - - # navbar - - templates["navbar"]["entries"] = dict( - settings=dict(template="navbar/settings.jinja2", _div="navbar_settings", styles=["display: none"], data_bind="visible: loginState.isAdmin") - ) - if enable_accesscontrol: - templates["navbar"]["entries"]["login"] = dict(template="navbar/login.jinja2", _div="navbar_login", classes=["dropdown"], custom_bindings=False) - if enable_systemmenu: - templates["navbar"]["entries"]["systemmenu"] = dict(template="navbar/systemmenu.jinja2", _div="navbar_systemmenu", styles=["display: none"], classes=["dropdown"], data_bind="visible: loginState.isAdmin", custom_bindings=False) - - # sidebar - - templates["sidebar"]["entries"]= dict( - connection=(gettext("Connection"), dict(template="sidebar/connection.jinja2", _div="connection", icon="signal", styles_wrapper=["display: none"], data_bind="visible: loginState.isAdmin")), - state=(gettext("State"), dict(template="sidebar/state.jinja2", _div="state", icon="info-sign")), - files=(gettext("Files"), dict(template="sidebar/files.jinja2", _div="files", icon="list", classes_content=["overflow_visible"], template_header="sidebar/files_header.jinja2")) - ) - - # tabs - - templates["tab"]["entries"] = dict( - temperature=(gettext("Temperature"), dict(template="tabs/temperature.jinja2", _div="temp")), - control=(gettext("Control"), dict(template="tabs/control.jinja2", _div="control")), - terminal=(gettext("Terminal"), dict(template="tabs/terminal.jinja2", _div="term")), - ) - if enable_gcodeviewer: - templates["tab"]["entries"]["gcodeviewer"] = (gettext("GCode Viewer"), dict(template="tabs/gcodeviewer.jinja2", _div="gcode")) - if enable_timelapse: - templates["tab"]["entries"]["timelapse"] = (gettext("Timelapse"), dict(template="tabs/timelapse.jinja2", _div="timelapse")) - - # settings dialog - - templates["settings"]["entries"] = dict( - section_printer=(gettext("Printer"), None), - - serial=(gettext("Serial Connection"), dict(template="dialogs/settings/serialconnection.jinja2", _div="settings_serialConnection", custom_bindings=False)), - printerprofiles=(gettext("Printer Profiles"), dict(template="dialogs/settings/printerprofiles.jinja2", _div="settings_printerProfiles", custom_bindings=False)), - temperatures=(gettext("Temperatures"), dict(template="dialogs/settings/temperatures.jinja2", _div="settings_temperature", custom_bindings=False)), - terminalfilters=(gettext("Terminal Filters"), dict(template="dialogs/settings/terminalfilters.jinja2", _div="settings_terminalFilters", custom_bindings=False)), - gcodescripts=(gettext("GCODE Scripts"), dict(template="dialogs/settings/gcodescripts.jinja2", _div="settings_gcodeScripts", custom_bindings=False)), - - section_features=(gettext("Features"), None), - - features=(gettext("Features"), dict(template="dialogs/settings/features.jinja2", _div="settings_features", custom_bindings=False)), - webcam=(gettext("Webcam"), dict(template="dialogs/settings/webcam.jinja2", _div="settings_webcam", custom_bindings=False)), - api=(gettext("API"), dict(template="dialogs/settings/api.jinja2", _div="settings_api", custom_bindings=False)), - - section_octoprint=(gettext("OctoPrint"), None), - - folders=(gettext("Folders"), dict(template="dialogs/settings/folders.jinja2", _div="settings_folders", custom_bindings=False)), - appearance=(gettext("Appearance"), dict(template="dialogs/settings/appearance.jinja2", _div="settings_appearance", custom_bindings=False)), - logs=(gettext("Logs"), dict(template="dialogs/settings/logs.jinja2", _div="settings_logs")), - ) - if enable_accesscontrol: - templates["settings"]["entries"]["accesscontrol"] = (gettext("Access Control"), dict(template="dialogs/settings/accesscontrol.jinja2", _div="settings_users", custom_bindings=False)) - - # user settings dialog - - if enable_accesscontrol: - templates["usersettings"]["entries"] = dict( - access=(gettext("Access"), dict(template="dialogs/usersettings/access.jinja2", _div="usersettings_access", custom_bindings=False)), - interface=(gettext("Interface"), dict(template="dialogs/usersettings/interface.jinja2", _div="usersettings_interface", custom_bindings=False)), - ) - - # extract data from template plugins - - template_plugins = pluginManager.get_implementations(octoprint.plugin.TemplatePlugin) - - # rules for transforming template configs to template entries - rules = dict( - navbar=dict(div=lambda x: "navbar_plugin_" + x, template=lambda x: x + "_navbar.jinja2", to_entry=lambda data: data), - sidebar=dict(div=lambda x: "sidebar_plugin_" + x, template=lambda x: x + "_sidebar.jinja2", to_entry=lambda data: (data["name"], data)), - tab=dict(div=lambda x: "tab_plugin_" + x, template=lambda x: x + "_tab.jinja2", to_entry=lambda data: (data["name"], data)), - settings=dict(div=lambda x: "settings_plugin_" + x, template=lambda x: x + "_settings.jinja2", to_entry=lambda data: (data["name"], data)), - usersettings=dict(div=lambda x: "usersettings_plugin_" + x, template=lambda x: x + "_usersettings.jinja2", to_entry=lambda data: (data["name"], data)), - generic=dict(template=lambda x: x + ".jinja2", to_entry=lambda data: data) - ) - - plugin_vars = dict() - plugin_names = set() - for implementation in template_plugins: - name = implementation._identifier - plugin_names.add(name) - - vars = implementation.get_template_vars() - if not isinstance(vars, dict): - vars = dict() - - for var_name, var_value in vars.items(): - plugin_vars["plugin_" + name + "_" + var_name] = var_value - - configs = implementation.get_template_configs() - if not isinstance(configs, (list, tuple)): - configs = [] - - includes = _process_template_configs(name, implementation, configs, rules) - - for t in template_types: - for include in includes[t]: - if t == "navbar" or t == "generic": - data = include - else: - data = include[1] - - key = data["_key"] - if "replaces" in data: - key = data["replaces"] - templates[t]["entries"][key] = include - - #~~ order internal templates and plugins - - # make sure that - # 1) we only have keys in our ordered list that we have entries for and - # 2) we have all entries located somewhere within the order - - for t in template_types: - default_order = settings().get(["appearance", "components", "order", t], merged=True, config=dict()) - configured_order = settings().get(["appearance", "components", "order", t], merged=True) - configured_disabled = settings().get(["appearance", "components", "disabled", t]) - - # first create the ordered list of all component ids according to the configured order - templates[t]["order"] = [x for x in configured_order if x in templates[t]["entries"] and not x in configured_disabled] - - # now append the entries from the default order that are not already in there - templates[t]["order"] += [x for x in default_order if not x in templates[t]["order"] and x in templates[t]["entries"] and not x in configured_disabled] - - all_ordered = set(templates[t]["order"]) - all_disabled = set(configured_disabled) - - # check if anything is missing, if not we are done here - missing_in_order = set(templates[t]["entries"].keys()).difference(all_ordered).difference(all_disabled) - if len(missing_in_order) == 0: - continue - - # finally add anything that's not included in our order yet - sorted_missing = list(missing_in_order) - if not t == "navbar" and not t == "generic": - # anything but navbar and generic components get sorted by their name - sorted_missing = sorted(missing_in_order, key=lambda x: templates[t]["entries"][x][0]) - - if t == "navbar": - # additional navbar components are prepended - templates[t]["order"] = sorted_missing + templates[t]["order"] - elif t == "sidebar" or t == "tab" or t == "generic" or t == "usersettings": - # additional sidebar, generic or usersettings components are appended - templates[t]["order"] += sorted_missing - elif t == "settings": - # additional settings items are added to the plugin section - templates[t]["entries"]["section_plugins"] = (gettext("Plugins"), None) - templates[t]["order"] += ["section_plugins"] + sorted_missing - - #~~ prepare full set of template vars for rendering - - render_kwargs = dict( - webcamStream=settings().get(["webcam", "stream"]), - enableTemperatureGraph=settings().get(["feature", "temperatureGraph"]), - enableAccessControl=userManager is not None, - enableSdSupport=settings().get(["feature", "sdSupport"]), - firstRun=settings().getBoolean(["server", "firstRun"]) and (userManager is None or not userManager.hasBeenCustomized()), - debug=debug, - version=VERSION, - display_version=DISPLAY_VERSION, - gcodeMobileThreshold=settings().get(["gcodeViewer", "mobileSizeThreshold"]), - gcodeThreshold=settings().get(["gcodeViewer", "sizeThreshold"]), - uiApiKey=UI_API_KEY, - templates=templates, - assets=assets, - pluginNames=plugin_names, - locales=locales - ) - render_kwargs.update(plugin_vars) - - #~~ render! - - return render_template( - "index.jinja2", - **render_kwargs - ) - - -def _process_template_configs(name, implementation, configs, rules): - from jinja2.exceptions import TemplateNotFound - - counters = dict( - navbar=1, - sidebar=1, - tab=1, - settings=1, - generic=1 - ) - includes = defaultdict(list) - - for config in configs: - if not isinstance(config, dict): - continue - if not "type" in config: - continue - - template_type = config["type"] - del config["type"] - - if not template_type in rules: - continue - rule = rules[template_type] - - data = _process_template_config(name, implementation, rule, config=config, counter=counters[template_type]) - if data is None: - continue - - includes[template_type].append(rule["to_entry"](data)) - counters[template_type] += 1 - - for template_type in rules: - if len(includes[template_type]) == 0: - # if no template of that type was added by the config, we'll try to use the default template name - rule = rules[template_type] - data = _process_template_config(name, implementation, rule) - if data is not None: - try: - app.jinja_env.get_or_select_template(data["template"]) - except TemplateNotFound: - pass - else: - includes[template_type].append(rule["to_entry"](data)) - - return includes - -def _process_template_config(name, implementation, rule, config=None, counter=1): - if "mandatory" in rule: - for mandatory in rule["mandatory"]: - if not mandatory in config: - return None - - if config is None: - config = dict() - data = dict(config) - - if not "suffix" in data and counter > 1: - data["suffix"] = "_%d" % counter - - if "div" in data: - data["_div"] = data["div"] - elif "div" in rule: - data["_div"] = rule["div"](name) - if "suffix" in data: - data["_div"] = data["_div"] + data["suffix"] - - if not "template" in data: - data["template"] = rule["template"](name) - - if not "name" in data: - data["name"] = implementation._plugin_name - - if not "custom_bindings" in data or data["custom_bindings"]: - data_bind = "allowBindings: true" - if "data_bind" in data: - data_bind = data_bind + ", " + data["data_bind"] - data["data_bind"] = data_bind - - data["_key"] = "plugin_" + name - if "suffix" in data: - data["_key"] += data["suffix"] - - return data - -@app.route("/robots.txt") -def robotsTxt(): - return send_from_directory(app.static_folder, "robots.txt") - - -@app.route("/i18n//.js") -@util.flask.cached(refreshif=lambda: util.flask.cache_check_headers() or "_refresh" in request.values, key=lambda: "view/%s/%s" % (request.path, g.locale)) -def localeJs(locale, domain): - from flask import _request_ctx_stack - from babel.messages.pofile import read_po - - def messages_from_po(base_path, locale, domain): - path = os.path.join(base_path, locale) - if not os.path.isdir(path): - return dict(), None - - path = os.path.join(path, "LC_MESSAGES", "{domain}.po".format(**locals())) - if not os.path.isfile(path): - return dict(), None - - messages = dict() - with file(path) as f: - catalog = read_po(f, locale=locale, domain=domain) - - for message in catalog: - message_id = message.id - if isinstance(message_id, (list, tuple)): - message_id = message_id[0] - messages[message_id] = message.string - - return messages, catalog.plural_expr - - messages = dict() - - ctx = _request_ctx_stack.top - base_path = os.path.join(ctx.app.root_path, "translations") - - plugins = octoprint.plugin.plugin_manager().enabled_plugins - for name, plugin in plugins.items(): - plugin_path = os.path.join(plugin.location, 'translations') - plugin_messages, _ = messages_from_po(plugin_path, locale, domain) - messages = octoprint.util.dict_merge(messages, plugin_messages) - - core_messages, plural_expr = messages_from_po(base_path, locale, domain) - messages = octoprint.util.dict_merge(messages, core_messages) - - catalog = dict( - messages=messages, - plural_expr=plural_expr, - locale=locale, - domain=domain - ) - - return render_template("i18n.js.jinja2", catalog=catalog) - - -@app.route("/plugin_assets//") -def plugin_assets(name, filename): - asset_plugins = pluginManager.get_filtered_implementations(lambda p: p._identifier == name, octoprint.plugin.AssetPlugin) - - if not asset_plugins: - return make_response("Asset not found", 404) - - if len(asset_plugins) > 1: - return make_response("More than one asset provider for {name}, can't proceed".format(name=name), 500) - - asset_plugin = asset_plugins[0] - asset_folder = asset_plugin.get_asset_folder() - if asset_folder is None: - return make_response("Asset not found", 404) - - return send_from_directory(asset_folder, filename) - +LOCALES = [] +LANGUAGES = set() @identity_loaded.connect_via(app) def on_identity_loaded(sender, identity): @@ -559,7 +83,6 @@ def on_identity_loaded(sender, identity): if user.is_admin(): identity.provides.add(RoleNeed("admin")) - def load_user(id): if id == "_api": return users.ApiUser() @@ -601,6 +124,9 @@ class Server(): if not self._allowRoot: self._check_for_root() + global app + global babel + global printer global printerProfileManager global fileManager @@ -621,7 +147,17 @@ class Server(): debug = self._debug # first initialize the settings singleton and make sure it uses given configfile and basedir if available - settings(init=True, basedir=self._basedir, configfile=self._configfile) + s = settings(init=True, basedir=self._basedir, configfile=self._configfile) + + # then monkey patch a bunch of stuff + util.tornado.fix_ioloop_scheduling() + util.flask.enable_additional_translations(additional_folders=[s.getBaseFolder("translations")]) + + # setup app + self._setup_app() + + # setup i18n + self._setup_i18n(app) # then initialize logging self._setup_logging(self._debug, self._logConf) @@ -637,9 +173,9 @@ class Server(): printerProfileManager = PrinterProfileManager() eventManager = events.eventManager() analysisQueue = octoprint.filemanager.analysis.AnalysisQueue() - slicingManager = octoprint.slicing.SlicingManager(settings().getBaseFolder("slicingProfiles"), printerProfileManager) + slicingManager = octoprint.slicing.SlicingManager(s.getBaseFolder("slicingProfiles"), printerProfileManager) storage_managers = dict() - storage_managers[octoprint.filemanager.FileDestinations.LOCAL] = octoprint.filemanager.storage.LocalFileStorage(settings().getBaseFolder("uploads")) + storage_managers[octoprint.filemanager.FileDestinations.LOCAL] = octoprint.filemanager.storage.LocalFileStorage(s.getBaseFolder("uploads")) fileManager = octoprint.filemanager.FileManager(analysisQueue, slicingManager, printerProfileManager, initial_storage_managers=storage_managers) printer = Printer(fileManager, analysisQueue, printerProfileManager) appSessionManager = util.flask.AppSessionManager() @@ -705,8 +241,8 @@ class Server(): if self._debug: events.DebugEventListener() - if settings().getBoolean(["accessControl", "enabled"]): - userManagerName = settings().get(["accessControl", "userManager"]) + if s.getBoolean(["accessControl", "enabled"]): + userManagerName = s.get(["accessControl", "userManager"]) try: clazz = octoprint.util.get_class(userManagerName) userManager = clazz() @@ -715,22 +251,22 @@ class Server(): app.wsgi_app = util.ReverseProxied( app.wsgi_app, - settings().get(["server", "reverseProxy", "prefixHeader"]), - settings().get(["server", "reverseProxy", "schemeHeader"]), - settings().get(["server", "reverseProxy", "hostHeader"]), - settings().get(["server", "reverseProxy", "prefixFallback"]), - settings().get(["server", "reverseProxy", "schemeFallback"]), - settings().get(["server", "reverseProxy", "hostFallback"]) + s.get(["server", "reverseProxy", "prefixHeader"]), + s.get(["server", "reverseProxy", "schemeHeader"]), + s.get(["server", "reverseProxy", "hostHeader"]), + s.get(["server", "reverseProxy", "prefixFallback"]), + s.get(["server", "reverseProxy", "schemeFallback"]), + s.get(["server", "reverseProxy", "hostFallback"]) ) - secret_key = settings().get(["server", "secretKey"]) + secret_key = s.get(["server", "secretKey"]) if not secret_key: import string from random import choice chars = string.ascii_lowercase + string.ascii_uppercase + string.digits secret_key = "".join(choice(chars) for _ in xrange(32)) - settings().set(["server", "secretKey"], secret_key) - settings().save() + s.set(["server", "secretKey"], secret_key) + s.save() app.secret_key = secret_key loginManager = LoginManager() loginManager.session_protection = "strong" @@ -741,9 +277,9 @@ class Server(): loginManager.init_app(app) if self._host is None: - self._host = settings().get(["server", "host"]) + self._host = s.get(["server", "host"]) if self._port is None: - self._port = settings().getInt(["server", "port"]) + self._port = s.getInt(["server", "port"]) app.debug = self._debug @@ -762,13 +298,13 @@ class Server(): self._router = SockJSRouter(self._create_socket_connection, "/sockjs") - upload_suffixes = dict(name=settings().get(["server", "uploads", "nameSuffix"]), path=settings().get(["server", "uploads", "pathSuffix"])) + upload_suffixes = dict(name=s.get(["server", "uploads", "nameSuffix"]), path=s.get(["server", "uploads", "pathSuffix"])) server_routes = self._router.urls + [ - (r"/downloads/timelapse/([^/]*\.mpg)", util.tornado.LargeResponseHandler, dict(path=settings().getBaseFolder("timelapse"), as_attachment=True)), - (r"/downloads/files/local/(.*)", util.tornado.LargeResponseHandler, dict(path=settings().getBaseFolder("uploads"), as_attachment=True, path_validation=util.tornado.path_validation_factory(lambda path: not os.path.basename(path).startswith("."), status_code=404))), - (r"/downloads/logs/([^/]*)", util.tornado.LargeResponseHandler, dict(path=settings().getBaseFolder("logs"), as_attachment=True, access_validation=util.tornado.access_validation_factory(app, loginManager, util.flask.admin_validator))), - (r"/downloads/camera/current", util.tornado.UrlForwardHandler, dict(url=settings().get(["webcam", "snapshot"]), as_attachment=True, access_validation=util.tornado.access_validation_factory(app, loginManager, util.flask.user_validator))), + (r"/downloads/timelapse/([^/]*\.mpg)", util.tornado.LargeResponseHandler, dict(path=s.getBaseFolder("timelapse"), as_attachment=True)), + (r"/downloads/files/local/(.*)", util.tornado.LargeResponseHandler, dict(path=s.getBaseFolder("uploads"), as_attachment=True, path_validation=util.tornado.path_validation_factory(lambda path: not os.path.basename(path).startswith("."), status_code=404))), + (r"/downloads/logs/([^/]*)", util.tornado.LargeResponseHandler, dict(path=s.getBaseFolder("logs"), as_attachment=True, access_validation=util.tornado.access_validation_factory(app, loginManager, util.flask.admin_validator))), + (r"/downloads/camera/current", util.tornado.UrlForwardHandler, dict(url=s.get(["webcam", "snapshot"]), as_attachment=True, access_validation=util.tornado.access_validation_factory(app, loginManager, util.flask.user_validator))), ] for name, hook in pluginManager.get_hooks("octoprint.server.http.routes").items(): try: @@ -795,7 +331,7 @@ class Server(): self._tornado_app = Application(server_routes) max_body_sizes = [ - ("POST", r"/api/files/([^/]*)", settings().getInt(["server", "uploads", "maxSize"])) + ("POST", r"/api/files/([^/]*)", s.getInt(["server", "uploads", "maxSize"])) ] # allow plugins to extend allowed maximum body sizes @@ -820,12 +356,12 @@ class Server(): self._logger.debug("Adding maximum body size of {size}B for {method} requests to {route})".format(**locals())) max_body_sizes.append((method, route, size)) - self._server = util.tornado.CustomHTTPServer(self._tornado_app, max_body_sizes=max_body_sizes, default_max_body_size=settings().getInt(["server", "maxSize"])) + self._server = util.tornado.CustomHTTPServer(self._tornado_app, max_body_sizes=max_body_sizes, default_max_body_size=s.getInt(["server", "maxSize"])) self._server.listen(self._port, address=self._host) eventManager.fire(events.Events.STARTUP) - if settings().getBoolean(["serial", "autoconnect"]): - (port, baudrate) = settings().get(["serial", "port"]), settings().getInt(["serial", "baudrate"]) + if s.getBoolean(["serial", "autoconnect"]): + (port, baudrate) = s.get(["serial", "port"]), s.getInt(["serial", "baudrate"]) printer_profile = printerProfileManager.get_default() connectionOptions = get_connection_options() if port in connectionOptions["ports"]: @@ -833,7 +369,7 @@ class Server(): # start up watchdogs observer = Observer() - observer.schedule(util.watchdog.GcodeWatchdogHandler(fileManager, printer), settings().getBaseFolder("watched")) + observer.schedule(util.watchdog.GcodeWatchdogHandler(fileManager, printer), s.getBaseFolder("watched")) observer.start() # run our startup plugins @@ -897,6 +433,27 @@ class Server(): if "geteuid" in dir(os) and os.geteuid() == 0: exit("You should not run OctoPrint as root!") + def _get_locale(self): + global LANGUAGES + + if "l10n" in request.values: + return Locale.negotiate([request.values["l10n"]], LANGUAGES) + + if hasattr(g, "identity") and g.identity and userManager is not None: + userid = g.identity.id + try: + user_language = userManager.getUserSetting(userid, ("interface", "language")) + if user_language is not None and not user_language == "_default": + return Locale.negotiate([user_language], LANGUAGES) + except octoprint.users.UnknownUser: + pass + + default_language = settings().get(["appearance", "defaultLanguage"]) + if default_language is not None and not default_language == "_default" and default_language in LANGUAGES: + return Locale.negotiate([default_language], LANGUAGES) + + return request.accept_languages.best_match(LANGUAGES) + def _setup_logging(self, debug, logConf=None): defaultConfig = { "version": 1, @@ -971,6 +528,45 @@ class Server(): logging.getLogger("SERIAL").setLevel(logging.DEBUG) logging.getLogger("SERIAL").debug("Enabling serial logging") + def _setup_app(self): + @app.before_request + def before_request(): + g.locale = self._get_locale() + + @app.after_request + def after_request(response): + # send no-cache headers with all POST responses + if request.method == "POST": + response.cache_control.no_cache = True + response.headers.add("X-Clacks-Overhead", "GNU Terry Pratchett") + return response + + def _setup_i18n(self, app): + global babel + global LOCALES + global LANGUAGES + + babel = Babel(app) + + def get_available_locale_identifiers(locales): + result = set() + + # add available translations + for locale in locales: + result.add(locale.language) + if locale.territory: + # if a territory is specified, add that too + result.add("%s_%s" % (locale.language, locale.territory)) + + return result + + LOCALES = babel.list_translations() + LANGUAGES = get_available_locale_identifiers(LOCALES) + + @babel.localeselector + def get_locale(): + return self._get_locale() + def _setup_jinja2(self): app.jinja_env.add_extension("jinja2.ext.do") @@ -1006,6 +602,7 @@ class Server(): def _setup_blueprints(self): from octoprint.server.api import api from octoprint.server.apps import apps + import octoprint.server.views app.register_blueprint(api, url_prefix="/api") app.register_blueprint(apps, url_prefix="/apps") diff --git a/src/octoprint/server/util/flask.py b/src/octoprint/server/util/flask.py index e1aa70e2..45ca338e 100644 --- a/src/octoprint/server/util/flask.py +++ b/src/octoprint/server/util/flask.py @@ -26,22 +26,51 @@ from werkzeug.contrib.cache import SimpleCache #~~ monkey patching -def enable_plugin_translations(): +def enable_additional_translations(default_locale="en", additional_folders=None): import os from flask import _request_ctx_stack - from babel import support + from babel import support, Locale import flask.ext.babel import octoprint.plugin + if additional_folders is None: + additional_folders = [] + + logger = logging.getLogger(__name__) + + def fixed_list_translations(self): + """Returns a list of all the locales translations exist for. The + list returned will be filled with actual locale objects and not just + strings. + """ + def list_translations(dirname): + if not os.path.isdir(dirname): + return [] + result = [] + for folder in os.listdir(dirname): + locale_dir = os.path.join(dirname, folder, 'LC_MESSAGES') + if not os.path.isdir(locale_dir): + continue + if filter(lambda x: x.endswith('.mo'), os.listdir(locale_dir)): + result.append(Locale.parse(folder)) + if not result: + result.append(Locale.parse(self._default_locale)) + return result + + dirs = additional_folders + [os.path.join(self.app.root_path, 'translations')] + + result = [Locale.parse(default_locale)] + for dir in dirs: + result += list_translations(dir) + return result + def fixed_get_translations(): """Returns the correct gettext translations that should be used for this request. This will never fail and return a dummy translation object if used outside of the request or if a translation cannot be found. """ - logger = logging.getLogger(__name__) - ctx = _request_ctx_stack.top if ctx is None: return None @@ -50,26 +79,42 @@ def enable_plugin_translations(): locale = flask.ext.babel.get_locale() translations = support.Translations() - plugins = octoprint.plugin.plugin_manager().enabled_plugins - for name, plugin in plugins.items(): - dirname = os.path.join(plugin.location, 'translations') - if not os.path.isdir(dirname): - continue + if str(locale) != default_locale: + # plugin translations + plugins = octoprint.plugin.plugin_manager().enabled_plugins + for name, plugin in plugins.items(): + dirs = map(lambda x: os.path.join(x, "_plugins", name), additional_folders) + [os.path.join(plugin.location, 'translations')] + for dirname in dirs: + if not os.path.isdir(dirname): + continue - try: - plugin_translations = support.Translations.load(dirname, [locale]) - except: - logger.exception("Error while trying to load translations for plugin {name}".format(**locals())) + try: + plugin_translations = support.Translations.load(dirname, [locale]) + except: + logger.exception("Error while trying to load translations for plugin {name}".format(**locals())) + else: + if isinstance(plugin_translations, support.Translations): + translations = translations.merge(plugin_translations) + logger.debug("Using translation folder {dirname} for locale {locale} of plugin {name}".format(**locals())) + break + else: + logger.debug("No translations for locale {locale} for plugin {name}".format(**locals())) + + # core translations + dirs = additional_folders + [os.path.join(ctx.app.root_path, 'translations')] + for dirname in dirs: + core_translations = support.Translations.load(dirname, [locale]) + if isinstance(core_translations, support.Translations): + logger.debug("Using translation folder {dirname} for locale {locale} of core translations".format(**locals())) + break else: - translations = translations.merge(plugin_translations) - - dirname = os.path.join(ctx.app.root_path, 'translations') - core_translations = support.Translations.load(dirname, [locale]) - translations = translations.merge(core_translations) + logger.debug("No core translations for locale {locale}") + translations = translations.merge(core_translations) ctx.babel_translations = translations return translations + flask.ext.babel.Babel.list_translations = fixed_list_translations flask.ext.babel.get_translations = fixed_get_translations #~~ passive login helper diff --git a/src/octoprint/server/views.py b/src/octoprint/server/views.py new file mode 100644 index 00000000..a0392488 --- /dev/null +++ b/src/octoprint/server/views.py @@ -0,0 +1,473 @@ +# coding=utf-8 +from __future__ import absolute_import + +__author__ = "Gina Häußge " +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' +__copyright__ = "Copyright (C) 2015 The OctoPrint Project - Released under terms of the AGPLv3 License" + +import os + +from collections import defaultdict +from flask import request, g, url_for, make_response, render_template, send_from_directory + +import octoprint.plugin + +from octoprint.server import app, userManager, pluginManager, gettext, debug, LOCALES, VERSION, DISPLAY_VERSION, UI_API_KEY +from octoprint.settings import settings + +from . import util + +import logging +_logger = logging.getLogger(__name__) + + +@app.route("/") +@util.flask.cached(refreshif=lambda: util.flask.cache_check_headers() or "_refresh" in request.values, key=lambda: "view/%s/%s" % (request.path, g.locale)) +def index(): + + #~~ a bunch of settings + + enable_gcodeviewer = settings().getBoolean(["gcodeViewer", "enabled"]) + enable_timelapse = (settings().get(["webcam", "snapshot"]) and settings().get(["webcam", "ffmpeg"])) + enable_systemmenu = settings().get(["system"]) is not None and settings().get(["system", "actions"]) is not None and len(settings().get(["system", "actions"])) > 0 + enable_accesscontrol = userManager is not None + preferred_stylesheet = settings().get(["devel", "stylesheet"]) + locales = dict((l.language, dict(language=l.language, display=l.display_name, english=l.english_name)) for l in LOCALES) + + #~~ prepare assets + + supported_stylesheets = ("css", "less") + assets = dict( + js=[], + stylesheets=[] + ) + assets["js"] = [ + url_for('static', filename='js/app/viewmodels/appearance.js'), + url_for('static', filename='js/app/viewmodels/connection.js'), + url_for('static', filename='js/app/viewmodels/control.js'), + url_for('static', filename='js/app/viewmodels/firstrun.js'), + url_for('static', filename='js/app/viewmodels/files.js'), + url_for('static', filename='js/app/viewmodels/loginstate.js'), + url_for('static', filename='js/app/viewmodels/navigation.js'), + url_for('static', filename='js/app/viewmodels/printerstate.js'), + url_for('static', filename='js/app/viewmodels/printerprofiles.js'), + url_for('static', filename='js/app/viewmodels/settings.js'), + url_for('static', filename='js/app/viewmodels/slicing.js'), + url_for('static', filename='js/app/viewmodels/temperature.js'), + url_for('static', filename='js/app/viewmodels/terminal.js'), + url_for('static', filename='js/app/viewmodels/users.js'), + url_for('static', filename='js/app/viewmodels/log.js'), + url_for('static', filename='js/app/viewmodels/usersettings.js') + ] + if enable_gcodeviewer: + assets["js"] += [ + url_for('static', filename='js/app/viewmodels/gcode.js'), + url_for('static', filename='gcodeviewer/js/ui.js'), + url_for('static', filename='gcodeviewer/js/gCodeReader.js'), + url_for('static', filename='gcodeviewer/js/renderer.js') + ] + if enable_timelapse: + assets["js"].append(url_for('static', filename='js/app/viewmodels/timelapse.js')) + + if preferred_stylesheet == "less": + assets["stylesheets"].append(("less", url_for('static', filename='less/octoprint.less'))) + elif preferred_stylesheet == "css": + assets["stylesheets"].append(("css", url_for('static', filename='css/octoprint.css'))) + + asset_plugins = pluginManager.get_implementations(octoprint.plugin.AssetPlugin) + for implementation in asset_plugins: + name = implementation._identifier + all_assets = implementation.get_assets() + + if "js" in all_assets: + for asset in all_assets["js"]: + assets["js"].append(url_for('plugin_assets', name=name, filename=asset)) + + if preferred_stylesheet in all_assets: + for asset in all_assets[preferred_stylesheet]: + assets["stylesheets"].append((preferred_stylesheet, url_for('plugin_assets', name=name, filename=asset))) + else: + for stylesheet in supported_stylesheets: + if not stylesheet in all_assets: + continue + + for asset in all_assets[stylesheet]: + assets["stylesheets"].append((stylesheet, url_for('plugin_assets', name=name, filename=asset))) + break + + ##~~ prepare templates + + templates = dict( + navbar=dict(order=[], entries=dict()), + sidebar=dict(order=[], entries=dict()), + tab=dict(order=[], entries=dict()), + settings=dict(order=[], entries=dict()), + usersettings=dict(order=[], entries=dict()), + generic=dict(order=[], entries=dict()) + ) + template_types = templates.keys() + + # navbar + + templates["navbar"]["entries"] = dict( + settings=dict(template="navbar/settings.jinja2", _div="navbar_settings", styles=["display: none"], data_bind="visible: loginState.isAdmin") + ) + if enable_accesscontrol: + templates["navbar"]["entries"]["login"] = dict(template="navbar/login.jinja2", _div="navbar_login", classes=["dropdown"], custom_bindings=False) + if enable_systemmenu: + templates["navbar"]["entries"]["systemmenu"] = dict(template="navbar/systemmenu.jinja2", _div="navbar_systemmenu", styles=["display: none"], classes=["dropdown"], data_bind="visible: loginState.isAdmin", custom_bindings=False) + + # sidebar + + templates["sidebar"]["entries"]= dict( + connection=(gettext("Connection"), dict(template="sidebar/connection.jinja2", _div="connection", icon="signal", styles_wrapper=["display: none"], data_bind="visible: loginState.isAdmin")), + state=(gettext("State"), dict(template="sidebar/state.jinja2", _div="state", icon="info-sign")), + files=(gettext("Files"), dict(template="sidebar/files.jinja2", _div="files", icon="list", classes_content=["overflow_visible"], template_header="sidebar/files_header.jinja2")) + ) + + # tabs + + templates["tab"]["entries"] = dict( + temperature=(gettext("Temperature"), dict(template="tabs/temperature.jinja2", _div="temp")), + control=(gettext("Control"), dict(template="tabs/control.jinja2", _div="control")), + terminal=(gettext("Terminal"), dict(template="tabs/terminal.jinja2", _div="term")), + ) + if enable_gcodeviewer: + templates["tab"]["entries"]["gcodeviewer"] = (gettext("GCode Viewer"), dict(template="tabs/gcodeviewer.jinja2", _div="gcode")) + if enable_timelapse: + templates["tab"]["entries"]["timelapse"] = (gettext("Timelapse"), dict(template="tabs/timelapse.jinja2", _div="timelapse")) + + # settings dialog + + templates["settings"]["entries"] = dict( + section_printer=(gettext("Printer"), None), + + serial=(gettext("Serial Connection"), dict(template="dialogs/settings/serialconnection.jinja2", _div="settings_serialConnection", custom_bindings=False)), + printerprofiles=(gettext("Printer Profiles"), dict(template="dialogs/settings/printerprofiles.jinja2", _div="settings_printerProfiles", custom_bindings=False)), + temperatures=(gettext("Temperatures"), dict(template="dialogs/settings/temperatures.jinja2", _div="settings_temperature", custom_bindings=False)), + terminalfilters=(gettext("Terminal Filters"), dict(template="dialogs/settings/terminalfilters.jinja2", _div="settings_terminalFilters", custom_bindings=False)), + gcodescripts=(gettext("GCODE Scripts"), dict(template="dialogs/settings/gcodescripts.jinja2", _div="settings_gcodeScripts", custom_bindings=False)), + + section_features=(gettext("Features"), None), + + features=(gettext("Features"), dict(template="dialogs/settings/features.jinja2", _div="settings_features", custom_bindings=False)), + webcam=(gettext("Webcam"), dict(template="dialogs/settings/webcam.jinja2", _div="settings_webcam", custom_bindings=False)), + api=(gettext("API"), dict(template="dialogs/settings/api.jinja2", _div="settings_api", custom_bindings=False)), + + section_octoprint=(gettext("OctoPrint"), None), + + folders=(gettext("Folders"), dict(template="dialogs/settings/folders.jinja2", _div="settings_folders", custom_bindings=False)), + appearance=(gettext("Appearance"), dict(template="dialogs/settings/appearance.jinja2", _div="settings_appearance", custom_bindings=False)), + logs=(gettext("Logs"), dict(template="dialogs/settings/logs.jinja2", _div="settings_logs")), + ) + if enable_accesscontrol: + templates["settings"]["entries"]["accesscontrol"] = (gettext("Access Control"), dict(template="dialogs/settings/accesscontrol.jinja2", _div="settings_users", custom_bindings=False)) + + # user settings dialog + + if enable_accesscontrol: + templates["usersettings"]["entries"] = dict( + access=(gettext("Access"), dict(template="dialogs/usersettings/access.jinja2", _div="usersettings_access", custom_bindings=False)), + interface=(gettext("Interface"), dict(template="dialogs/usersettings/interface.jinja2", _div="usersettings_interface", custom_bindings=False)), + ) + + # extract data from template plugins + + template_plugins = pluginManager.get_implementations(octoprint.plugin.TemplatePlugin) + + # rules for transforming template configs to template entries + rules = dict( + navbar=dict(div=lambda x: "navbar_plugin_" + x, template=lambda x: x + "_navbar.jinja2", to_entry=lambda data: data), + sidebar=dict(div=lambda x: "sidebar_plugin_" + x, template=lambda x: x + "_sidebar.jinja2", to_entry=lambda data: (data["name"], data)), + tab=dict(div=lambda x: "tab_plugin_" + x, template=lambda x: x + "_tab.jinja2", to_entry=lambda data: (data["name"], data)), + settings=dict(div=lambda x: "settings_plugin_" + x, template=lambda x: x + "_settings.jinja2", to_entry=lambda data: (data["name"], data)), + usersettings=dict(div=lambda x: "usersettings_plugin_" + x, template=lambda x: x + "_usersettings.jinja2", to_entry=lambda data: (data["name"], data)), + generic=dict(template=lambda x: x + ".jinja2", to_entry=lambda data: data) + ) + + plugin_vars = dict() + plugin_names = set() + for implementation in template_plugins: + name = implementation._identifier + plugin_names.add(name) + + vars = implementation.get_template_vars() + if not isinstance(vars, dict): + vars = dict() + + for var_name, var_value in vars.items(): + plugin_vars["plugin_" + name + "_" + var_name] = var_value + + configs = implementation.get_template_configs() + if not isinstance(configs, (list, tuple)): + configs = [] + + includes = _process_template_configs(name, implementation, configs, rules) + + for t in template_types: + for include in includes[t]: + if t == "navbar" or t == "generic": + data = include + else: + data = include[1] + + key = data["_key"] + if "replaces" in data: + key = data["replaces"] + templates[t]["entries"][key] = include + + #~~ order internal templates and plugins + + # make sure that + # 1) we only have keys in our ordered list that we have entries for and + # 2) we have all entries located somewhere within the order + + for t in template_types: + default_order = settings().get(["appearance", "components", "order", t], merged=True, config=dict()) + configured_order = settings().get(["appearance", "components", "order", t], merged=True) + configured_disabled = settings().get(["appearance", "components", "disabled", t]) + + # first create the ordered list of all component ids according to the configured order + templates[t]["order"] = [x for x in configured_order if x in templates[t]["entries"] and not x in configured_disabled] + + # now append the entries from the default order that are not already in there + templates[t]["order"] += [x for x in default_order if not x in templates[t]["order"] and x in templates[t]["entries"] and not x in configured_disabled] + + all_ordered = set(templates[t]["order"]) + all_disabled = set(configured_disabled) + + # check if anything is missing, if not we are done here + missing_in_order = set(templates[t]["entries"].keys()).difference(all_ordered).difference(all_disabled) + if len(missing_in_order) == 0: + continue + + # finally add anything that's not included in our order yet + sorted_missing = list(missing_in_order) + if not t == "navbar" and not t == "generic": + # anything but navbar and generic components get sorted by their name + sorted_missing = sorted(missing_in_order, key=lambda x: templates[t]["entries"][x][0]) + + if t == "navbar": + # additional navbar components are prepended + templates[t]["order"] = sorted_missing + templates[t]["order"] + elif t == "sidebar" or t == "tab" or t == "generic" or t == "usersettings": + # additional sidebar, generic or usersettings components are appended + templates[t]["order"] += sorted_missing + elif t == "settings": + # additional settings items are added to the plugin section + templates[t]["entries"]["section_plugins"] = (gettext("Plugins"), None) + templates[t]["order"] += ["section_plugins"] + sorted_missing + + #~~ prepare full set of template vars for rendering + + render_kwargs = dict( + webcamStream=settings().get(["webcam", "stream"]), + enableTemperatureGraph=settings().get(["feature", "temperatureGraph"]), + enableAccessControl=userManager is not None, + enableSdSupport=settings().get(["feature", "sdSupport"]), + firstRun=settings().getBoolean(["server", "firstRun"]) and (userManager is None or not userManager.hasBeenCustomized()), + debug=debug, + version=VERSION, + display_version=DISPLAY_VERSION, + gcodeMobileThreshold=settings().get(["gcodeViewer", "mobileSizeThreshold"]), + gcodeThreshold=settings().get(["gcodeViewer", "sizeThreshold"]), + uiApiKey=UI_API_KEY, + templates=templates, + assets=assets, + pluginNames=plugin_names, + locales=locales + ) + render_kwargs.update(plugin_vars) + + #~~ render! + + return render_template( + "index.jinja2", + **render_kwargs + ) + + +def _process_template_configs(name, implementation, configs, rules): + from jinja2.exceptions import TemplateNotFound + + counters = dict( + navbar=1, + sidebar=1, + tab=1, + settings=1, + generic=1 + ) + includes = defaultdict(list) + + for config in configs: + if not isinstance(config, dict): + continue + if not "type" in config: + continue + + template_type = config["type"] + del config["type"] + + if not template_type in rules: + continue + rule = rules[template_type] + + data = _process_template_config(name, implementation, rule, config=config, counter=counters[template_type]) + if data is None: + continue + + includes[template_type].append(rule["to_entry"](data)) + counters[template_type] += 1 + + for template_type in rules: + if len(includes[template_type]) == 0: + # if no template of that type was added by the config, we'll try to use the default template name + rule = rules[template_type] + data = _process_template_config(name, implementation, rule) + if data is not None: + try: + app.jinja_env.get_or_select_template(data["template"]) + except TemplateNotFound: + pass + else: + includes[template_type].append(rule["to_entry"](data)) + + return includes + +def _process_template_config(name, implementation, rule, config=None, counter=1): + if "mandatory" in rule: + for mandatory in rule["mandatory"]: + if not mandatory in config: + return None + + if config is None: + config = dict() + data = dict(config) + + if not "suffix" in data and counter > 1: + data["suffix"] = "_%d" % counter + + if "div" in data: + data["_div"] = data["div"] + elif "div" in rule: + data["_div"] = rule["div"](name) + if "suffix" in data: + data["_div"] = data["_div"] + data["suffix"] + + if not "template" in data: + data["template"] = rule["template"](name) + + if not "name" in data: + data["name"] = implementation._plugin_name + + if not "custom_bindings" in data or data["custom_bindings"]: + data_bind = "allowBindings: true" + if "data_bind" in data: + data_bind = data_bind + ", " + data["data_bind"] + data["data_bind"] = data_bind + + data["_key"] = "plugin_" + name + if "suffix" in data: + data["_key"] += data["suffix"] + + return data + +@app.route("/robots.txt") +def robotsTxt(): + return send_from_directory(app.static_folder, "robots.txt") + + +@app.route("/i18n//.js") +@util.flask.cached(refreshif=lambda: util.flask.cache_check_headers() or "_refresh" in request.values, key=lambda: "view/%s/%s" % (request.path, g.locale)) +def localeJs(locale, domain): + messages = dict() + plural_expr = None + + if locale != "en": + from flask import _request_ctx_stack + from babel.messages.pofile import read_po + + def messages_from_po(base_path, locale, domain): + path = os.path.join(base_path, locale) + if not os.path.isdir(path): + return None, None + + path = os.path.join(path, "LC_MESSAGES", "{domain}.po".format(**locals())) + if not os.path.isfile(path): + return None, None + + messages = dict() + with file(path) as f: + catalog = read_po(f, locale=locale, domain=domain) + + for message in catalog: + message_id = message.id + if isinstance(message_id, (list, tuple)): + message_id = message_id[0] + messages[message_id] = message.string + + return messages, catalog.plural_expr + + user_base_path = os.path.join(settings().getBaseFolder("translations")) + user_plugin_path = os.path.join(user_base_path, "_plugins") + + # plugin translations + plugins = octoprint.plugin.plugin_manager().enabled_plugins + for name, plugin in plugins.items(): + dirs = [os.path.join(user_plugin_path, name), os.path.join(plugin.location, 'translations')] + for dirname in dirs: + if not os.path.isdir(dirname): + continue + + plugin_messages, _ = messages_from_po(dirname, locale, domain) + + if plugin_messages is not None: + messages = octoprint.util.dict_merge(messages, plugin_messages) + _logger.debug("Using translation folder {dirname} for locale {locale} of plugin {name}".format(**locals())) + break + else: + _logger.debug("No translations for locale {locale} for plugin {name}".format(**locals())) + + # core translations + ctx = _request_ctx_stack.top + base_path = os.path.join(ctx.app.root_path, "translations") + + dirs = [user_base_path, base_path] + for dirname in dirs: + core_messages, plural_expr = messages_from_po(dirname, locale, domain) + + if core_messages is not None: + messages = octoprint.util.dict_merge(messages, core_messages) + _logger.debug("Using translation folder {dirname} for locale {locale} of core translations".format(**locals())) + break + else: + _logger.debug("No core translations for locale {locale}".format(**locals())) + + catalog = dict( + messages=messages, + plural_expr=plural_expr, + locale=locale, + domain=domain + ) + + return render_template("i18n.js.jinja2", catalog=catalog) + + +@app.route("/plugin_assets//") +def plugin_assets(name, filename): + asset_plugins = pluginManager.get_filtered_implementations(lambda p: p._identifier == name, octoprint.plugin.AssetPlugin) + + if not asset_plugins: + return make_response("Asset not found", 404) + + if len(asset_plugins) > 1: + return make_response("More than one asset provider for {name}, can't proceed".format(name=name), 500) + + asset_plugin = asset_plugins[0] + asset_folder = asset_plugin.get_asset_folder() + if asset_folder is None: + return make_response("Asset not found", 404) + + return send_from_directory(asset_folder, filename) + + diff --git a/src/octoprint/settings.py b/src/octoprint/settings.py index 8a4ad5c5..954b01e5 100644 --- a/src/octoprint/settings.py +++ b/src/octoprint/settings.py @@ -153,7 +153,8 @@ default_settings = { "plugins": None, "slicingProfiles": None, "printerProfiles": None, - "scripts": None + "scripts": None, + "translations": None }, "temperature": { "profiles": [ From 5904d01bffe396b65396364e746c10785e395fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Tue, 2 Jun 2015 13:38:08 +0200 Subject: [PATCH 3/4] Unbundled translations, added new tools to bundle and pack translations The only translation that is going to be bundled with OctoPrint for now will be .de, if at all. The reason simply being that this is the only translation I can update myself and hence guarantee a good user experience for. setup.py now offers two new commands, babel_bundle and babel_pack, with which translations for plugins and core OctoPrint can be automatically bundled or packed as language packs once compiled. This should make sharing translations quite easy in the future. --- setup.py | 5 +- .../translations/fr/LC_MESSAGES/messages.mo | Bin 21776 -> 0 bytes .../translations/fr/LC_MESSAGES/messages.po | 1403 ----------- .../translations/he/LC_MESSAGES/messages.mo | Bin 22496 -> 0 bytes .../translations/he/LC_MESSAGES/messages.po | 1402 ----------- .../translations/nl/LC_MESSAGES/messages.mo | Bin 20827 -> 0 bytes .../translations/nl/LC_MESSAGES/messages.po | 1404 ----------- .../translations/no/LC_MESSAGES/messages.mo | Bin 20068 -> 0 bytes .../translations/no/LC_MESSAGES/messages.po | 1404 ----------- .../translations/ro/LC_MESSAGES/messages.mo | Bin 21301 -> 0 bytes .../translations/ro/LC_MESSAGES/messages.po | 1403 ----------- src/octoprint_setuptools/__init__.py | 146 +- translations/de/LC_MESSAGES/messages.mo | Bin 0 -> 39484 bytes translations/de/LC_MESSAGES/messages.po | 2186 +++++++++++++++++ .../messages.pot | 132 +- 15 files changed, 2409 insertions(+), 7076 deletions(-) delete mode 100644 src/octoprint/translations/fr/LC_MESSAGES/messages.mo delete mode 100644 src/octoprint/translations/fr/LC_MESSAGES/messages.po delete mode 100644 src/octoprint/translations/he/LC_MESSAGES/messages.mo delete mode 100644 src/octoprint/translations/he/LC_MESSAGES/messages.po delete mode 100644 src/octoprint/translations/nl/LC_MESSAGES/messages.mo delete mode 100644 src/octoprint/translations/nl/LC_MESSAGES/messages.po delete mode 100644 src/octoprint/translations/no/LC_MESSAGES/messages.mo delete mode 100644 src/octoprint/translations/no/LC_MESSAGES/messages.po delete mode 100644 src/octoprint/translations/ro/LC_MESSAGES/messages.mo delete mode 100644 src/octoprint/translations/ro/LC_MESSAGES/messages.po create mode 100644 translations/de/LC_MESSAGES/messages.mo create mode 100644 translations/de/LC_MESSAGES/messages.po rename {src/octoprint/translations => translations}/messages.pot (95%) diff --git a/setup.py b/setup.py index 1c314211..9be1cc8f 100644 --- a/setup.py +++ b/setup.py @@ -74,9 +74,10 @@ def get_cmdclass(): cmdclass.update(dict(clean=octoprint_setuptools.CleanCommand.for_options(source_folder="src", eggs=["OctoPrint*.egg-info"]))) # add translation commands - translation_dir = os.path.join("src", "octoprint", "translations") + translation_dir = "translations" pot_file = os.path.join(translation_dir, "messages.pot") - cmdclass.update(octoprint_setuptools.get_babel_commandclasses(pot_file=pot_file, output_dir=translation_dir)) + bundled_dir = os.path.join("src", "octoprint", "translations") + cmdclass.update(octoprint_setuptools.get_babel_commandclasses(pot_file=pot_file, output_dir=translation_dir, pack_name_prefix="OctoPrint-i18n-", pack_path_prefix="", bundled_dir=bundled_dir)) return cmdclass diff --git a/src/octoprint/translations/fr/LC_MESSAGES/messages.mo b/src/octoprint/translations/fr/LC_MESSAGES/messages.mo deleted file mode 100644 index 4d8d4af8a0fd366c8f6d6453402999bf67707965..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21776 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 diff --git a/src/octoprint/translations/fr/LC_MESSAGES/messages.po b/src/octoprint/translations/fr/LC_MESSAGES/messages.po deleted file mode 100644 index 825630d4..00000000 --- a/src/octoprint/translations/fr/LC_MESSAGES/messages.po +++ /dev/null @@ -1,1403 +0,0 @@ -# Translations template for OctoPrint. -# Copyright (C) 2014 The OctoPrint Project -# This file is distributed under the same license as the OctoPrint project. -# -# Translators: -# didierkl , 2014 -msgid "" -msgstr "" -"Project-Id-Version: OctoPrint\n" -"Report-Msgid-Bugs-To: i18n@octoprint.org\n" -"POT-Creation-Date: 2014-12-18 14:45+0100\n" -"PO-Revision-Date: 2014-12-18 14:04+0000\n" -"Last-Translator: Gina Häußge \n" -"Language-Team: French (http://www.transifex.com/projects/p/octoprint/language/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#: src/octoprint/static/js/app/dataupdater.js:52 -#: src/octoprint/static/js/app/dataupdater.js:85 -#: src/octoprint/static/js/app/helpers.js:434 -#: src/octoprint/templates/dialogs.jinja2:55 -msgid "Server is offline" -msgstr "Le serveur est hors ligne" - -#: src/octoprint/static/js/app/dataupdater.js:53 -msgid "" -"The server appears to be offline, at least I'm not getting any response from" -" it. I'll try to reconnect automatically over the next couple of " -"minutes, however you are welcome to try a manual reconnect anytime " -"using the button below." -msgstr "Le serveur semble être hors ligne, du moins je ne reçois aucunes réponses de celui-ci. Je vais tenter de me reconnecter automatiquement dans les minutes qui suivent. Quoiqu'il en soit vous pouvez tenter de vous reconnecter manuellement en utilisant le bouton ci-dessous." - -#: src/octoprint/static/js/app/dataupdater.js:86 -msgid "" -"The server appears to be offline, at least I'm not getting any response from" -" it. I could not reconnect automatically, but you may try a" -" manual reconnect using the button below." -msgstr "Le serveur semble être hors ligne, du moins je ne reçois aucunes réponses de celui-ci. Je n'ai pas pu me reconnecter automatiquement, mais vous pouvez tenter de vous reconnecter manuellement en utilisant le bouton ci-dessous." - -#: src/octoprint/static/js/app/dataupdater.js:158 -#: src/octoprint/static/js/app/dataupdater.js:199 -#, python-format -msgid "Slicing ... (%(percentage)d%%)" -msgstr "" - -#: src/octoprint/static/js/app/dataupdater.js:187 -msgid "Rendering timelapse" -msgstr "Rendu du timelapse en cours" - -#: src/octoprint/static/js/app/dataupdater.js:187 -#, python-format -msgid "Now rendering timelapse %(movie_basename)s" -msgstr "Le rendu du timelapse %(movie_basename)s est en cours" - -#: src/octoprint/static/js/app/dataupdater.js:189 -msgid "Timelapse ready" -msgstr "Le timelapse est prêt" - -#: src/octoprint/static/js/app/dataupdater.js:189 -#, python-format -msgid "New timelapse %(movie_basename)s is done rendering." -msgstr "Le rendu du nouveau timelapse %(movie_basename)s est terminé." - -#: src/octoprint/static/js/app/dataupdater.js:192 -#, python-format -msgid "" -"Rendering of timelapse %(movie_basename)s failed with return code " -"%(returncode)s" -msgstr "" - -#: src/octoprint/static/js/app/dataupdater.js:194 -msgid "Rendering failed" -msgstr "Echec du rendu" - -#: src/octoprint/static/js/app/dataupdater.js:201 -msgid "Slicing ..." -msgstr "Tranchage en cours..." - -#: src/octoprint/static/js/app/dataupdater.js:207 -msgid "Slicing done" -msgstr "Tranchage terminé" - -#: src/octoprint/static/js/app/dataupdater.js:207 -#, python-format -msgid "Sliced %(stl)s to %(gcode)s, took %(time).2f seconds" -msgstr "Tranchage de %(stl)s vers %(gcode)s, en %(time).2f secondes" - -#: src/octoprint/static/js/app/dataupdater.js:228 -#, python-format -msgid "Could not slice %(stl)s to %(gcode)s: %(reason)s" -msgstr "Le tranchage de %(stl)s vers %(gcode)s a échoué: %(reason)s" - -#: src/octoprint/static/js/app/dataupdater.js:229 -msgid "Slicing failed" -msgstr "Le tranchage a échoué" - -#: src/octoprint/static/js/app/dataupdater.js:238 -msgid "Streaming ..." -msgstr "Diffusion en direct en cours..." - -#: src/octoprint/static/js/app/dataupdater.js:244 -msgid "Streaming done" -msgstr "Diffusion en direct terminé" - -#: src/octoprint/static/js/app/dataupdater.js:245 -#, python-format -msgid "Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds" -msgstr "Diffusion de %(local)s vers %(remote)s sur la carte SD, temps: %(time).2f secondes" - -#: src/octoprint/static/js/app/helpers.js:355 -#, python-format -msgid "%(hour)02d:%(minute)02d:%(second)02d" -msgstr "%(hour)02d:%(minute)02d:%(second)02d" - -#: src/octoprint/static/js/app/helpers.js:375 -msgid "YYYY-MM-DD HH:mm" -msgstr "DD-MM-YYYY HH:mm" - -#: src/octoprint/static/js/app/helpers.js:393 -#: src/octoprint/static/js/app/helpers.js:398 -msgid "off" -msgstr "eteint" - -#: src/octoprint/static/js/app/main.js:17 -msgid "Offline" -msgstr "Hors ligne" - -#: src/octoprint/static/js/app/main.js:18 -msgid "Opening serial port" -msgstr "Ouverture du port série en cours" - -#: src/octoprint/static/js/app/main.js:19 -msgid "Detecting serial port" -msgstr "Détection du port série en cours" - -#: src/octoprint/static/js/app/main.js:20 -msgid "Detecting baudrate" -msgstr "Détection du baudrate en cours" - -#: src/octoprint/static/js/app/main.js:21 -msgid "Connecting" -msgstr "Connection en cours" - -#: src/octoprint/static/js/app/main.js:22 -msgid "Operational" -msgstr "Opérationnel" - -#: src/octoprint/static/js/app/main.js:23 -msgid "Printing from SD" -msgstr "Impression depuis la carte SD en cours" - -#: src/octoprint/static/js/app/main.js:24 -msgid "Sending file to SD" -msgstr "Envoi du fichier vers la carte SD en cours" - -#: src/octoprint/static/js/app/main.js:25 -msgid "Printing" -msgstr "Impression en cours" - -#: src/octoprint/static/js/app/main.js:26 -msgid "Paused" -msgstr "En pause" - -#: src/octoprint/static/js/app/main.js:27 -msgid "Closed" -msgstr "Fermé" - -#: src/octoprint/static/js/app/main.js:28 -msgid "Transfering file to SD" -msgstr "Transfert du fichier vers la carte SD en cours" - -#: src/octoprint/static/js/app/main.js:184 -msgid "" -"Could not upload the file. Make sure that it is a GCODE file and has the " -"extension \".gcode\" or \".gco\" or that it is an STL file with the " -"extension \".stl\" and slicing support is enabled and configured." -msgstr "Le chargement du fichier a échoué. Verifiez qu'il s'agit bien d'un fichier GCODE avec l'extension \".gcode\" ou \".gco\" ou d'un fichier STL avec l'extension \".stl\" et que le tranchage est configuré et activé." - -#: src/octoprint/static/js/app/main.js:200 -msgid "Uploading ..." -msgstr "Chargement en cours ..." - -#: src/octoprint/static/js/app/main.js:203 -msgid "Saving ..." -msgstr "Sauvegarde en cours ... " - -#: src/octoprint/static/js/app/viewmodels/appearance.js:9 -#: src/octoprint/static/js/app/viewmodels/appearance.js:11 -#: src/octoprint/static/js/app/viewmodels/appearance.js:16 -#: src/octoprint/static/js/app/viewmodels/appearance.js:18 -msgid "OctoPrint" -msgstr "OctoPrint" - -#: src/octoprint/static/js/app/viewmodels/connection.js:41 -#: src/octoprint/templates/index.jinja2:144 -msgid "Connect" -msgstr "Connecter" - -#: src/octoprint/static/js/app/viewmodels/connection.js:43 -msgid "Disconnect" -msgstr "Déconnecter" - -#: src/octoprint/static/js/app/viewmodels/control.js:42 -#: src/octoprint/static/js/app/viewmodels/files.js:298 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -#: src/octoprint/static/js/app/viewmodels/gcode.js:432 -#: src/octoprint/static/js/app/viewmodels/printerstate.js:166 -#: src/octoprint/static/js/app/viewmodels/temperature.js:56 -msgid "Tool" -msgstr "Outil" - -#: src/octoprint/static/js/app/viewmodels/control.js:49 -#: src/octoprint/static/js/app/viewmodels/temperature.js:68 -msgid "Hotend" -msgstr "Buse" - -#: src/octoprint/static/js/app/viewmodels/files.js:293 -#: src/octoprint/static/js/app/viewmodels/files.js:298 -msgid "Filament" -msgstr "Filament" - -#: src/octoprint/static/js/app/viewmodels/files.js:302 -msgid "Estimated Print Time" -msgstr "Temps d'impression estimé" - -#: src/octoprint/static/js/app/viewmodels/files.js:305 -msgid "Last Printed" -msgstr "Impression précédente" - -#: src/octoprint/static/js/app/viewmodels/files.js:307 -msgid "Last Print Time" -msgstr "Temps d'impression précédent" - -#: src/octoprint/static/js/app/viewmodels/firstrun.js:37 -msgid "" -"If you disable Access Control and your OctoPrint " -"installation is accessible from the internet, your printer will be " -"accessible by everyone - that also includes the bad guys!" -msgstr "Si vous avez désactivé le contrôle d'accès et que votre installation OctoPrint est accessible depuis internet, votre imprimante sera accessible a tout le monde - y compris les méchants!" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:13 -msgid "Loading..." -msgstr "Chargement en cours..." - -#: src/octoprint/static/js/app/viewmodels/gcode.js:17 -msgid "Analyzing..." -msgstr "Analyse en cours..." - -#: src/octoprint/static/js/app/viewmodels/gcode.js:21 -msgid "Analyzed" -msgstr "Analyse terminée" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:395 -msgid "Model size" -msgstr "Taille du modèle" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:397 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -msgid "Total filament used" -msgstr "Quantité de filament utilisé" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:397 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -#: src/octoprint/static/js/app/viewmodels/gcode.js:404 -msgid "mm" -msgstr "mm" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:403 -msgid "Estimated print time" -msgstr "Temps d'impression estimé" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:404 -msgid "Estimated layer height" -msgstr "Hauteur de couche estimée" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "Layer count" -msgstr "Nombre de couches" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "printed" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "visited" -msgstr "visité" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:424 -msgid "Layer number" -msgstr "Couche numéro" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:425 -msgid "Layer height" -msgstr "Hauteur de couche" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:426 -msgid "GCODE commands in layer" -msgstr "Commandes GCODE dans la couche" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:429 -#: src/octoprint/static/js/app/viewmodels/gcode.js:432 -msgid "Filament used by layer" -msgstr "Filament utilisé par couche" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:436 -msgid "Print time for layer" -msgstr "Temps d'impression pour la couche" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:15 -#: src/octoprint/templates/index.jinja2:99 -#: src/octoprint/templates/index.jinja2:110 -msgid "Login" -msgstr "Ouverture de session" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:70 -msgid "Login successful" -msgstr "Ouverture de session réussie" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:70 -#, python-format -msgid "You are now logged in as \"%(username)s\"" -msgstr "Vous êtes maintenant connecter en tant que \"%(username)s\"" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:74 -msgid "Login failed" -msgstr "Ouverture de session échouée" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:74 -msgid "User unknown or wrong password" -msgstr "Utilisateur inconnu ou mauvais mot de passe" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:84 -msgid "Logout successful" -msgstr "Fermeture de session réussie" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:84 -msgid "You are now logged out" -msgstr "Vous êtes maintenant déconnecté" - -#: src/octoprint/static/js/app/viewmodels/navigation.js:17 -#, python-format -msgid "The command \"%(command)s\" executed successfully" -msgstr "La commande \"%(command)s\" a été exécutée avec succès" - -#: src/octoprint/static/js/app/viewmodels/navigation.js:20 -#, python-format -msgid "The command \"%(command)s\" could not be executed." -msgstr "La commande \"%(command)s\" n'a pas pu être exécutée" - -#: src/octoprint/static/js/app/viewmodels/navigation.js:22 -msgid "Error" -msgstr "Erreur" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:84 -#: src/octoprint/static/js/app/viewmodels/settings.js:16 -#: src/octoprint/static/js/app/viewmodels/settings.js:43 -msgid "default" -msgstr "Par défaut" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:85 -#: src/octoprint/static/js/app/viewmodels/settings.js:17 -#: src/octoprint/static/js/app/viewmodels/settings.js:29 -msgid "red" -msgstr "rouge" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:86 -#: src/octoprint/static/js/app/viewmodels/settings.js:18 -#: src/octoprint/static/js/app/viewmodels/settings.js:31 -msgid "orange" -msgstr "orange" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:87 -#: src/octoprint/static/js/app/viewmodels/settings.js:19 -#: src/octoprint/static/js/app/viewmodels/settings.js:33 -msgid "yellow" -msgstr "jaune" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:88 -#: src/octoprint/static/js/app/viewmodels/settings.js:20 -#: src/octoprint/static/js/app/viewmodels/settings.js:35 -msgid "green" -msgstr "vert" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:89 -#: src/octoprint/static/js/app/viewmodels/settings.js:21 -#: src/octoprint/static/js/app/viewmodels/settings.js:37 -msgid "blue" -msgstr "bleu" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:90 -#: src/octoprint/static/js/app/viewmodels/settings.js:23 -#: src/octoprint/static/js/app/viewmodels/settings.js:41 -msgid "black" -msgstr "noir" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:245 -msgid "Add Printer Profile" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:245 -#, python-format -msgid "Edit Printer Profile \"%(name)s\"" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:33 -msgid "Restarts the print job from the beginning" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:34 -msgid "Starts the print job" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:35 -msgid "Resumes the print job" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:36 -msgid "Pauses the print job" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:69 -msgid "Calculating..." -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:82 -msgid "Continue" -msgstr "Continuer" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:84 -#: src/octoprint/templates/index.jinja2:171 -msgid "Pause" -msgstr "Pause" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:95 -#: src/octoprint/templates/index.jinja2:570 -msgid "On Z Change" -msgstr "Sur changement de Z" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:97 -#: src/octoprint/templates/index.jinja2:571 -msgid "Timed" -msgstr "Temps" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:97 -#: src/octoprint/templates/index.jinja2:577 -#: src/octoprint/templates/index.jinja2:584 -msgid "sec" -msgstr "sec" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:205 -msgid "This will restart the print job from the beginning." -msgstr "Ceci va redémarrer le job d'impression depuis le début" - -#: src/octoprint/static/js/app/viewmodels/settings.js:22 -#: src/octoprint/static/js/app/viewmodels/settings.js:39 -msgid "violet" -msgstr "violet" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:24 -msgid "Do nothing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:25 -msgid "Select for printing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:26 -msgid "Start printing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:33 -#, python-format -msgid "Slicing %(filename)s" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:22 -#: src/octoprint/static/js/app/viewmodels/temperature.js:74 -#: src/octoprint/templates/settings.jinja2:428 -msgid "Bed" -msgstr "Lit" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:113 -msgid "just now" -msgstr "a l'instant" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:115 -msgid "min" -msgstr "min" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:255 -#: src/octoprint/templates/index.jinja2:308 -msgid "Actual" -msgstr "Actuel" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:260 -#: src/octoprint/templates/index.jinja2:309 -msgid "Target" -msgstr "Cible" - -#: src/octoprint/templates/dialogs.jinja2:7 -msgid "" -"Please configure which slicer and which slicing profile to use and name the " -"GCode file to slice to below, or click \"Cancel\" if you do not wish to " -"slice the file now." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:10 -msgid "Slicer" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:12 -msgid "Select a slicer..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:16 -msgid "Slicing Profile" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:18 -msgid "Select a slicing profile..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:22 -#: src/octoprint/templates/index.jinja2:136 -msgid "Printer Profile" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:24 -msgid "Select a printer profile..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:28 -msgid "GCode Filename" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:37 -msgid "After slicing..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:45 -#: src/octoprint/templates/dialogs.jinja2:90 -#: src/octoprint/templates/index.jinja2:172 -#: src/octoprint/templates/settings.jinja2:755 -msgid "Cancel" -msgstr "Annuler" - -#: src/octoprint/templates/dialogs.jinja2:46 -#: src/octoprint/templates/index.jinja2:243 -msgid "Slice" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:58 -msgid "Attempt to reconnect" -msgstr "Tentative de reconnection" - -#: src/octoprint/templates/dialogs.jinja2:69 -msgid "Upload locally" -msgstr "Chargement local" - -#: src/octoprint/templates/dialogs.jinja2:71 -#: src/octoprint/templates/index.jinja2:264 -msgid "Upload to SD" -msgstr "Chargement vers la carte SD" - -#: src/octoprint/templates/dialogs.jinja2:71 -msgid "SD not initialized" -msgstr "Carte SD non initialisée" - -#: src/octoprint/templates/dialogs.jinja2:74 -#: src/octoprint/templates/index.jinja2:259 -#: src/octoprint/templates/index.jinja2:270 -msgid "Upload" -msgstr "Chargement" - -#: src/octoprint/templates/dialogs.jinja2:83 -msgid "Are you sure?" -msgstr "Etes-vous sûre?" - -#: src/octoprint/templates/dialogs.jinja2:87 -msgid "Are you sure you want to proceed?" -msgstr "Etes-vous sûre de vouloir continuer?" - -#: src/octoprint/templates/dialogs.jinja2:91 -msgid "Proceed" -msgstr "Continuer" - -#: src/octoprint/templates/dialogs.jinja2:97 -msgid "Configure Access Control" -msgstr "Configuration du contrôle d'accès" - -#: src/octoprint/templates/dialogs.jinja2:100 -msgid "" -"

\n" -" Please read the following, it is very important for your printer's health!\n" -"

\n" -"

\n" -" OctoPrint by default now ships with Access Control enabled, meaning you won't be able to do anything with the\n" -" printer unless you login first as a configured user. This is to prevent strangers - possibly with\n" -" malicious intent - to gain access to your printer via the internet or another untrustworthy network\n" -" and using it in such a way that it is damaged or worse (i.e. causes a fire).\n" -"

\n" -"

\n" -" It looks like you haven't configured access control yet. Please set up an username and password for the\n" -" initial administrator account who will have full access to both the printer and OctoPrint's settings, then click\n" -" on \"Keep Access Control Enabled\":\n" -"

" -msgstr "

\nLisez ceci, c'est très important pour la santé de votre imprimante!\n

\n

\nPar défaut, OctoPrint est livré avec le contrôle d'accès activé, ce qui signifie que vous ne pourrez rien faire avec\nl'imprimante sauf si vous ouvrez uen session en tant qu'utilisateur configuré. Ceci est fait pourempecher des personnes extérieures potentiellement avec de mauvaises intentions\n - d'avoir accès a votre imprimante via internet ou tout autre réseau non sécurisé\net de pouvoir de cette manière utiliser l'imprimante dans le but de l'abimer ou pire (causer un incendie).\n

\n

\nIl semblerait qu vous n'avez pas encore configuré le contrôle d'accès. Veuillez créer un utilisateur et mot de passe pour le\ncompte administrateur initial qui aura un accès comple à l'imprimante ainsi qu'aux paramètres d'OctoPrint, puis cliquez\nsur \"Garder le contrôle d'accès activé\":\n

" - -#: src/octoprint/templates/dialogs.jinja2:116 -#: src/octoprint/templates/index.jinja2:103 -#: src/octoprint/templates/index.jinja2:104 -#: src/octoprint/templates/settings.jinja2:575 -msgid "Username" -msgstr "Nom d'utilisateur" - -#: src/octoprint/templates/dialogs.jinja2:122 -#: src/octoprint/templates/index.jinja2:105 -#: src/octoprint/templates/index.jinja2:106 -#: src/octoprint/templates/settings.jinja2:581 -msgid "Password" -msgstr "Mot de passe" - -#: src/octoprint/templates/dialogs.jinja2:128 -msgid "Confirm Password" -msgstr "Confirmer le mot de passe" - -#: src/octoprint/templates/dialogs.jinja2:131 -#: src/octoprint/templates/settings.jinja2:590 -#: src/octoprint/templates/settings.jinja2:661 -msgid "Passwords do not match" -msgstr "Les mots de passes ne sont pas semblables" - -#: src/octoprint/templates/dialogs.jinja2:135 -msgid "" -"

\n" -" Note: In case that your OctoPrint installation is only accessible from within a trustworthy network and you don't\n" -" need Access Control for other reasons, you may alternatively disable Access Control. You should only\n" -" do this if you are absolutely certain that only people you know and trust will be able to connect to it.\n" -"

\n" -"

\n" -" Do NOT underestimate the risk of an unsecured access from the internet to your printer!\n" -"

" -msgstr "

\nNote: Dans le cas ou votre installation d'OctoPrint est uniquement accessible d'un réseau de confiance et que vous\nn'avez pas besoin du contrôle d'accès pour d'autres raisons; vous pouvez alternativement désactiver le contrôle d'accès. Vous ne devriez seulement\nfaire ceci si vous êtes certain que seuls des personnes que vous connaissez et en qui vous avez confiance auront la possibilité de se connecter.\n

\n

\nNe sous estimé pas le risque d'un accès non sécurisé depuis internet vers votre imprimante!\n

" - -#: src/octoprint/templates/dialogs.jinja2:145 -msgid "Disable Access Control" -msgstr "Désactiver le contrôle d'accès" - -#: src/octoprint/templates/dialogs.jinja2:146 -msgid "Keep Access Control Enabled" -msgstr "Garder le contrôle d'accès activé" - -#: src/octoprint/templates/index.jinja2:82 -msgid "Settings" -msgstr "Paramètres" - -#: src/octoprint/templates/index.jinja2:88 -msgid "System" -msgstr "Systême" - -#: src/octoprint/templates/index.jinja2:108 -msgid "Remember me" -msgstr "Se souvenir de moi" - -#: src/octoprint/templates/index.jinja2:113 -msgid "Change Password" -msgstr "Changer le mot de passe" - -#: src/octoprint/templates/index.jinja2:114 -msgid "Logout" -msgstr "Se déconnecter" - -#: src/octoprint/templates/index.jinja2:128 -msgid "Connection" -msgstr "Connection" - -#: src/octoprint/templates/index.jinja2:132 -#: src/octoprint/templates/settings.jinja2:37 -msgid "Serial Port" -msgstr "Port série" - -#: src/octoprint/templates/index.jinja2:134 -#: src/octoprint/templates/settings.jinja2:43 -msgid "Baudrate" -msgstr "Baudrate" - -#: src/octoprint/templates/index.jinja2:139 -msgid "Save connection settings" -msgstr "Sauvegarder les paramètres de connection" - -#: src/octoprint/templates/index.jinja2:142 -msgid "Auto-connect on server startup" -msgstr "Connection automatique au redémarrage du serveur" - -#: src/octoprint/templates/index.jinja2:150 -msgid "State" -msgstr "Etat" - -#: src/octoprint/templates/index.jinja2:154 -msgid "Machine State" -msgstr "Etat de la machine" - -#: src/octoprint/templates/index.jinja2:155 -msgid "File" -msgstr "Fichier" - -#: src/octoprint/templates/index.jinja2:156 -#: src/octoprint/templates/index.jinja2:293 -msgid "Timelapse" -msgstr "Timelapse" - -#: src/octoprint/templates/index.jinja2:160 -msgid "Approx. Total Print Time" -msgstr "Temps d'impression total approximatif" - -#: src/octoprint/templates/index.jinja2:161 -msgid "Print Time" -msgstr "Temps d'impression" - -#: src/octoprint/templates/index.jinja2:162 -msgid "Print Time Left" -msgstr "Temps d'impression restant" - -#: src/octoprint/templates/index.jinja2:163 -msgid "Printed" -msgstr "Imprimé" - -#: src/octoprint/templates/index.jinja2:170 -msgid "Restart" -msgstr "Redémarrer" - -#: src/octoprint/templates/index.jinja2:170 -msgid "Print" -msgstr "Imprimer" - -#: src/octoprint/templates/index.jinja2:171 -msgid "Resume" -msgstr "" - -#: src/octoprint/templates/index.jinja2:172 -msgid "Cancels the print job" -msgstr "" - -#: src/octoprint/templates/index.jinja2:179 -msgid "Files" -msgstr "Fichiers" - -#: src/octoprint/templates/index.jinja2:186 -msgid "Sort by name" -msgstr "Trier par nom" - -#: src/octoprint/templates/index.jinja2:186 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "ascending" -msgstr "ascendant" - -#: src/octoprint/templates/index.jinja2:187 -msgid "Sort by upload date" -msgstr "Trier par date de chargement" - -#: src/octoprint/templates/index.jinja2:187 -#: src/octoprint/templates/index.jinja2:188 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "descending" -msgstr "descendant" - -#: src/octoprint/templates/index.jinja2:188 -msgid "Sort by file size" -msgstr "Trier par taille des fichiers" - -#: src/octoprint/templates/index.jinja2:190 -msgid "Only show GCode files" -msgstr "" - -#: src/octoprint/templates/index.jinja2:191 -msgid "Only show STL files" -msgstr "" - -#: src/octoprint/templates/index.jinja2:194 -msgid "Only show files stored locally" -msgstr "Ne montre que les fichiers enregistrés localement" - -#: src/octoprint/templates/index.jinja2:195 -msgid "Only show files stored on SD" -msgstr "Ne montrer que les fichier enregistrés sur la carte SD" - -#: src/octoprint/templates/index.jinja2:198 -msgid "Hide successfully printed files" -msgstr "Cacher les fichiers imprimés avec succès" - -#: src/octoprint/templates/index.jinja2:208 -msgid "Initialize SD card" -msgstr "Initialiser la carte SD" - -#: src/octoprint/templates/index.jinja2:209 -msgid "Refresh SD files" -msgstr "Rafraichir les fichiers de la carte SD" - -#: src/octoprint/templates/index.jinja2:210 -msgid "Release SD card" -msgstr "Libérer la carte SD" - -#: src/octoprint/templates/index.jinja2:218 -msgid "Search..." -msgstr "Rechercher..." - -#: src/octoprint/templates/index.jinja2:225 -#: src/octoprint/templates/index.jinja2:239 -msgid "Uploaded" -msgstr "Chargé" - -#: src/octoprint/templates/index.jinja2:226 -#: src/octoprint/templates/index.jinja2:240 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/index.jinja2:608 -#: src/octoprint/templates/settings.jinja2:709 -#: src/octoprint/templates/settings.jinja2:716 -msgid "Size" -msgstr "Taille" - -#: src/octoprint/templates/index.jinja2:230 -msgid "Download" -msgstr "Télécharger" - -#: src/octoprint/templates/index.jinja2:231 -#: src/octoprint/templates/index.jinja2:242 -msgid "Remove" -msgstr "Supprimer" - -#: src/octoprint/templates/index.jinja2:232 -msgid "Load" -msgstr "Charger" - -#: src/octoprint/templates/index.jinja2:233 -msgid "Load and Print" -msgstr "Charger et imprimer" - -#: src/octoprint/templates/index.jinja2:252 -msgid "Free" -msgstr "Libérer" - -#: src/octoprint/templates/index.jinja2:279 -msgid "Hint: You can also drag and drop files on this page to upload them." -msgstr "Astuce: Vous pouvez également vers un glisser/déposer des fichiers sur la page pour les charger." - -#: src/octoprint/templates/index.jinja2:289 -msgid "Temperature" -msgstr "Température" - -#: src/octoprint/templates/index.jinja2:290 -msgid "Control" -msgstr "Contrôle" - -#: src/octoprint/templates/index.jinja2:291 -msgid "GCode Viewer" -msgstr "Visualisateur de GCode" - -#: src/octoprint/templates/index.jinja2:292 -msgid "Terminal" -msgstr "Terminal" - -#: src/octoprint/templates/index.jinja2:310 -msgid "Offset" -msgstr "Offset" - -#: src/octoprint/templates/index.jinja2:326 -#: src/octoprint/templates/index.jinja2:348 -msgid "Set" -msgstr "Fixer" - -#: src/octoprint/templates/index.jinja2:338 -#: src/octoprint/templates/index.jinja2:569 -msgid "Off" -msgstr "Eteint" - -#: src/octoprint/templates/index.jinja2:406 -msgid "Select Tool..." -msgstr "Sélectionner outil..." - -#: src/octoprint/templates/index.jinja2:417 -msgid "Extrude" -msgstr "Extruder" - -#: src/octoprint/templates/index.jinja2:418 -msgid "Retract" -msgstr "Retracter" - -#: src/octoprint/templates/index.jinja2:423 -msgid "General" -msgstr "Général" - -#: src/octoprint/templates/index.jinja2:425 -msgid "Motors off" -msgstr "Eteindre les moteurs" - -#: src/octoprint/templates/index.jinja2:426 -msgid "Fans on" -msgstr "Allumer la ventilation" - -#: src/octoprint/templates/index.jinja2:427 -msgid "Fans off" -msgstr "Eteindre la ventilation" - -#: src/octoprint/templates/index.jinja2:491 -msgid "Sync with job progress" -msgstr "Synchroniser avec le progrès du job" - -#: src/octoprint/templates/index.jinja2:496 -msgid "Center viewport on model" -msgstr "Centrer le point du vue sur le modèle" - -#: src/octoprint/templates/index.jinja2:499 -msgid "Zoom in on model" -msgstr "Zoomer sur le modèle" - -#: src/octoprint/templates/index.jinja2:505 -msgid "Show moves" -msgstr "Montrer les mouvements" - -#: src/octoprint/templates/index.jinja2:508 -msgid "Show retracts" -msgstr "Montrer les rétraction" - -#: src/octoprint/templates/index.jinja2:514 -msgid "Also show previous layer" -msgstr "Montrer également la couche précédente" - -#: src/octoprint/templates/index.jinja2:517 -msgid "Also show next layer" -msgstr "Montrer également la couche suivante" - -#: src/octoprint/templates/index.jinja2:522 -msgid "Reload" -msgstr "Re-charger" - -#: src/octoprint/templates/index.jinja2:549 -msgid "Autoscroll" -msgstr "Scroll automatique" - -#: src/octoprint/templates/index.jinja2:559 -msgid "Send" -msgstr "Envoyer" - -#: src/octoprint/templates/index.jinja2:565 -msgid "Timelapse Configuration" -msgstr "Configuration du timelapse" - -#: src/octoprint/templates/index.jinja2:567 -msgid "Timelapse Mode" -msgstr "Mode du timelapse" - -#: src/octoprint/templates/index.jinja2:574 -msgid "Timelapse post roll (in rendered seconds)" -msgstr "Post roll du timelapse (en secondes rendues)" - -#: src/octoprint/templates/index.jinja2:581 -msgid "Interval" -msgstr "Intervalle" - -#: src/octoprint/templates/index.jinja2:590 -msgid "Save as default" -msgstr "Sauver en tant que défaut" - -#: src/octoprint/templates/index.jinja2:595 -msgid "Save config" -msgstr "Sauver la configuration" - -#: src/octoprint/templates/index.jinja2:599 -msgid "Finished Timelapses" -msgstr "Timelapses terminés" - -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "Sort by" -msgstr "Trier par" - -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/index.jinja2:607 -#: src/octoprint/templates/settings.jinja2:114 -#: src/octoprint/templates/settings.jinja2:140 -#: src/octoprint/templates/settings.jinja2:458 -#: src/octoprint/templates/settings.jinja2:534 -#: src/octoprint/templates/settings.jinja2:709 -#: src/octoprint/templates/settings.jinja2:715 -msgid "Name" -msgstr "Nom" - -#: src/octoprint/templates/index.jinja2:602 -msgid "Creation date" -msgstr "Date de création" - -#: src/octoprint/templates/index.jinja2:609 -#: src/octoprint/templates/settings.jinja2:116 -#: src/octoprint/templates/settings.jinja2:537 -#: src/octoprint/templates/settings.jinja2:718 -msgid "Action" -msgstr "Action" - -#: src/octoprint/templates/index.jinja2:638 -msgid "Version" -msgstr "Version" - -#: src/octoprint/templates/index.jinja2:641 -msgid "Homepage" -msgstr "Page d'accueil" - -#: src/octoprint/templates/index.jinja2:642 -msgid "Sourcecode" -msgstr "Code source" - -#: src/octoprint/templates/index.jinja2:643 -msgid "Documentation" -msgstr "Documentation" - -#: src/octoprint/templates/index.jinja2:644 -msgid "Bugs and Requests" -msgstr "Bugs et demandes" - -#: src/octoprint/templates/settings.jinja2:4 -msgid "OctoPrint Settings" -msgstr "Paramètres d'OctoPrint" - -#: src/octoprint/templates/settings.jinja2:9 -msgid "Printer" -msgstr "Imprimante" - -#: src/octoprint/templates/settings.jinja2:10 -msgid "Serial Connection" -msgstr "Connection série" - -#: src/octoprint/templates/settings.jinja2:11 -#: src/octoprint/templates/settings.jinja2:110 -msgid "Printer Profiles" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:12 -msgid "Temperatures" -msgstr "Températures" - -#: src/octoprint/templates/settings.jinja2:13 -msgid "Terminal filters" -msgstr "Filtres du terminal" - -#: src/octoprint/templates/settings.jinja2:14 -#: src/octoprint/templates/settings.jinja2:15 -msgid "Features" -msgstr "Fonctionnalités" - -#: src/octoprint/templates/settings.jinja2:16 -msgid "Webcam" -msgstr "Webcam" - -#: src/octoprint/templates/settings.jinja2:17 -msgid "Access Control" -msgstr "Contrôle d'accès" - -#: src/octoprint/templates/settings.jinja2:18 -msgid "API" -msgstr "API" - -#: src/octoprint/templates/settings.jinja2:20 -msgid "Folders" -msgstr "Répertoires" - -#: src/octoprint/templates/settings.jinja2:21 -msgid "Appearance" -msgstr "Apparence" - -#: src/octoprint/templates/settings.jinja2:22 -#: src/octoprint/templates/settings.jinja2:705 -msgid "Logs" -msgstr "Logs" - -#: src/octoprint/templates/settings.jinja2:51 -msgid "Auto-connect to printer on server start" -msgstr "Connection automatique a l'imprimante au redémarrage du serveur" - -#: src/octoprint/templates/settings.jinja2:56 -msgid "Communication timeout" -msgstr "Timeout de communication" - -#: src/octoprint/templates/settings.jinja2:65 -msgid "Temperature timeout" -msgstr "Timeout de la température" - -#: src/octoprint/templates/settings.jinja2:74 -msgid "SD status timeout" -msgstr "Timeout du statut de la carte SD" - -#: src/octoprint/templates/settings.jinja2:83 -msgid "Connection timeout" -msgstr "Timeout de connection" - -#: src/octoprint/templates/settings.jinja2:92 -msgid "Autodetection timeout" -msgstr "Timeout d'auto-détection" - -#: src/octoprint/templates/settings.jinja2:103 -msgid "Log communication to serial.log (might negatively impact performance)" -msgstr "Communication vers le log serial.log (peut impacter négativement la performance)" - -#: src/octoprint/templates/settings.jinja2:103 -msgid "Warning" -msgstr "Avertissement" - -#: src/octoprint/templates/settings.jinja2:115 -#: src/octoprint/templates/settings.jinja2:152 -msgid "Model" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Set as default profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Edit Profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Delete Profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:130 -msgid "Add Profile..." -msgstr "" - -#: src/octoprint/templates/settings.jinja2:146 -msgid "Identifier" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:158 -#: src/octoprint/templates/settings.jinja2:490 -msgid "Color" -msgstr "Couleur" - -#: src/octoprint/templates/settings.jinja2:165 -msgid "Form Factor" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:167 -msgid "Rectangular" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:170 -msgid "Circular" -msgstr "Circulaire" - -#: src/octoprint/templates/settings.jinja2:174 -msgid "Volume" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:176 -#: src/octoprint/templates/settings.jinja2:206 -msgid "X" -msgstr "X" - -#: src/octoprint/templates/settings.jinja2:183 -#: src/octoprint/templates/settings.jinja2:216 -msgid "Y" -msgstr "Y" - -#: src/octoprint/templates/settings.jinja2:190 -#: src/octoprint/templates/settings.jinja2:226 -msgid "Z" -msgstr "Z" - -#: src/octoprint/templates/settings.jinja2:198 -msgid "Heated Bed" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:204 -msgid "Axis" -msgstr "Axe" - -#: src/octoprint/templates/settings.jinja2:212 -#: src/octoprint/templates/settings.jinja2:222 -#: src/octoprint/templates/settings.jinja2:232 -msgid "Invert control" -msgstr "Inverser le contrôle" - -#: src/octoprint/templates/settings.jinja2:236 -msgid "E" -msgstr "E" - -#: src/octoprint/templates/settings.jinja2:244 -msgid "Nozzle Diameter" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:253 -msgid "Number of Extruders" -msgstr "Nombre d'extrudeurs" - -#: src/octoprint/templates/settings.jinja2:259 -msgid "Extruder Offsets" -msgstr "Offsets de l'extrudeur" - -#: src/octoprint/templates/settings.jinja2:278 -#: src/octoprint/templates/settings.jinja2:610 -#: src/octoprint/templates/settings.jinja2:639 -#: src/octoprint/templates/settings.jinja2:689 -msgid "Abort" -msgstr "Annuler" - -#: src/octoprint/templates/settings.jinja2:279 -#: src/octoprint/templates/settings.jinja2:611 -#: src/octoprint/templates/settings.jinja2:640 -#: src/octoprint/templates/settings.jinja2:690 -msgid "Confirm" -msgstr "Confirmer" - -#: src/octoprint/templates/settings.jinja2:286 -msgid "Stream URL" -msgstr "URL de diffusion en direct" - -#: src/octoprint/templates/settings.jinja2:292 -msgid "Snapshot URL" -msgstr "URL de la photo instantanée" - -#: src/octoprint/templates/settings.jinja2:298 -msgid "Path to FFMPEG" -msgstr "Chemin vers FFMPEG" - -#: src/octoprint/templates/settings.jinja2:304 -msgid "Timelapse bitrate" -msgstr "Bitrate du timelapse" - -#: src/octoprint/templates/settings.jinja2:312 -msgid "Enable OctoPrint watermark in timelapse movies" -msgstr "Activer le watermark Octoprint sur les films timelapses" - -#: src/octoprint/templates/settings.jinja2:319 -msgid "Flip webcam horizontally" -msgstr "Rotation de la webcam horizontalement" - -#: src/octoprint/templates/settings.jinja2:324 -msgid "Flip webcam vertically" -msgstr "Rotation de la webcam verticalement" - -#: src/octoprint/templates/settings.jinja2:335 -msgid "Enable Temperature Graph" -msgstr "Activer le graphique de température" - -#: src/octoprint/templates/settings.jinja2:342 -msgid "Enable GCode Visualizer" -msgstr "Activer le visualisateur de GCode" - -#: src/octoprint/templates/settings.jinja2:349 -msgid "Enable SD support" -msgstr "Activer le support de carte SD" - -#: src/octoprint/templates/settings.jinja2:356 -msgid "Always assume SD card is present" -msgstr "Toujours supposer que la carte SD est présente" - -#: src/octoprint/templates/settings.jinja2:356 -#: src/octoprint/templates/settings.jinja2:370 -#: src/octoprint/templates/settings.jinja2:377 -msgid "Repetier" -msgstr "Repetier" - -#: src/octoprint/templates/settings.jinja2:363 -msgid "Wait for start on connect" -msgstr "Attendre start à la connection" - -#: src/octoprint/templates/settings.jinja2:370 -msgid "Send a checksum with every command" -msgstr "Envoyer un checksum avec chaque commande" - -#: src/octoprint/templates/settings.jinja2:377 -#, python-format -msgid "" -"Support TargetExtr%%n/TargetBed target temperature" -" format" -msgstr "Support TargetExtr%%n/TargetBed format de température de la cible" - -#: src/octoprint/templates/settings.jinja2:384 -msgid "Swallow the first \"ok\" after a resend response" -msgstr "Avaler le premier \"ok\" après le ré-envoi d'une réponse" - -#: src/octoprint/templates/settings.jinja2:393 -msgid "Upload Folder" -msgstr "Répertoire des chargements" - -#: src/octoprint/templates/settings.jinja2:399 -msgid "Timelapse Folder" -msgstr "Répertoire des timelapses" - -#: src/octoprint/templates/settings.jinja2:405 -msgid "Timelapse Temp Folder" -msgstr "Répertoire temporaire des timelapses" - -#: src/octoprint/templates/settings.jinja2:411 -msgid "Logs Folder" -msgstr "Répertoire des logs" - -#: src/octoprint/templates/settings.jinja2:417 -msgid "Watched Folder" -msgstr "Répertoire observé" - -#: src/octoprint/templates/settings.jinja2:427 -msgid "Extruder" -msgstr "Extrudeur" - -#: src/octoprint/templates/settings.jinja2:459 -msgid "RegExp" -msgstr "RegExp" - -#: src/octoprint/templates/settings.jinja2:484 -msgid "Title" -msgstr "Titre" - -#: src/octoprint/templates/settings.jinja2:503 -msgid "Enable" -msgstr "Activer" - -#: src/octoprint/templates/settings.jinja2:510 -#, python-format -msgid "Allow Cross Origin Resource Sharing (CORS)" -msgstr "Permettre Cross Origin Resource Sharing (CORS)" - -#: src/octoprint/templates/settings.jinja2:515 -#: src/octoprint/templates/settings.jinja2:542 -msgid "API Key" -msgstr "clé API" - -#: src/octoprint/templates/settings.jinja2:521 -#: src/octoprint/templates/settings.jinja2:679 -msgid "QR Code" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:535 -#: src/octoprint/templates/settings.jinja2:596 -#: src/octoprint/templates/settings.jinja2:625 -msgid "Active" -msgstr "Actif" - -#: src/octoprint/templates/settings.jinja2:536 -#: src/octoprint/templates/settings.jinja2:603 -#: src/octoprint/templates/settings.jinja2:632 -msgid "Admin" -msgstr "Administrateur" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Update User" -msgstr "Mettre à jour l'utilisateur" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Change password" -msgstr "Changer le mot de passe" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Delete user" -msgstr "Supprimer utilisateur" - -#: src/octoprint/templates/settings.jinja2:563 -#: src/octoprint/templates/settings.jinja2:570 -msgid "Add user" -msgstr "Ajouter utilisateur" - -#: src/octoprint/templates/settings.jinja2:587 -#: src/octoprint/templates/settings.jinja2:658 -msgid "Repeat Password" -msgstr "Répéter le mot de passe" - -#: src/octoprint/templates/settings.jinja2:618 -#, python-format -msgid "Edit user \"%(user)s\"" -msgstr "Editer l'utilisateur \"%(user)s\"" - -#: src/octoprint/templates/settings.jinja2:647 -#, python-format -msgid "Change password for user \"%(user)s\"" -msgstr "Changer le mot de passe pour l'utilisateur \"%(user)s\"" - -#: src/octoprint/templates/settings.jinja2:652 -msgid "New Password" -msgstr "Nouveau mot de passe" - -#: src/octoprint/templates/settings.jinja2:667 -msgid "Current API Key" -msgstr "Clé API courante" - -#: src/octoprint/templates/settings.jinja2:670 -msgid "N/A" -msgstr "N/A" - -#: src/octoprint/templates/settings.jinja2:709 -msgid "Modification date" -msgstr "Date de modification" - -#: src/octoprint/templates/settings.jinja2:717 -msgid "Date" -msgstr "Date" - -#: src/octoprint/templates/settings.jinja2:756 -msgid "Save" -msgstr "Sauver" diff --git a/src/octoprint/translations/he/LC_MESSAGES/messages.mo b/src/octoprint/translations/he/LC_MESSAGES/messages.mo deleted file mode 100644 index 61338264000eb0e8b01982306422f05911df7dc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22496 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 diff --git a/src/octoprint/translations/he/LC_MESSAGES/messages.po b/src/octoprint/translations/he/LC_MESSAGES/messages.po deleted file mode 100644 index 92351c5a..00000000 --- a/src/octoprint/translations/he/LC_MESSAGES/messages.po +++ /dev/null @@ -1,1402 +0,0 @@ -# Translations template for OctoPrint. -# Copyright (C) 2014 The OctoPrint Project -# This file is distributed under the same license as the OctoPrint project. -# -# Translators: -msgid "" -msgstr "" -"Project-Id-Version: OctoPrint\n" -"Report-Msgid-Bugs-To: i18n@octoprint.org\n" -"POT-Creation-Date: 2014-12-18 14:45+0100\n" -"PO-Revision-Date: 2014-12-18 14:04+0000\n" -"Last-Translator: Gina Häußge \n" -"Language-Team: Hebrew (http://www.transifex.com/projects/p/octoprint/language/he/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Language: he\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: src/octoprint/static/js/app/dataupdater.js:52 -#: src/octoprint/static/js/app/dataupdater.js:85 -#: src/octoprint/static/js/app/helpers.js:434 -#: src/octoprint/templates/dialogs.jinja2:55 -msgid "Server is offline" -msgstr "שרת לא מחובר" - -#: src/octoprint/static/js/app/dataupdater.js:53 -msgid "" -"The server appears to be offline, at least I'm not getting any response from" -" it. I'll try to reconnect automatically over the next couple of " -"minutes, however you are welcome to try a manual reconnect anytime " -"using the button below." -msgstr "נראה שהשרת לא מחובר, או לפחות אני לא מצליח לקבל כל תגובה ממנו. אנסה להתחבר מחדש אוטומטית בעוד מספר דקות, אבל ניתן גם לנסות להתחבר מחדש עם הכפתור להלן." - -#: src/octoprint/static/js/app/dataupdater.js:86 -msgid "" -"The server appears to be offline, at least I'm not getting any response from" -" it. I could not reconnect automatically, but you may try a" -" manual reconnect using the button below." -msgstr "נראה שהשרת לא מחורב, או לפחות אני לא מצליח לקבל כל תגובה ממנו. החיבור האוטומאטי נכשל, אבל ניתן גם לנסות להתחבר מחדש עם הכפתור להלן." - -#: src/octoprint/static/js/app/dataupdater.js:158 -#: src/octoprint/static/js/app/dataupdater.js:199 -#, python-format -msgid "Slicing ... (%(percentage)d%%)" -msgstr "" - -#: src/octoprint/static/js/app/dataupdater.js:187 -msgid "Rendering timelapse" -msgstr "מרנדר timelapse" - -#: src/octoprint/static/js/app/dataupdater.js:187 -#, python-format -msgid "Now rendering timelapse %(movie_basename)s" -msgstr "כעת מרנדר timelapse %(movie_basename)s" - -#: src/octoprint/static/js/app/dataupdater.js:189 -msgid "Timelapse ready" -msgstr "Timelapse מוכן" - -#: src/octoprint/static/js/app/dataupdater.js:189 -#, python-format -msgid "New timelapse %(movie_basename)s is done rendering." -msgstr "סיים לרנדר את ה-timelapse %(movie_basename)s" - -#: src/octoprint/static/js/app/dataupdater.js:192 -#, python-format -msgid "" -"Rendering of timelapse %(movie_basename)s failed with return code " -"%(returncode)s" -msgstr "" - -#: src/octoprint/static/js/app/dataupdater.js:194 -msgid "Rendering failed" -msgstr "רינדור נכשל" - -#: src/octoprint/static/js/app/dataupdater.js:201 -msgid "Slicing ..." -msgstr "פורס..." - -#: src/octoprint/static/js/app/dataupdater.js:207 -msgid "Slicing done" -msgstr "פריסה הושלמה" - -#: src/octoprint/static/js/app/dataupdater.js:207 -#, python-format -msgid "Sliced %(stl)s to %(gcode)s, took %(time).2f seconds" -msgstr "פריסה של %(stl)s אל %(gcode)s, לקח %(time).2f שניות" - -#: src/octoprint/static/js/app/dataupdater.js:228 -#, python-format -msgid "Could not slice %(stl)s to %(gcode)s: %(reason)s" -msgstr "לא היה ניתן לפרוס %(stl)s אל %(gcode)s: %(reason)s" - -#: src/octoprint/static/js/app/dataupdater.js:229 -msgid "Slicing failed" -msgstr "פריסה נכשלה" - -#: src/octoprint/static/js/app/dataupdater.js:238 -msgid "Streaming ..." -msgstr "משדר ..." - -#: src/octoprint/static/js/app/dataupdater.js:244 -msgid "Streaming done" -msgstr "השידור הסתיים" - -#: src/octoprint/static/js/app/dataupdater.js:245 -#, python-format -msgid "Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds" -msgstr "שודר %(local)s אל%(remote)s על SD, לקח %(time).2f שניות" - -#: src/octoprint/static/js/app/helpers.js:355 -#, python-format -msgid "%(hour)02d:%(minute)02d:%(second)02d" -msgstr "%(hour)02d:%(minute)02d:%(second)02d" - -#: src/octoprint/static/js/app/helpers.js:375 -msgid "YYYY-MM-DD HH:mm" -msgstr "YYYY-MM-DD HH:mm" - -#: src/octoprint/static/js/app/helpers.js:393 -#: src/octoprint/static/js/app/helpers.js:398 -msgid "off" -msgstr "כיבוי" - -#: src/octoprint/static/js/app/main.js:17 -msgid "Offline" -msgstr "לא מחובר" - -#: src/octoprint/static/js/app/main.js:18 -msgid "Opening serial port" -msgstr "פותח יצירה טורית" - -#: src/octoprint/static/js/app/main.js:19 -msgid "Detecting serial port" -msgstr "מאתר יצירה טורית" - -#: src/octoprint/static/js/app/main.js:20 -msgid "Detecting baudrate" -msgstr "מאתר מהירות העברה" - -#: src/octoprint/static/js/app/main.js:21 -msgid "Connecting" -msgstr "מתחבר" - -#: src/octoprint/static/js/app/main.js:22 -msgid "Operational" -msgstr "אופציונלי" - -#: src/octoprint/static/js/app/main.js:23 -msgid "Printing from SD" -msgstr "הדפסה מ-SD" - -#: src/octoprint/static/js/app/main.js:24 -msgid "Sending file to SD" -msgstr "שולח קובץ אל SD" - -#: src/octoprint/static/js/app/main.js:25 -msgid "Printing" -msgstr "מדפיס" - -#: src/octoprint/static/js/app/main.js:26 -msgid "Paused" -msgstr "בהפסקה" - -#: src/octoprint/static/js/app/main.js:27 -msgid "Closed" -msgstr "סגור" - -#: src/octoprint/static/js/app/main.js:28 -msgid "Transfering file to SD" -msgstr "מעביר קובץ ל-SD" - -#: src/octoprint/static/js/app/main.js:184 -msgid "" -"Could not upload the file. Make sure that it is a GCODE file and has the " -"extension \".gcode\" or \".gco\" or that it is an STL file with the " -"extension \".stl\" and slicing support is enabled and configured." -msgstr "לא היה ניתן להעלות קובץ. יש וודא שזה הוא קובץ GCODE ושסיומת הקובץ היא \".gcode\" או \".gco\". או שהקובץ הוא STL עם הסיומת \".stl\" כאשר פריסה מתמכת, מופעלת ומוגדרת." - -#: src/octoprint/static/js/app/main.js:200 -msgid "Uploading ..." -msgstr "מעלה ..." - -#: src/octoprint/static/js/app/main.js:203 -msgid "Saving ..." -msgstr "שומר ..." - -#: src/octoprint/static/js/app/viewmodels/appearance.js:9 -#: src/octoprint/static/js/app/viewmodels/appearance.js:11 -#: src/octoprint/static/js/app/viewmodels/appearance.js:16 -#: src/octoprint/static/js/app/viewmodels/appearance.js:18 -msgid "OctoPrint" -msgstr "אוקטופרינט" - -#: src/octoprint/static/js/app/viewmodels/connection.js:41 -#: src/octoprint/templates/index.jinja2:144 -msgid "Connect" -msgstr "התחבר" - -#: src/octoprint/static/js/app/viewmodels/connection.js:43 -msgid "Disconnect" -msgstr "התנתק" - -#: src/octoprint/static/js/app/viewmodels/control.js:42 -#: src/octoprint/static/js/app/viewmodels/files.js:298 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -#: src/octoprint/static/js/app/viewmodels/gcode.js:432 -#: src/octoprint/static/js/app/viewmodels/printerstate.js:166 -#: src/octoprint/static/js/app/viewmodels/temperature.js:56 -msgid "Tool" -msgstr "כלי" - -#: src/octoprint/static/js/app/viewmodels/control.js:49 -#: src/octoprint/static/js/app/viewmodels/temperature.js:68 -msgid "Hotend" -msgstr "קצה חם" - -#: src/octoprint/static/js/app/viewmodels/files.js:293 -#: src/octoprint/static/js/app/viewmodels/files.js:298 -msgid "Filament" -msgstr "סיב חומר" - -#: src/octoprint/static/js/app/viewmodels/files.js:302 -msgid "Estimated Print Time" -msgstr "זמן הדפסה מוערך" - -#: src/octoprint/static/js/app/viewmodels/files.js:305 -msgid "Last Printed" -msgstr "הודפס לאחרונה" - -#: src/octoprint/static/js/app/viewmodels/files.js:307 -msgid "Last Print Time" -msgstr "זמן הדפסה אחרון" - -#: src/octoprint/static/js/app/viewmodels/firstrun.js:37 -msgid "" -"If you disable Access Control and your OctoPrint " -"installation is accessible from the internet, your printer will be " -"accessible by everyone - that also includes the bad guys!" -msgstr "אם ברצוך לבטל את ההרשאות גישה וגם ההתקנה של אוקטופרינט ניתנת לגישה דרך האינטרנט, אז כל אחד יוכל לשלוט על המדפסת שלך, זה כולל אנשים רעים!" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:13 -msgid "Loading..." -msgstr "טוען" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:17 -msgid "Analyzing..." -msgstr "מנתח נתונים ..." - -#: src/octoprint/static/js/app/viewmodels/gcode.js:21 -msgid "Analyzed" -msgstr "נתונים נותחו" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:395 -msgid "Model size" -msgstr "גודל מודל" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:397 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -msgid "Total filament used" -msgstr "סך הכל סיב חומר שנדרש" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:397 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -#: src/octoprint/static/js/app/viewmodels/gcode.js:404 -msgid "mm" -msgstr "מ\"מ" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:403 -msgid "Estimated print time" -msgstr "זמן הדפסה משוער" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:404 -msgid "Estimated layer height" -msgstr "גובה שכבות משוער" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "Layer count" -msgstr "מספר שכבות" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "printed" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "visited" -msgstr "בִּקֵּר" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:424 -msgid "Layer number" -msgstr "שכבה מספר" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:425 -msgid "Layer height" -msgstr "גובה שכבה" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:426 -msgid "GCODE commands in layer" -msgstr "פקודות GCODE בשכבה" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:429 -#: src/octoprint/static/js/app/viewmodels/gcode.js:432 -msgid "Filament used by layer" -msgstr "סיב חומר שנדש בשכבה" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:436 -msgid "Print time for layer" -msgstr "זמן הדפסה עבור שכבה" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:15 -#: src/octoprint/templates/index.jinja2:99 -#: src/octoprint/templates/index.jinja2:110 -msgid "Login" -msgstr "כניסה" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:70 -msgid "Login successful" -msgstr "כניסה למערכת התבצעה בהצלחה" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:70 -#, python-format -msgid "You are now logged in as \"%(username)s\"" -msgstr "מחובר כעת בתור \"%(username)s\"" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:74 -msgid "Login failed" -msgstr "כניסה למערכת נכשלה" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:74 -msgid "User unknown or wrong password" -msgstr "שם משתמש לא מוכר, או שגיאה בסיסמה" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:84 -msgid "Logout successful" -msgstr "כניסה התבצעה בהצלחה" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:84 -msgid "You are now logged out" -msgstr "התנתקת מהמערכת" - -#: src/octoprint/static/js/app/viewmodels/navigation.js:17 -#, python-format -msgid "The command \"%(command)s\" executed successfully" -msgstr "הפקודה \"%(command)s\" התבצעה בהצלחה" - -#: src/octoprint/static/js/app/viewmodels/navigation.js:20 -#, python-format -msgid "The command \"%(command)s\" could not be executed." -msgstr "לא ניתן לבצע את הפקודה \"%(command)s\"." - -#: src/octoprint/static/js/app/viewmodels/navigation.js:22 -msgid "Error" -msgstr "שגיאה" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:84 -#: src/octoprint/static/js/app/viewmodels/settings.js:16 -#: src/octoprint/static/js/app/viewmodels/settings.js:43 -msgid "default" -msgstr "ברית מחדל" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:85 -#: src/octoprint/static/js/app/viewmodels/settings.js:17 -#: src/octoprint/static/js/app/viewmodels/settings.js:29 -msgid "red" -msgstr "אדום" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:86 -#: src/octoprint/static/js/app/viewmodels/settings.js:18 -#: src/octoprint/static/js/app/viewmodels/settings.js:31 -msgid "orange" -msgstr "כתום" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:87 -#: src/octoprint/static/js/app/viewmodels/settings.js:19 -#: src/octoprint/static/js/app/viewmodels/settings.js:33 -msgid "yellow" -msgstr "צהוב" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:88 -#: src/octoprint/static/js/app/viewmodels/settings.js:20 -#: src/octoprint/static/js/app/viewmodels/settings.js:35 -msgid "green" -msgstr "ירוק" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:89 -#: src/octoprint/static/js/app/viewmodels/settings.js:21 -#: src/octoprint/static/js/app/viewmodels/settings.js:37 -msgid "blue" -msgstr "כחול" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:90 -#: src/octoprint/static/js/app/viewmodels/settings.js:23 -#: src/octoprint/static/js/app/viewmodels/settings.js:41 -msgid "black" -msgstr "שחור" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:245 -msgid "Add Printer Profile" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:245 -#, python-format -msgid "Edit Printer Profile \"%(name)s\"" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:33 -msgid "Restarts the print job from the beginning" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:34 -msgid "Starts the print job" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:35 -msgid "Resumes the print job" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:36 -msgid "Pauses the print job" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:69 -msgid "Calculating..." -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:82 -msgid "Continue" -msgstr "המשך" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:84 -#: src/octoprint/templates/index.jinja2:171 -msgid "Pause" -msgstr "הפסק" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:95 -#: src/octoprint/templates/index.jinja2:570 -msgid "On Z Change" -msgstr "שינוי ציר Z" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:97 -#: src/octoprint/templates/index.jinja2:571 -msgid "Timed" -msgstr "מתוזמן" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:97 -#: src/octoprint/templates/index.jinja2:577 -#: src/octoprint/templates/index.jinja2:584 -msgid "sec" -msgstr "שנ'" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:205 -msgid "This will restart the print job from the beginning." -msgstr "פעולה זו תתחיל מחדש את ההדפסה מהתחלה" - -#: src/octoprint/static/js/app/viewmodels/settings.js:22 -#: src/octoprint/static/js/app/viewmodels/settings.js:39 -msgid "violet" -msgstr "סגול" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:24 -msgid "Do nothing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:25 -msgid "Select for printing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:26 -msgid "Start printing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:33 -#, python-format -msgid "Slicing %(filename)s" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:22 -#: src/octoprint/static/js/app/viewmodels/temperature.js:74 -#: src/octoprint/templates/settings.jinja2:428 -msgid "Bed" -msgstr "מיטה" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:113 -msgid "just now" -msgstr "זה הרגע" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:115 -msgid "min" -msgstr "דקו'" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:255 -#: src/octoprint/templates/index.jinja2:308 -msgid "Actual" -msgstr "נוכחי" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:260 -#: src/octoprint/templates/index.jinja2:309 -msgid "Target" -msgstr "מטרה" - -#: src/octoprint/templates/dialogs.jinja2:7 -msgid "" -"Please configure which slicer and which slicing profile to use and name the " -"GCode file to slice to below, or click \"Cancel\" if you do not wish to " -"slice the file now." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:10 -msgid "Slicer" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:12 -msgid "Select a slicer..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:16 -msgid "Slicing Profile" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:18 -msgid "Select a slicing profile..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:22 -#: src/octoprint/templates/index.jinja2:136 -msgid "Printer Profile" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:24 -msgid "Select a printer profile..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:28 -msgid "GCode Filename" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:37 -msgid "After slicing..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:45 -#: src/octoprint/templates/dialogs.jinja2:90 -#: src/octoprint/templates/index.jinja2:172 -#: src/octoprint/templates/settings.jinja2:755 -msgid "Cancel" -msgstr "ביטול" - -#: src/octoprint/templates/dialogs.jinja2:46 -#: src/octoprint/templates/index.jinja2:243 -msgid "Slice" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:58 -msgid "Attempt to reconnect" -msgstr "נסיון חיבור מחדש" - -#: src/octoprint/templates/dialogs.jinja2:69 -msgid "Upload locally" -msgstr "העלאה מקומית" - -#: src/octoprint/templates/dialogs.jinja2:71 -#: src/octoprint/templates/index.jinja2:264 -msgid "Upload to SD" -msgstr "העלאה לכרטיס SD" - -#: src/octoprint/templates/dialogs.jinja2:71 -msgid "SD not initialized" -msgstr "SD לא מאותחל" - -#: src/octoprint/templates/dialogs.jinja2:74 -#: src/octoprint/templates/index.jinja2:259 -#: src/octoprint/templates/index.jinja2:270 -msgid "Upload" -msgstr "העלאה" - -#: src/octoprint/templates/dialogs.jinja2:83 -msgid "Are you sure?" -msgstr "האם את/ה בטוח?" - -#: src/octoprint/templates/dialogs.jinja2:87 -msgid "Are you sure you want to proceed?" -msgstr "האם באמת להמשיך?" - -#: src/octoprint/templates/dialogs.jinja2:91 -msgid "Proceed" -msgstr "המשך" - -#: src/octoprint/templates/dialogs.jinja2:97 -msgid "Configure Access Control" -msgstr "הגדרות לוח בקרה" - -#: src/octoprint/templates/dialogs.jinja2:100 -msgid "" -"

\n" -" Please read the following, it is very important for your printer's health!\n" -"

\n" -"

\n" -" OctoPrint by default now ships with Access Control enabled, meaning you won't be able to do anything with the\n" -" printer unless you login first as a configured user. This is to prevent strangers - possibly with\n" -" malicious intent - to gain access to your printer via the internet or another untrustworthy network\n" -" and using it in such a way that it is damaged or worse (i.e. causes a fire).\n" -"

\n" -"

\n" -" It looks like you haven't configured access control yet. Please set up an username and password for the\n" -" initial administrator account who will have full access to both the printer and OctoPrint's settings, then click\n" -" on \"Keep Access Control Enabled\":\n" -"

" -msgstr "

\n יש לקרוא את המידה הבא, הוא חשוב לבריאות המדפסת שלך!\n

\n

\n אוקטופרינט בברית מחדל מגיע הם בקרת גישה מופעלת, כלומר לא יהיה ניתן לבצע דבר עם המדפסת\n אלה אם הכניסה הראשונית מוגדרת עם המשתמש. זאת כדי למנוע מאנשים זרים - ככל הנראה עם\n מטרות זדון - לשיג גישה למדפסת שלך דרך האינטרנט או רשת לא מאובטחת\n ושימוש במדפסת בדרך שתגרום נזק למדפסת, או גרוע מכך (למשל, גרמה של שריפה)..\n

\n

\n נראה שעדין לא הוגדרה בקרת גישה. אנא הגדר שם משתמש וסיסמה עבור\n מנהל המערכת הראשון שיהיה בעל גישה למדפסת וההגדרות של אוקטופרינט,\n לאחר מכן יש ללחוץ על \"שמור על לוח בקרה מופעל\":\n

" - -#: src/octoprint/templates/dialogs.jinja2:116 -#: src/octoprint/templates/index.jinja2:103 -#: src/octoprint/templates/index.jinja2:104 -#: src/octoprint/templates/settings.jinja2:575 -msgid "Username" -msgstr "שם משתמש" - -#: src/octoprint/templates/dialogs.jinja2:122 -#: src/octoprint/templates/index.jinja2:105 -#: src/octoprint/templates/index.jinja2:106 -#: src/octoprint/templates/settings.jinja2:581 -msgid "Password" -msgstr "סיסמה" - -#: src/octoprint/templates/dialogs.jinja2:128 -msgid "Confirm Password" -msgstr "אישור סיסמה" - -#: src/octoprint/templates/dialogs.jinja2:131 -#: src/octoprint/templates/settings.jinja2:590 -#: src/octoprint/templates/settings.jinja2:661 -msgid "Passwords do not match" -msgstr "סיסמאות לא תואמות" - -#: src/octoprint/templates/dialogs.jinja2:135 -msgid "" -"

\n" -" Note: In case that your OctoPrint installation is only accessible from within a trustworthy network and you don't\n" -" need Access Control for other reasons, you may alternatively disable Access Control. You should only\n" -" do this if you are absolutely certain that only people you know and trust will be able to connect to it.\n" -"

\n" -"

\n" -" Do NOT underestimate the risk of an unsecured access from the internet to your printer!\n" -"

" -msgstr "

\n הערה: במקרה שההתקנה של אוקטופרינט ניתנת לגישה מתוך רשת לא מאובטחת, ואין צורך\n בניהול הרשאות גישה מסיבות אחרות, ניתן לבטל את ההשאות ניהול הגישה. אבל יש לעשות זאת רק\n אם בטוח לחלוטין שרק אנשים שמכירים וסומכים עליהם יהיו בעלי יכולת להתחבר למדפסת.\n

\n

\n נא לא לזלזל בסיכון של רשתות לא מאובטחות מהאינטרנט למדפסת שלך!!\n

" - -#: src/octoprint/templates/dialogs.jinja2:145 -msgid "Disable Access Control" -msgstr "ביטול לוח בקרה" - -#: src/octoprint/templates/dialogs.jinja2:146 -msgid "Keep Access Control Enabled" -msgstr "שמור על לוח בקרה מופעל" - -#: src/octoprint/templates/index.jinja2:82 -msgid "Settings" -msgstr "הגדרות" - -#: src/octoprint/templates/index.jinja2:88 -msgid "System" -msgstr "מערכת" - -#: src/octoprint/templates/index.jinja2:108 -msgid "Remember me" -msgstr "זכור אותי" - -#: src/octoprint/templates/index.jinja2:113 -msgid "Change Password" -msgstr "החלף סיסמה" - -#: src/octoprint/templates/index.jinja2:114 -msgid "Logout" -msgstr "התנתקות" - -#: src/octoprint/templates/index.jinja2:128 -msgid "Connection" -msgstr "חיבור" - -#: src/octoprint/templates/index.jinja2:132 -#: src/octoprint/templates/settings.jinja2:37 -msgid "Serial Port" -msgstr "יציאה טורית" - -#: src/octoprint/templates/index.jinja2:134 -#: src/octoprint/templates/settings.jinja2:43 -msgid "Baudrate" -msgstr "קצב באוד (Baudrate)" - -#: src/octoprint/templates/index.jinja2:139 -msgid "Save connection settings" -msgstr "שמור הגדרות חיבור" - -#: src/octoprint/templates/index.jinja2:142 -msgid "Auto-connect on server startup" -msgstr "חיבור מחדש עם עליית השרת" - -#: src/octoprint/templates/index.jinja2:150 -msgid "State" -msgstr "מצב" - -#: src/octoprint/templates/index.jinja2:154 -msgid "Machine State" -msgstr "מצב מכונה" - -#: src/octoprint/templates/index.jinja2:155 -msgid "File" -msgstr "קובץ" - -#: src/octoprint/templates/index.jinja2:156 -#: src/octoprint/templates/index.jinja2:293 -msgid "Timelapse" -msgstr "Timelapse" - -#: src/octoprint/templates/index.jinja2:160 -msgid "Approx. Total Print Time" -msgstr "זמן הדפסה סופי מוערך" - -#: src/octoprint/templates/index.jinja2:161 -msgid "Print Time" -msgstr "זמן הדפסה" - -#: src/octoprint/templates/index.jinja2:162 -msgid "Print Time Left" -msgstr "זמן הדפסה נותר" - -#: src/octoprint/templates/index.jinja2:163 -msgid "Printed" -msgstr "הודפס" - -#: src/octoprint/templates/index.jinja2:170 -msgid "Restart" -msgstr "אתחול" - -#: src/octoprint/templates/index.jinja2:170 -msgid "Print" -msgstr "הדפסה" - -#: src/octoprint/templates/index.jinja2:171 -msgid "Resume" -msgstr "" - -#: src/octoprint/templates/index.jinja2:172 -msgid "Cancels the print job" -msgstr "" - -#: src/octoprint/templates/index.jinja2:179 -msgid "Files" -msgstr "קבצים" - -#: src/octoprint/templates/index.jinja2:186 -msgid "Sort by name" -msgstr "מיין לפי שם" - -#: src/octoprint/templates/index.jinja2:186 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "ascending" -msgstr "סדר עולה" - -#: src/octoprint/templates/index.jinja2:187 -msgid "Sort by upload date" -msgstr "מיין לפי זמן העלאה" - -#: src/octoprint/templates/index.jinja2:187 -#: src/octoprint/templates/index.jinja2:188 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "descending" -msgstr "סדר יורד" - -#: src/octoprint/templates/index.jinja2:188 -msgid "Sort by file size" -msgstr "מיין לפי גודל קובץ" - -#: src/octoprint/templates/index.jinja2:190 -msgid "Only show GCode files" -msgstr "" - -#: src/octoprint/templates/index.jinja2:191 -msgid "Only show STL files" -msgstr "" - -#: src/octoprint/templates/index.jinja2:194 -msgid "Only show files stored locally" -msgstr "הצג רק קבצים השמורים מקומית" - -#: src/octoprint/templates/index.jinja2:195 -msgid "Only show files stored on SD" -msgstr "הצג רק קבצים השמורים על SD" - -#: src/octoprint/templates/index.jinja2:198 -msgid "Hide successfully printed files" -msgstr "הסתר קבצים שהודפסו בהצלחה" - -#: src/octoprint/templates/index.jinja2:208 -msgid "Initialize SD card" -msgstr "מאתכל כרטיס SD" - -#: src/octoprint/templates/index.jinja2:209 -msgid "Refresh SD files" -msgstr "מרענן קבצי SD" - -#: src/octoprint/templates/index.jinja2:210 -msgid "Release SD card" -msgstr "משחזר כרטיס SD" - -#: src/octoprint/templates/index.jinja2:218 -msgid "Search..." -msgstr "חיפוש..." - -#: src/octoprint/templates/index.jinja2:225 -#: src/octoprint/templates/index.jinja2:239 -msgid "Uploaded" -msgstr "הועלה" - -#: src/octoprint/templates/index.jinja2:226 -#: src/octoprint/templates/index.jinja2:240 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/index.jinja2:608 -#: src/octoprint/templates/settings.jinja2:709 -#: src/octoprint/templates/settings.jinja2:716 -msgid "Size" -msgstr "גודל" - -#: src/octoprint/templates/index.jinja2:230 -msgid "Download" -msgstr "הורד" - -#: src/octoprint/templates/index.jinja2:231 -#: src/octoprint/templates/index.jinja2:242 -msgid "Remove" -msgstr "הסר" - -#: src/octoprint/templates/index.jinja2:232 -msgid "Load" -msgstr "טעינה" - -#: src/octoprint/templates/index.jinja2:233 -msgid "Load and Print" -msgstr "טען והדפס" - -#: src/octoprint/templates/index.jinja2:252 -msgid "Free" -msgstr "פנוי" - -#: src/octoprint/templates/index.jinja2:279 -msgid "Hint: You can also drag and drop files on this page to upload them." -msgstr "טיפ: ניתן לגרור קבצים אל דף זה כדי להעלות אותם" - -#: src/octoprint/templates/index.jinja2:289 -msgid "Temperature" -msgstr "טמפרטורה" - -#: src/octoprint/templates/index.jinja2:290 -msgid "Control" -msgstr "שליטה" - -#: src/octoprint/templates/index.jinja2:291 -msgid "GCode Viewer" -msgstr "מציג Gcode" - -#: src/octoprint/templates/index.jinja2:292 -msgid "Terminal" -msgstr "מסוף" - -#: src/octoprint/templates/index.jinja2:310 -msgid "Offset" -msgstr "הסט" - -#: src/octoprint/templates/index.jinja2:326 -#: src/octoprint/templates/index.jinja2:348 -msgid "Set" -msgstr "קבע" - -#: src/octoprint/templates/index.jinja2:338 -#: src/octoprint/templates/index.jinja2:569 -msgid "Off" -msgstr "כבוי" - -#: src/octoprint/templates/index.jinja2:406 -msgid "Select Tool..." -msgstr "כלי בחירה" - -#: src/octoprint/templates/index.jinja2:417 -msgid "Extrude" -msgstr "הוצא סיב חומר" - -#: src/octoprint/templates/index.jinja2:418 -msgid "Retract" -msgstr "נסוג" - -#: src/octoprint/templates/index.jinja2:423 -msgid "General" -msgstr "כללי" - -#: src/octoprint/templates/index.jinja2:425 -msgid "Motors off" -msgstr "כבה מנועים" - -#: src/octoprint/templates/index.jinja2:426 -msgid "Fans on" -msgstr "מאוורר דלוק" - -#: src/octoprint/templates/index.jinja2:427 -msgid "Fans off" -msgstr "מאוורר כבוי" - -#: src/octoprint/templates/index.jinja2:491 -msgid "Sync with job progress" -msgstr "סנכרן עם העבודה" - -#: src/octoprint/templates/index.jinja2:496 -msgid "Center viewport on model" -msgstr "מרכז תצוגה על מודל" - -#: src/octoprint/templates/index.jinja2:499 -msgid "Zoom in on model" -msgstr "זום לתוך מודל" - -#: src/octoprint/templates/index.jinja2:505 -msgid "Show moves" -msgstr "הצג תזוזות" - -#: src/octoprint/templates/index.jinja2:508 -msgid "Show retracts" -msgstr "הצג נסיגות" - -#: src/octoprint/templates/index.jinja2:514 -msgid "Also show previous layer" -msgstr "אפשר הצגה של שכבה קודמת" - -#: src/octoprint/templates/index.jinja2:517 -msgid "Also show next layer" -msgstr "אפשר הצגה של שכבה הבאה" - -#: src/octoprint/templates/index.jinja2:522 -msgid "Reload" -msgstr "רענן" - -#: src/octoprint/templates/index.jinja2:549 -msgid "Autoscroll" -msgstr "גלילה אוטומאטית" - -#: src/octoprint/templates/index.jinja2:559 -msgid "Send" -msgstr "שלח" - -#: src/octoprint/templates/index.jinja2:565 -msgid "Timelapse Configuration" -msgstr "הגדרות timelapse" - -#: src/octoprint/templates/index.jinja2:567 -msgid "Timelapse Mode" -msgstr "מצב timelapse" - -#: src/octoprint/templates/index.jinja2:574 -msgid "Timelapse post roll (in rendered seconds)" -msgstr "עיבוד Timelapse (בשניות שרונדרו)" - -#: src/octoprint/templates/index.jinja2:581 -msgid "Interval" -msgstr "אינטרוול" - -#: src/octoprint/templates/index.jinja2:590 -msgid "Save as default" -msgstr "שמור כברית מחדל" - -#: src/octoprint/templates/index.jinja2:595 -msgid "Save config" -msgstr "שמור הגדרות" - -#: src/octoprint/templates/index.jinja2:599 -msgid "Finished Timelapses" -msgstr "Timelapses שהסתיימו" - -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "Sort by" -msgstr "מיין לפי" - -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/index.jinja2:607 -#: src/octoprint/templates/settings.jinja2:114 -#: src/octoprint/templates/settings.jinja2:140 -#: src/octoprint/templates/settings.jinja2:458 -#: src/octoprint/templates/settings.jinja2:534 -#: src/octoprint/templates/settings.jinja2:709 -#: src/octoprint/templates/settings.jinja2:715 -msgid "Name" -msgstr "שם" - -#: src/octoprint/templates/index.jinja2:602 -msgid "Creation date" -msgstr "תאריך יצירה" - -#: src/octoprint/templates/index.jinja2:609 -#: src/octoprint/templates/settings.jinja2:116 -#: src/octoprint/templates/settings.jinja2:537 -#: src/octoprint/templates/settings.jinja2:718 -msgid "Action" -msgstr "פעולה" - -#: src/octoprint/templates/index.jinja2:638 -msgid "Version" -msgstr "גירסה" - -#: src/octoprint/templates/index.jinja2:641 -msgid "Homepage" -msgstr "דף בית" - -#: src/octoprint/templates/index.jinja2:642 -msgid "Sourcecode" -msgstr "קוד מקור" - -#: src/octoprint/templates/index.jinja2:643 -msgid "Documentation" -msgstr "תיעוד" - -#: src/octoprint/templates/index.jinja2:644 -msgid "Bugs and Requests" -msgstr "באגים ובקשות" - -#: src/octoprint/templates/settings.jinja2:4 -msgid "OctoPrint Settings" -msgstr "הגדרות אוקטופרינט" - -#: src/octoprint/templates/settings.jinja2:9 -msgid "Printer" -msgstr "מדפסת" - -#: src/octoprint/templates/settings.jinja2:10 -msgid "Serial Connection" -msgstr "חיבור טורי" - -#: src/octoprint/templates/settings.jinja2:11 -#: src/octoprint/templates/settings.jinja2:110 -msgid "Printer Profiles" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:12 -msgid "Temperatures" -msgstr "טמפרטורות" - -#: src/octoprint/templates/settings.jinja2:13 -msgid "Terminal filters" -msgstr "פילטרי מסוף" - -#: src/octoprint/templates/settings.jinja2:14 -#: src/octoprint/templates/settings.jinja2:15 -msgid "Features" -msgstr "פיצ'רים" - -#: src/octoprint/templates/settings.jinja2:16 -msgid "Webcam" -msgstr "מצלמת רשת" - -#: src/octoprint/templates/settings.jinja2:17 -msgid "Access Control" -msgstr "בקרת גישה" - -#: src/octoprint/templates/settings.jinja2:18 -msgid "API" -msgstr "API" - -#: src/octoprint/templates/settings.jinja2:20 -msgid "Folders" -msgstr "תיקיות" - -#: src/octoprint/templates/settings.jinja2:21 -msgid "Appearance" -msgstr "מראה" - -#: src/octoprint/templates/settings.jinja2:22 -#: src/octoprint/templates/settings.jinja2:705 -msgid "Logs" -msgstr "לוגים" - -#: src/octoprint/templates/settings.jinja2:51 -msgid "Auto-connect to printer on server start" -msgstr "התחבר מחדש למדפסת עם העלייה של השרת" - -#: src/octoprint/templates/settings.jinja2:56 -msgid "Communication timeout" -msgstr "חיבור לא עובד עקב timeout" - -#: src/octoprint/templates/settings.jinja2:65 -msgid "Temperature timeout" -msgstr "טמפרטורה timeout" - -#: src/octoprint/templates/settings.jinja2:74 -msgid "SD status timeout" -msgstr "מצב SD ב-timeout" - -#: src/octoprint/templates/settings.jinja2:83 -msgid "Connection timeout" -msgstr "חישוב פסק, timeout" - -#: src/octoprint/templates/settings.jinja2:92 -msgid "Autodetection timeout" -msgstr "זהוי timeout אוטמטי" - -#: src/octoprint/templates/settings.jinja2:103 -msgid "Log communication to serial.log (might negatively impact performance)" -msgstr "שמור יומן תקשורת על serial.log (פעולה זו עלולה להשפיע בצורה שלילית על ביצועים)" - -#: src/octoprint/templates/settings.jinja2:103 -msgid "Warning" -msgstr "אזהרה" - -#: src/octoprint/templates/settings.jinja2:115 -#: src/octoprint/templates/settings.jinja2:152 -msgid "Model" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Set as default profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Edit Profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Delete Profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:130 -msgid "Add Profile..." -msgstr "" - -#: src/octoprint/templates/settings.jinja2:146 -msgid "Identifier" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:158 -#: src/octoprint/templates/settings.jinja2:490 -msgid "Color" -msgstr "צבע" - -#: src/octoprint/templates/settings.jinja2:165 -msgid "Form Factor" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:167 -msgid "Rectangular" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:170 -msgid "Circular" -msgstr "מעגלי" - -#: src/octoprint/templates/settings.jinja2:174 -msgid "Volume" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:176 -#: src/octoprint/templates/settings.jinja2:206 -msgid "X" -msgstr "X" - -#: src/octoprint/templates/settings.jinja2:183 -#: src/octoprint/templates/settings.jinja2:216 -msgid "Y" -msgstr "Y" - -#: src/octoprint/templates/settings.jinja2:190 -#: src/octoprint/templates/settings.jinja2:226 -msgid "Z" -msgstr "Z" - -#: src/octoprint/templates/settings.jinja2:198 -msgid "Heated Bed" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:204 -msgid "Axis" -msgstr "צירים" - -#: src/octoprint/templates/settings.jinja2:212 -#: src/octoprint/templates/settings.jinja2:222 -#: src/octoprint/templates/settings.jinja2:232 -msgid "Invert control" -msgstr "הפוך שליטה" - -#: src/octoprint/templates/settings.jinja2:236 -msgid "E" -msgstr "E" - -#: src/octoprint/templates/settings.jinja2:244 -msgid "Nozzle Diameter" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:253 -msgid "Number of Extruders" -msgstr "מספר אקסטרודרים" - -#: src/octoprint/templates/settings.jinja2:259 -msgid "Extruder Offsets" -msgstr "הסט אקסטרודר" - -#: src/octoprint/templates/settings.jinja2:278 -#: src/octoprint/templates/settings.jinja2:610 -#: src/octoprint/templates/settings.jinja2:639 -#: src/octoprint/templates/settings.jinja2:689 -msgid "Abort" -msgstr "ביטול" - -#: src/octoprint/templates/settings.jinja2:279 -#: src/octoprint/templates/settings.jinja2:611 -#: src/octoprint/templates/settings.jinja2:640 -#: src/octoprint/templates/settings.jinja2:690 -msgid "Confirm" -msgstr "אישור" - -#: src/octoprint/templates/settings.jinja2:286 -msgid "Stream URL" -msgstr "כתובת שידור וידאו" - -#: src/octoprint/templates/settings.jinja2:292 -msgid "Snapshot URL" -msgstr "כתובת שידור תמונה" - -#: src/octoprint/templates/settings.jinja2:298 -msgid "Path to FFMPEG" -msgstr "נתיב עבור FFMPEG" - -#: src/octoprint/templates/settings.jinja2:304 -msgid "Timelapse bitrate" -msgstr "איכות timelapse" - -#: src/octoprint/templates/settings.jinja2:312 -msgid "Enable OctoPrint watermark in timelapse movies" -msgstr "הוסף סימן מים של אוקטופרינט עבור סרטונים" - -#: src/octoprint/templates/settings.jinja2:319 -msgid "Flip webcam horizontally" -msgstr "הפוך תמונת מצלמה אופקית" - -#: src/octoprint/templates/settings.jinja2:324 -msgid "Flip webcam vertically" -msgstr "הפוך תמונת מצלמה אנכית" - -#: src/octoprint/templates/settings.jinja2:335 -msgid "Enable Temperature Graph" -msgstr "הפעל גרף טמפרטורה" - -#: src/octoprint/templates/settings.jinja2:342 -msgid "Enable GCode Visualizer" -msgstr "הפעל ויזואליזציה של GCode" - -#: src/octoprint/templates/settings.jinja2:349 -msgid "Enable SD support" -msgstr "הפעל תמיכה ב-SD" - -#: src/octoprint/templates/settings.jinja2:356 -msgid "Always assume SD card is present" -msgstr "תמיד תניח שכרטיס SD נמצא" - -#: src/octoprint/templates/settings.jinja2:356 -#: src/octoprint/templates/settings.jinja2:370 -#: src/octoprint/templates/settings.jinja2:377 -msgid "Repetier" -msgstr "Repetier" - -#: src/octoprint/templates/settings.jinja2:363 -msgid "Wait for start on connect" -msgstr "המתן עבור start בחיבור" - -#: src/octoprint/templates/settings.jinja2:370 -msgid "Send a checksum with every command" -msgstr "המתן עבור סיכום ביקורת (checksum) עבור כל פקודה" - -#: src/octoprint/templates/settings.jinja2:377 -#, python-format -msgid "" -"Support TargetExtr%%n/TargetBed target temperature" -" format" -msgstr "תמוך עבור TargetExtr%%n/TargetBed פורמט טמפרטורת ייעד" - -#: src/octoprint/templates/settings.jinja2:384 -msgid "Swallow the first \"ok\" after a resend response" -msgstr "לבלוע את ה-\"ok\" הראשון אחרי שנשלחה מחדשה תגובה" - -#: src/octoprint/templates/settings.jinja2:393 -msgid "Upload Folder" -msgstr "תקיית העלאה" - -#: src/octoprint/templates/settings.jinja2:399 -msgid "Timelapse Folder" -msgstr "תקיית timelapse" - -#: src/octoprint/templates/settings.jinja2:405 -msgid "Timelapse Temp Folder" -msgstr "תקייה זמנית ל-timelapse" - -#: src/octoprint/templates/settings.jinja2:411 -msgid "Logs Folder" -msgstr "תקיית לוגים" - -#: src/octoprint/templates/settings.jinja2:417 -msgid "Watched Folder" -msgstr "תקייה שנצפתה" - -#: src/octoprint/templates/settings.jinja2:427 -msgid "Extruder" -msgstr "אקסטרודר" - -#: src/octoprint/templates/settings.jinja2:459 -msgid "RegExp" -msgstr "ביטוי רגולרי" - -#: src/octoprint/templates/settings.jinja2:484 -msgid "Title" -msgstr "כותרת" - -#: src/octoprint/templates/settings.jinja2:503 -msgid "Enable" -msgstr "אפשר" - -#: src/octoprint/templates/settings.jinja2:510 -#, python-format -msgid "Allow Cross Origin Resource Sharing (CORS)" -msgstr "אפשר Cross Origin Resource Sharing (CORS)" - -#: src/octoprint/templates/settings.jinja2:515 -#: src/octoprint/templates/settings.jinja2:542 -msgid "API Key" -msgstr "מפתח API" - -#: src/octoprint/templates/settings.jinja2:521 -#: src/octoprint/templates/settings.jinja2:679 -msgid "QR Code" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:535 -#: src/octoprint/templates/settings.jinja2:596 -#: src/octoprint/templates/settings.jinja2:625 -msgid "Active" -msgstr "פעיל" - -#: src/octoprint/templates/settings.jinja2:536 -#: src/octoprint/templates/settings.jinja2:603 -#: src/octoprint/templates/settings.jinja2:632 -msgid "Admin" -msgstr "מנהל" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Update User" -msgstr "עדכן משתמש" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Change password" -msgstr "שינוי סיסמה" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Delete user" -msgstr "מחק משתמש" - -#: src/octoprint/templates/settings.jinja2:563 -#: src/octoprint/templates/settings.jinja2:570 -msgid "Add user" -msgstr "הוסף משתמש" - -#: src/octoprint/templates/settings.jinja2:587 -#: src/octoprint/templates/settings.jinja2:658 -msgid "Repeat Password" -msgstr "חזור על סיסמה" - -#: src/octoprint/templates/settings.jinja2:618 -#, python-format -msgid "Edit user \"%(user)s\"" -msgstr "ערוך משתמש \"%(user)s\"" - -#: src/octoprint/templates/settings.jinja2:647 -#, python-format -msgid "Change password for user \"%(user)s\"" -msgstr "החלף סיסמה עבור משתמש \"%(user)s\"" - -#: src/octoprint/templates/settings.jinja2:652 -msgid "New Password" -msgstr "סיסמה חדשה" - -#: src/octoprint/templates/settings.jinja2:667 -msgid "Current API Key" -msgstr "מפתח API נוכחי" - -#: src/octoprint/templates/settings.jinja2:670 -msgid "N/A" -msgstr "לא זמין" - -#: src/octoprint/templates/settings.jinja2:709 -msgid "Modification date" -msgstr "תאריך שינוי" - -#: src/octoprint/templates/settings.jinja2:717 -msgid "Date" -msgstr "תאריך" - -#: src/octoprint/templates/settings.jinja2:756 -msgid "Save" -msgstr "שמור" diff --git a/src/octoprint/translations/nl/LC_MESSAGES/messages.mo b/src/octoprint/translations/nl/LC_MESSAGES/messages.mo deleted file mode 100644 index 3a46e2aeec5ca40fe34e56fddb88d9b82dd0b994..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20827 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 Q+}N0p)>5cKJ7V#F0rx7q8UO$Q diff --git a/src/octoprint/translations/nl/LC_MESSAGES/messages.po b/src/octoprint/translations/nl/LC_MESSAGES/messages.po deleted file mode 100644 index 04f709b5..00000000 --- a/src/octoprint/translations/nl/LC_MESSAGES/messages.po +++ /dev/null @@ -1,1404 +0,0 @@ -# Translations template for OctoPrint. -# Copyright (C) 2014 The OctoPrint Project -# This file is distributed under the same license as the OctoPrint project. -# -# Translators: -# leon.bek , 2014 -# okpail , 2014 -msgid "" -msgstr "" -"Project-Id-Version: OctoPrint\n" -"Report-Msgid-Bugs-To: i18n@octoprint.org\n" -"POT-Creation-Date: 2014-12-18 14:45+0100\n" -"PO-Revision-Date: 2014-12-18 14:04+0000\n" -"Last-Translator: Gina Häußge \n" -"Language-Team: Dutch (http://www.transifex.com/projects/p/octoprint/language/nl/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: src/octoprint/static/js/app/dataupdater.js:52 -#: src/octoprint/static/js/app/dataupdater.js:85 -#: src/octoprint/static/js/app/helpers.js:434 -#: src/octoprint/templates/dialogs.jinja2:55 -msgid "Server is offline" -msgstr "Server is niet bereikbaar" - -#: src/octoprint/static/js/app/dataupdater.js:53 -msgid "" -"The server appears to be offline, at least I'm not getting any response from" -" it. I'll try to reconnect automatically over the next couple of " -"minutes, however you are welcome to try a manual reconnect anytime " -"using the button below." -msgstr "De server lijkt offline te zijn, althans er komt geen enkele reactie. Ik zal over een paar minuten opnieuw pogen te verbinden. Je kunt op elk moment met onderstaande knop 'handmatig' proberen te verbinden" - -#: src/octoprint/static/js/app/dataupdater.js:86 -msgid "" -"The server appears to be offline, at least I'm not getting any response from" -" it. I could not reconnect automatically, but you may try a" -" manual reconnect using the button below." -msgstr "De server lijkt offline te zijn, dat wil zeggen dat ik er geen reactie van krijg. Ik kon niet automatisch opnieuw verbinden. Je kunt proberen handmatig proberen te verbinden met onderstaande knop." - -#: src/octoprint/static/js/app/dataupdater.js:158 -#: src/octoprint/static/js/app/dataupdater.js:199 -#, python-format -msgid "Slicing ... (%(percentage)d%%)" -msgstr "" - -#: src/octoprint/static/js/app/dataupdater.js:187 -msgid "Rendering timelapse" -msgstr "Renderen van timelapse" - -#: src/octoprint/static/js/app/dataupdater.js:187 -#, python-format -msgid "Now rendering timelapse %(movie_basename)s" -msgstr "Nu de timelapse %(movie_basename)s aan het renderen" - -#: src/octoprint/static/js/app/dataupdater.js:189 -msgid "Timelapse ready" -msgstr "Timelapse klaar" - -#: src/octoprint/static/js/app/dataupdater.js:189 -#, python-format -msgid "New timelapse %(movie_basename)s is done rendering." -msgstr "Nieuwe timelapse %(movie_basename)s is gerenderd" - -#: src/octoprint/static/js/app/dataupdater.js:192 -#, python-format -msgid "" -"Rendering of timelapse %(movie_basename)s failed with return code " -"%(returncode)s" -msgstr "" - -#: src/octoprint/static/js/app/dataupdater.js:194 -msgid "Rendering failed" -msgstr "Renderen mislukt" - -#: src/octoprint/static/js/app/dataupdater.js:201 -msgid "Slicing ..." -msgstr "Slicing ... / Aan het fileren..." - -#: src/octoprint/static/js/app/dataupdater.js:207 -msgid "Slicing done" -msgstr "Fileren is klaar" - -#: src/octoprint/static/js/app/dataupdater.js:207 -#, python-format -msgid "Sliced %(stl)s to %(gcode)s, took %(time).2f seconds" -msgstr "Het 'slicen/fileren' van %(stl)s naar %(gcode)s, duurde %(time).2f seconden" - -#: src/octoprint/static/js/app/dataupdater.js:228 -#, python-format -msgid "Could not slice %(stl)s to %(gcode)s: %(reason)s" -msgstr "Kon %(stl)s niet 'slicen/fileren' naar %(gcode)s: %(reason)s" - -#: src/octoprint/static/js/app/dataupdater.js:229 -msgid "Slicing failed" -msgstr "Het 'slice/fileren' is mislukt" - -#: src/octoprint/static/js/app/dataupdater.js:238 -msgid "Streaming ..." -msgstr "Streaming ..." - -#: src/octoprint/static/js/app/dataupdater.js:244 -msgid "Streaming done" -msgstr "Het Streamen is klaar" - -#: src/octoprint/static/js/app/dataupdater.js:245 -#, python-format -msgid "Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds" -msgstr "Streamen van %(local)s naar %(remote)s op SD, duurde %(time).2f seconden" - -#: src/octoprint/static/js/app/helpers.js:355 -#, python-format -msgid "%(hour)02d:%(minute)02d:%(second)02d" -msgstr "%(hour)02d:%(minute)02d:%(second)02d" - -#: src/octoprint/static/js/app/helpers.js:375 -msgid "YYYY-MM-DD HH:mm" -msgstr "DD-MM-YYYY HH:mm" - -#: src/octoprint/static/js/app/helpers.js:393 -#: src/octoprint/static/js/app/helpers.js:398 -msgid "off" -msgstr "uit" - -#: src/octoprint/static/js/app/main.js:17 -msgid "Offline" -msgstr "Offline" - -#: src/octoprint/static/js/app/main.js:18 -msgid "Opening serial port" -msgstr "Openen van seriële poort" - -#: src/octoprint/static/js/app/main.js:19 -msgid "Detecting serial port" -msgstr "Detecteren van seriële poort" - -#: src/octoprint/static/js/app/main.js:20 -msgid "Detecting baudrate" -msgstr "Baudrate detecteren" - -#: src/octoprint/static/js/app/main.js:21 -msgid "Connecting" -msgstr "Verbinden" - -#: src/octoprint/static/js/app/main.js:22 -msgid "Operational" -msgstr "Operationeel" - -#: src/octoprint/static/js/app/main.js:23 -msgid "Printing from SD" -msgstr "Printen vanaf SD kaartje" - -#: src/octoprint/static/js/app/main.js:24 -msgid "Sending file to SD" -msgstr "Verstuur bestand naar SD kaartje" - -#: src/octoprint/static/js/app/main.js:25 -msgid "Printing" -msgstr "Printen" - -#: src/octoprint/static/js/app/main.js:26 -msgid "Paused" -msgstr "Gepauzeerd" - -#: src/octoprint/static/js/app/main.js:27 -msgid "Closed" -msgstr "Gesloten" - -#: src/octoprint/static/js/app/main.js:28 -msgid "Transfering file to SD" -msgstr "Verstuur bestand naar SD kaartje" - -#: src/octoprint/static/js/app/main.js:184 -msgid "" -"Could not upload the file. Make sure that it is a GCODE file and has the " -"extension \".gcode\" or \".gco\" or that it is an STL file with the " -"extension \".stl\" and slicing support is enabled and configured." -msgstr "Kon het bestand niet uploaden. Zorg ervoor dat het bestand een GCODE of STL bestand is en ondersteuning voor fileren is aangezet en geconfigureerd. Een GCODE bestand heeft een extensie \".gcode\" of \".gco\". Een STL bestand heeft de extensie \".stl\"." - -#: src/octoprint/static/js/app/main.js:200 -msgid "Uploading ..." -msgstr "Uploaden ..." - -#: src/octoprint/static/js/app/main.js:203 -msgid "Saving ..." -msgstr "Opslaan ..." - -#: src/octoprint/static/js/app/viewmodels/appearance.js:9 -#: src/octoprint/static/js/app/viewmodels/appearance.js:11 -#: src/octoprint/static/js/app/viewmodels/appearance.js:16 -#: src/octoprint/static/js/app/viewmodels/appearance.js:18 -msgid "OctoPrint" -msgstr "OctoPrint" - -#: src/octoprint/static/js/app/viewmodels/connection.js:41 -#: src/octoprint/templates/index.jinja2:144 -msgid "Connect" -msgstr "Verbind" - -#: src/octoprint/static/js/app/viewmodels/connection.js:43 -msgid "Disconnect" -msgstr "Verbreken" - -#: src/octoprint/static/js/app/viewmodels/control.js:42 -#: src/octoprint/static/js/app/viewmodels/files.js:298 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -#: src/octoprint/static/js/app/viewmodels/gcode.js:432 -#: src/octoprint/static/js/app/viewmodels/printerstate.js:166 -#: src/octoprint/static/js/app/viewmodels/temperature.js:56 -msgid "Tool" -msgstr "Gereedschap" - -#: src/octoprint/static/js/app/viewmodels/control.js:49 -#: src/octoprint/static/js/app/viewmodels/temperature.js:68 -msgid "Hotend" -msgstr "Hotend" - -#: src/octoprint/static/js/app/viewmodels/files.js:293 -#: src/octoprint/static/js/app/viewmodels/files.js:298 -msgid "Filament" -msgstr "Filament" - -#: src/octoprint/static/js/app/viewmodels/files.js:302 -msgid "Estimated Print Time" -msgstr "Geschatte print tijd" - -#: src/octoprint/static/js/app/viewmodels/files.js:305 -msgid "Last Printed" -msgstr "Vorige print-job" - -#: src/octoprint/static/js/app/viewmodels/files.js:307 -msgid "Last Print Time" -msgstr "Duur vorige print-job " - -#: src/octoprint/static/js/app/viewmodels/firstrun.js:37 -msgid "" -"If you disable Access Control and your OctoPrint " -"installation is accessible from the internet, your printer will be " -"accessible by everyone - that also includes the bad guys!" -msgstr "Als je de toegangs-controle uitschakelt is je OctoPrint installatie mogelijk toegangkelijk vanaf het internet. Je printer is toegankelijk voor iedereen - ook de kwaaie jongens!" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:13 -msgid "Loading..." -msgstr "Laden..." - -#: src/octoprint/static/js/app/viewmodels/gcode.js:17 -msgid "Analyzing..." -msgstr "Analyseren..." - -#: src/octoprint/static/js/app/viewmodels/gcode.js:21 -msgid "Analyzed" -msgstr "Geanalyseerd" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:395 -msgid "Model size" -msgstr "Model grootte" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:397 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -msgid "Total filament used" -msgstr "Totaal gebruikte filament" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:397 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -#: src/octoprint/static/js/app/viewmodels/gcode.js:404 -msgid "mm" -msgstr "mm" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:403 -msgid "Estimated print time" -msgstr "Geschatte print tijd" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:404 -msgid "Estimated layer height" -msgstr "Geschatte laag hooge" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "Layer count" -msgstr "Aantal lagen" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "printed" -msgstr "geprint" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "visited" -msgstr "bezocht" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:424 -msgid "Layer number" -msgstr "Laag aantal" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:425 -msgid "Layer height" -msgstr "Laag hoogte" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:426 -msgid "GCODE commands in layer" -msgstr "GCODE commando's in laag" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:429 -#: src/octoprint/static/js/app/viewmodels/gcode.js:432 -msgid "Filament used by layer" -msgstr "hoeveelheid Filament gebruikt bij laag" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:436 -msgid "Print time for layer" -msgstr "Print tijd per laag" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:15 -#: src/octoprint/templates/index.jinja2:99 -#: src/octoprint/templates/index.jinja2:110 -msgid "Login" -msgstr "Inloggen" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:70 -msgid "Login successful" -msgstr "Succesvol ingelogd" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:70 -#, python-format -msgid "You are now logged in as \"%(username)s\"" -msgstr "Je bent nu ingelogd als \"%(username)s\"" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:74 -msgid "Login failed" -msgstr "Inloggen mislukt" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:74 -msgid "User unknown or wrong password" -msgstr "Gebruiker onbekend of verkeerd wachtwoord" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:84 -msgid "Logout successful" -msgstr "Uitloggen succesvol" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:84 -msgid "You are now logged out" -msgstr "Je bent nu uitgelogd" - -#: src/octoprint/static/js/app/viewmodels/navigation.js:17 -#, python-format -msgid "The command \"%(command)s\" executed successfully" -msgstr "Het commando \"%(command)s\" is succesvol uitgevoerd" - -#: src/octoprint/static/js/app/viewmodels/navigation.js:20 -#, python-format -msgid "The command \"%(command)s\" could not be executed." -msgstr "Het commando \"%(command)s\" kon niet uitgevoerd worden." - -#: src/octoprint/static/js/app/viewmodels/navigation.js:22 -msgid "Error" -msgstr "Fout" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:84 -#: src/octoprint/static/js/app/viewmodels/settings.js:16 -#: src/octoprint/static/js/app/viewmodels/settings.js:43 -msgid "default" -msgstr "Standaard" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:85 -#: src/octoprint/static/js/app/viewmodels/settings.js:17 -#: src/octoprint/static/js/app/viewmodels/settings.js:29 -msgid "red" -msgstr "rood" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:86 -#: src/octoprint/static/js/app/viewmodels/settings.js:18 -#: src/octoprint/static/js/app/viewmodels/settings.js:31 -msgid "orange" -msgstr "oranje" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:87 -#: src/octoprint/static/js/app/viewmodels/settings.js:19 -#: src/octoprint/static/js/app/viewmodels/settings.js:33 -msgid "yellow" -msgstr "geel" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:88 -#: src/octoprint/static/js/app/viewmodels/settings.js:20 -#: src/octoprint/static/js/app/viewmodels/settings.js:35 -msgid "green" -msgstr "groen" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:89 -#: src/octoprint/static/js/app/viewmodels/settings.js:21 -#: src/octoprint/static/js/app/viewmodels/settings.js:37 -msgid "blue" -msgstr "blauw" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:90 -#: src/octoprint/static/js/app/viewmodels/settings.js:23 -#: src/octoprint/static/js/app/viewmodels/settings.js:41 -msgid "black" -msgstr "zwart" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:245 -msgid "Add Printer Profile" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:245 -#, python-format -msgid "Edit Printer Profile \"%(name)s\"" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:33 -msgid "Restarts the print job from the beginning" -msgstr "Start het print opnieuw vanaf het begin." - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:34 -msgid "Starts the print job" -msgstr "Start de print-taak" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:35 -msgid "Resumes the print job" -msgstr "Gaat verder met de print-taak" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:36 -msgid "Pauses the print job" -msgstr "Pauzeert de print-taak" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:69 -msgid "Calculating..." -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:82 -msgid "Continue" -msgstr "Voortzetten" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:84 -#: src/octoprint/templates/index.jinja2:171 -msgid "Pause" -msgstr "Pauze" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:95 -#: src/octoprint/templates/index.jinja2:570 -msgid "On Z Change" -msgstr "Bij hoogte verandering op de Z-as" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:97 -#: src/octoprint/templates/index.jinja2:571 -msgid "Timed" -msgstr "Getimed" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:97 -#: src/octoprint/templates/index.jinja2:577 -#: src/octoprint/templates/index.jinja2:584 -msgid "sec" -msgstr "sec" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:205 -msgid "This will restart the print job from the beginning." -msgstr "Dit zal de print taak herstarten vanaf het begin." - -#: src/octoprint/static/js/app/viewmodels/settings.js:22 -#: src/octoprint/static/js/app/viewmodels/settings.js:39 -msgid "violet" -msgstr "violet" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:24 -msgid "Do nothing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:25 -msgid "Select for printing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:26 -msgid "Start printing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:33 -#, python-format -msgid "Slicing %(filename)s" -msgstr "%(filename)s aan het fileren" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:22 -#: src/octoprint/static/js/app/viewmodels/temperature.js:74 -#: src/octoprint/templates/settings.jinja2:428 -msgid "Bed" -msgstr "Bed" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:113 -msgid "just now" -msgstr "zojuist" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:115 -msgid "min" -msgstr "min" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:255 -#: src/octoprint/templates/index.jinja2:308 -msgid "Actual" -msgstr "Werkelijke" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:260 -#: src/octoprint/templates/index.jinja2:309 -msgid "Target" -msgstr "Doel" - -#: src/octoprint/templates/dialogs.jinja2:7 -msgid "" -"Please configure which slicer and which slicing profile to use and name the " -"GCode file to slice to below, or click \"Cancel\" if you do not wish to " -"slice the file now." -msgstr "Geef aan welke slicer/fileer software gebruikt moet worden en met welk profiel. Geef vervolgens aan de resulterende GCODE file een naam. Of druk op de knop 'Cancel' als je de file nu niet wilt 'slicen'/fileren, " - -#: src/octoprint/templates/dialogs.jinja2:10 -msgid "Slicer" -msgstr "'Slicer' of fileersoftware" - -#: src/octoprint/templates/dialogs.jinja2:12 -msgid "Select a slicer..." -msgstr "Selecteer de 'slicer' / fileer-software" - -#: src/octoprint/templates/dialogs.jinja2:16 -msgid "Slicing Profile" -msgstr "Fileer profiel" - -#: src/octoprint/templates/dialogs.jinja2:18 -msgid "Select a slicing profile..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:22 -#: src/octoprint/templates/index.jinja2:136 -msgid "Printer Profile" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:24 -msgid "Select a printer profile..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:28 -msgid "GCode Filename" -msgstr "GCode Filename" - -#: src/octoprint/templates/dialogs.jinja2:37 -msgid "After slicing..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:45 -#: src/octoprint/templates/dialogs.jinja2:90 -#: src/octoprint/templates/index.jinja2:172 -#: src/octoprint/templates/settings.jinja2:755 -msgid "Cancel" -msgstr "Annuleren" - -#: src/octoprint/templates/dialogs.jinja2:46 -#: src/octoprint/templates/index.jinja2:243 -msgid "Slice" -msgstr "Fileer / 'Slice'" - -#: src/octoprint/templates/dialogs.jinja2:58 -msgid "Attempt to reconnect" -msgstr "Probeer opnieuw te verbinden" - -#: src/octoprint/templates/dialogs.jinja2:69 -msgid "Upload locally" -msgstr "Lokaal uploaden" - -#: src/octoprint/templates/dialogs.jinja2:71 -#: src/octoprint/templates/index.jinja2:264 -msgid "Upload to SD" -msgstr "opslaan op SD-kaart " - -#: src/octoprint/templates/dialogs.jinja2:71 -msgid "SD not initialized" -msgstr "SD-kaart niet geïnitialiseerd" - -#: src/octoprint/templates/dialogs.jinja2:74 -#: src/octoprint/templates/index.jinja2:259 -#: src/octoprint/templates/index.jinja2:270 -msgid "Upload" -msgstr "Upload" - -#: src/octoprint/templates/dialogs.jinja2:83 -msgid "Are you sure?" -msgstr "Weet je het zeker?" - -#: src/octoprint/templates/dialogs.jinja2:87 -msgid "Are you sure you want to proceed?" -msgstr "Weet je zeker dat je verder wilt gaan?" - -#: src/octoprint/templates/dialogs.jinja2:91 -msgid "Proceed" -msgstr "Doorgaan" - -#: src/octoprint/templates/dialogs.jinja2:97 -msgid "Configure Access Control" -msgstr "Toegangscontrole configureren" - -#: src/octoprint/templates/dialogs.jinja2:100 -msgid "" -"

\n" -" Please read the following, it is very important for your printer's health!\n" -"

\n" -"

\n" -" OctoPrint by default now ships with Access Control enabled, meaning you won't be able to do anything with the\n" -" printer unless you login first as a configured user. This is to prevent strangers - possibly with\n" -" malicious intent - to gain access to your printer via the internet or another untrustworthy network\n" -" and using it in such a way that it is damaged or worse (i.e. causes a fire).\n" -"

\n" -"

\n" -" It looks like you haven't configured access control yet. Please set up an username and password for the\n" -" initial administrator account who will have full access to both the printer and OctoPrint's settings, then click\n" -" on \"Keep Access Control Enabled\":\n" -"

" -msgstr "

\nLees het navolgende bericht, het is belangrijk voor het goed functioneren van je printer!!\n

\n

\nOctoPrint heeft nu de standaard toegangscontrole ingeschakeld. Dit betekent dat je niets kunt doen met de printer,\n tenzij je bent inlogd met een geconfigureerde gebruiker. Dit om te voorkomen dat vreemdelingen\n - met mogelijk kwade bedoelingen - toegang krijgen tot je printer via het internet of een ander onvertrouwd netwerk.\nEn de printer zo kan gebruiken dat beschadiging ontstaat of erger (bijvoorbeeld brand).\n

\n

\nHet lijkt erop dat je toegangscontrole nog niet ingeschakeld hebt. Stel alsjeblieft\n een gebruikersnaam en wachtwoord in voor het eerste\n administrator account dat volledige toegang zal hebben tot de printer en OctoPrint's instellingen.\nKlik dan op \"Hou toegangscontrole ingeschakeld\":\n

" - -#: src/octoprint/templates/dialogs.jinja2:116 -#: src/octoprint/templates/index.jinja2:103 -#: src/octoprint/templates/index.jinja2:104 -#: src/octoprint/templates/settings.jinja2:575 -msgid "Username" -msgstr "Gebruikersnaam" - -#: src/octoprint/templates/dialogs.jinja2:122 -#: src/octoprint/templates/index.jinja2:105 -#: src/octoprint/templates/index.jinja2:106 -#: src/octoprint/templates/settings.jinja2:581 -msgid "Password" -msgstr "Wachtwoord" - -#: src/octoprint/templates/dialogs.jinja2:128 -msgid "Confirm Password" -msgstr "Bevestig wachtwoord" - -#: src/octoprint/templates/dialogs.jinja2:131 -#: src/octoprint/templates/settings.jinja2:590 -#: src/octoprint/templates/settings.jinja2:661 -msgid "Passwords do not match" -msgstr "De wachtwoorden komen niet overeen" - -#: src/octoprint/templates/dialogs.jinja2:135 -msgid "" -"

\n" -" Note: In case that your OctoPrint installation is only accessible from within a trustworthy network and you don't\n" -" need Access Control for other reasons, you may alternatively disable Access Control. You should only\n" -" do this if you are absolutely certain that only people you know and trust will be able to connect to it.\n" -"

\n" -"

\n" -" Do NOT underestimate the risk of an unsecured access from the internet to your printer!\n" -"

" -msgstr "

\nMemo: Indien je OctoPrint installatie alleen toegankelijk is vanaf een vertrouwd netwerk en je hebt toegangscontrole niet nodig voor andere redenen, kun je eventueel toegangscontrole uitschakelen. Je zou dit alleen moeten doen als je er absoluut zeker van bent dat alleen mensen die je kent en vertrouwd er verbinding mee kunnen maken.\n

\n

\nOnderschat het risico van onbeveiligde toegang vanaf het internet naar je printer niet!!\n

" - -#: src/octoprint/templates/dialogs.jinja2:145 -msgid "Disable Access Control" -msgstr "Toegangscontrole uitschakelen" - -#: src/octoprint/templates/dialogs.jinja2:146 -msgid "Keep Access Control Enabled" -msgstr "Houd de toegangscontrole ingeschakeld" - -#: src/octoprint/templates/index.jinja2:82 -msgid "Settings" -msgstr "Instellingen" - -#: src/octoprint/templates/index.jinja2:88 -msgid "System" -msgstr "Systeem" - -#: src/octoprint/templates/index.jinja2:108 -msgid "Remember me" -msgstr "Onthoud me" - -#: src/octoprint/templates/index.jinja2:113 -msgid "Change Password" -msgstr "Verander het wachtwoord" - -#: src/octoprint/templates/index.jinja2:114 -msgid "Logout" -msgstr "Uitloggen" - -#: src/octoprint/templates/index.jinja2:128 -msgid "Connection" -msgstr "Verbinding" - -#: src/octoprint/templates/index.jinja2:132 -#: src/octoprint/templates/settings.jinja2:37 -msgid "Serial Port" -msgstr "Seriële poort" - -#: src/octoprint/templates/index.jinja2:134 -#: src/octoprint/templates/settings.jinja2:43 -msgid "Baudrate" -msgstr "Baudrate" - -#: src/octoprint/templates/index.jinja2:139 -msgid "Save connection settings" -msgstr "Verbindings instellingen opslaan" - -#: src/octoprint/templates/index.jinja2:142 -msgid "Auto-connect on server startup" -msgstr "Automatisch verbinden bij opstarten van server" - -#: src/octoprint/templates/index.jinja2:150 -msgid "State" -msgstr "Status" - -#: src/octoprint/templates/index.jinja2:154 -msgid "Machine State" -msgstr "Machine status" - -#: src/octoprint/templates/index.jinja2:155 -msgid "File" -msgstr "Bestand" - -#: src/octoprint/templates/index.jinja2:156 -#: src/octoprint/templates/index.jinja2:293 -msgid "Timelapse" -msgstr "Timelapse" - -#: src/octoprint/templates/index.jinja2:160 -msgid "Approx. Total Print Time" -msgstr "Geschatte totale print tijd" - -#: src/octoprint/templates/index.jinja2:161 -msgid "Print Time" -msgstr "Print tijd" - -#: src/octoprint/templates/index.jinja2:162 -msgid "Print Time Left" -msgstr "Resterende print tijd" - -#: src/octoprint/templates/index.jinja2:163 -msgid "Printed" -msgstr "Geprint" - -#: src/octoprint/templates/index.jinja2:170 -msgid "Restart" -msgstr "Herstarten" - -#: src/octoprint/templates/index.jinja2:170 -msgid "Print" -msgstr "Print" - -#: src/octoprint/templates/index.jinja2:171 -msgid "Resume" -msgstr "Ga verder" - -#: src/octoprint/templates/index.jinja2:172 -msgid "Cancels the print job" -msgstr "Stopt met de print taak" - -#: src/octoprint/templates/index.jinja2:179 -msgid "Files" -msgstr "Bestanden" - -#: src/octoprint/templates/index.jinja2:186 -msgid "Sort by name" -msgstr "Sorteer op naam" - -#: src/octoprint/templates/index.jinja2:186 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "ascending" -msgstr "Oplopend" - -#: src/octoprint/templates/index.jinja2:187 -msgid "Sort by upload date" -msgstr "Sorteer op upload datum" - -#: src/octoprint/templates/index.jinja2:187 -#: src/octoprint/templates/index.jinja2:188 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "descending" -msgstr "Aflopend" - -#: src/octoprint/templates/index.jinja2:188 -msgid "Sort by file size" -msgstr "Sorteer op bestands grootte" - -#: src/octoprint/templates/index.jinja2:190 -msgid "Only show GCode files" -msgstr "Vertoon alleen GCode files" - -#: src/octoprint/templates/index.jinja2:191 -msgid "Only show STL files" -msgstr "Vertoon alleen de STL files" - -#: src/octoprint/templates/index.jinja2:194 -msgid "Only show files stored locally" -msgstr "Laat alleen lokale bestanden zien" - -#: src/octoprint/templates/index.jinja2:195 -msgid "Only show files stored on SD" -msgstr "Laat alleen bestanden op SD-kaart zien" - -#: src/octoprint/templates/index.jinja2:198 -msgid "Hide successfully printed files" -msgstr "Verberg succesvol geprinte bestanden" - -#: src/octoprint/templates/index.jinja2:208 -msgid "Initialize SD card" -msgstr "Formateer SD kaart" - -#: src/octoprint/templates/index.jinja2:209 -msgid "Refresh SD files" -msgstr "Ververs de SD-kaart bestandslijst" - -#: src/octoprint/templates/index.jinja2:210 -msgid "Release SD card" -msgstr "Geef SD kaart vrij" - -#: src/octoprint/templates/index.jinja2:218 -msgid "Search..." -msgstr "Zoek..." - -#: src/octoprint/templates/index.jinja2:225 -#: src/octoprint/templates/index.jinja2:239 -msgid "Uploaded" -msgstr "Geupload" - -#: src/octoprint/templates/index.jinja2:226 -#: src/octoprint/templates/index.jinja2:240 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/index.jinja2:608 -#: src/octoprint/templates/settings.jinja2:709 -#: src/octoprint/templates/settings.jinja2:716 -msgid "Size" -msgstr "Grootte" - -#: src/octoprint/templates/index.jinja2:230 -msgid "Download" -msgstr "Download" - -#: src/octoprint/templates/index.jinja2:231 -#: src/octoprint/templates/index.jinja2:242 -msgid "Remove" -msgstr "Verwijderen" - -#: src/octoprint/templates/index.jinja2:232 -msgid "Load" -msgstr "Laden" - -#: src/octoprint/templates/index.jinja2:233 -msgid "Load and Print" -msgstr "Laad en print" - -#: src/octoprint/templates/index.jinja2:252 -msgid "Free" -msgstr "Vrij" - -#: src/octoprint/templates/index.jinja2:279 -msgid "Hint: You can also drag and drop files on this page to upload them." -msgstr "Hint: Je kunt ook bestanden naar deze pagina slepen en loslaten om ze te uploaden." - -#: src/octoprint/templates/index.jinja2:289 -msgid "Temperature" -msgstr "Temperatuur" - -#: src/octoprint/templates/index.jinja2:290 -msgid "Control" -msgstr "Controle" - -#: src/octoprint/templates/index.jinja2:291 -msgid "GCode Viewer" -msgstr "GCode Viewer" - -#: src/octoprint/templates/index.jinja2:292 -msgid "Terminal" -msgstr "Terminal" - -#: src/octoprint/templates/index.jinja2:310 -msgid "Offset" -msgstr "Offset" - -#: src/octoprint/templates/index.jinja2:326 -#: src/octoprint/templates/index.jinja2:348 -msgid "Set" -msgstr "Instellen" - -#: src/octoprint/templates/index.jinja2:338 -#: src/octoprint/templates/index.jinja2:569 -msgid "Off" -msgstr "Uit" - -#: src/octoprint/templates/index.jinja2:406 -msgid "Select Tool..." -msgstr "Selecteer gereedschap..." - -#: src/octoprint/templates/index.jinja2:417 -msgid "Extrude" -msgstr "Extrudeer" - -#: src/octoprint/templates/index.jinja2:418 -msgid "Retract" -msgstr "Terugtrekken" - -#: src/octoprint/templates/index.jinja2:423 -msgid "General" -msgstr "Algemeen" - -#: src/octoprint/templates/index.jinja2:425 -msgid "Motors off" -msgstr "Motoren uit" - -#: src/octoprint/templates/index.jinja2:426 -msgid "Fans on" -msgstr "Ventilatoren aan" - -#: src/octoprint/templates/index.jinja2:427 -msgid "Fans off" -msgstr "Ventilatoren uit" - -#: src/octoprint/templates/index.jinja2:491 -msgid "Sync with job progress" -msgstr "Synchroniseer met taak voortgang" - -#: src/octoprint/templates/index.jinja2:496 -msgid "Center viewport on model" -msgstr "Centreer scherm op model" - -#: src/octoprint/templates/index.jinja2:499 -msgid "Zoom in on model" -msgstr "Zoom in op model" - -#: src/octoprint/templates/index.jinja2:505 -msgid "Show moves" -msgstr "Laat bewegingen zien" - -#: src/octoprint/templates/index.jinja2:508 -msgid "Show retracts" -msgstr "Laat retracts zien" - -#: src/octoprint/templates/index.jinja2:514 -msgid "Also show previous layer" -msgstr "Laat ook de vorige laag zien" - -#: src/octoprint/templates/index.jinja2:517 -msgid "Also show next layer" -msgstr "Laat ook volgende laag zien" - -#: src/octoprint/templates/index.jinja2:522 -msgid "Reload" -msgstr "Herladen" - -#: src/octoprint/templates/index.jinja2:549 -msgid "Autoscroll" -msgstr "Automatisch scrollen" - -#: src/octoprint/templates/index.jinja2:559 -msgid "Send" -msgstr "Verstuur" - -#: src/octoprint/templates/index.jinja2:565 -msgid "Timelapse Configuration" -msgstr "Timelapse configuratie" - -#: src/octoprint/templates/index.jinja2:567 -msgid "Timelapse Mode" -msgstr "Timelapse modues" - -#: src/octoprint/templates/index.jinja2:574 -msgid "Timelapse post roll (in rendered seconds)" -msgstr "Timelapse naloop (in gerenderde seconden)" - -#: src/octoprint/templates/index.jinja2:581 -msgid "Interval" -msgstr "Interval" - -#: src/octoprint/templates/index.jinja2:590 -msgid "Save as default" -msgstr "Stel in als standaard" - -#: src/octoprint/templates/index.jinja2:595 -msgid "Save config" -msgstr "Bewaar configuratie" - -#: src/octoprint/templates/index.jinja2:599 -msgid "Finished Timelapses" -msgstr "Complete timelapsen" - -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "Sort by" -msgstr "Sorteer op" - -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/index.jinja2:607 -#: src/octoprint/templates/settings.jinja2:114 -#: src/octoprint/templates/settings.jinja2:140 -#: src/octoprint/templates/settings.jinja2:458 -#: src/octoprint/templates/settings.jinja2:534 -#: src/octoprint/templates/settings.jinja2:709 -#: src/octoprint/templates/settings.jinja2:715 -msgid "Name" -msgstr "Naam" - -#: src/octoprint/templates/index.jinja2:602 -msgid "Creation date" -msgstr "Creëer datum" - -#: src/octoprint/templates/index.jinja2:609 -#: src/octoprint/templates/settings.jinja2:116 -#: src/octoprint/templates/settings.jinja2:537 -#: src/octoprint/templates/settings.jinja2:718 -msgid "Action" -msgstr "Actie" - -#: src/octoprint/templates/index.jinja2:638 -msgid "Version" -msgstr "Versie" - -#: src/octoprint/templates/index.jinja2:641 -msgid "Homepage" -msgstr "Thuispagina" - -#: src/octoprint/templates/index.jinja2:642 -msgid "Sourcecode" -msgstr "Broncode" - -#: src/octoprint/templates/index.jinja2:643 -msgid "Documentation" -msgstr "Documentatie" - -#: src/octoprint/templates/index.jinja2:644 -msgid "Bugs and Requests" -msgstr "Bugs en Verzoeken" - -#: src/octoprint/templates/settings.jinja2:4 -msgid "OctoPrint Settings" -msgstr "OctoPrint instellingen" - -#: src/octoprint/templates/settings.jinja2:9 -msgid "Printer" -msgstr "Printer" - -#: src/octoprint/templates/settings.jinja2:10 -msgid "Serial Connection" -msgstr "Seriële verbinding" - -#: src/octoprint/templates/settings.jinja2:11 -#: src/octoprint/templates/settings.jinja2:110 -msgid "Printer Profiles" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:12 -msgid "Temperatures" -msgstr "Temperaturen" - -#: src/octoprint/templates/settings.jinja2:13 -msgid "Terminal filters" -msgstr "Terminal filters" - -#: src/octoprint/templates/settings.jinja2:14 -#: src/octoprint/templates/settings.jinja2:15 -msgid "Features" -msgstr "Functies" - -#: src/octoprint/templates/settings.jinja2:16 -msgid "Webcam" -msgstr "Webcam" - -#: src/octoprint/templates/settings.jinja2:17 -msgid "Access Control" -msgstr "Toegangs controle" - -#: src/octoprint/templates/settings.jinja2:18 -msgid "API" -msgstr "API" - -#: src/octoprint/templates/settings.jinja2:20 -msgid "Folders" -msgstr "Mappen" - -#: src/octoprint/templates/settings.jinja2:21 -msgid "Appearance" -msgstr "Uiterlijk" - -#: src/octoprint/templates/settings.jinja2:22 -#: src/octoprint/templates/settings.jinja2:705 -msgid "Logs" -msgstr "Logs" - -#: src/octoprint/templates/settings.jinja2:51 -msgid "Auto-connect to printer on server start" -msgstr "Automatisch verbinden met printer bij starten server" - -#: src/octoprint/templates/settings.jinja2:56 -msgid "Communication timeout" -msgstr "Communicatie timed-out" - -#: src/octoprint/templates/settings.jinja2:65 -msgid "Temperature timeout" -msgstr "Temperatuur timed-out" - -#: src/octoprint/templates/settings.jinja2:74 -msgid "SD status timeout" -msgstr "SD status timeout" - -#: src/octoprint/templates/settings.jinja2:83 -msgid "Connection timeout" -msgstr "Verbinding timed-out" - -#: src/octoprint/templates/settings.jinja2:92 -msgid "Autodetection timeout" -msgstr "Auto detectie timed-out" - -#: src/octoprint/templates/settings.jinja2:103 -msgid "Log communication to serial.log (might negatively impact performance)" -msgstr "Log communicatie naar serial.log (kan negetief zijn voor de prestaties)" - -#: src/octoprint/templates/settings.jinja2:103 -msgid "Warning" -msgstr "Waarschuwing" - -#: src/octoprint/templates/settings.jinja2:115 -#: src/octoprint/templates/settings.jinja2:152 -msgid "Model" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Set as default profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Edit Profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Delete Profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:130 -msgid "Add Profile..." -msgstr "" - -#: src/octoprint/templates/settings.jinja2:146 -msgid "Identifier" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:158 -#: src/octoprint/templates/settings.jinja2:490 -msgid "Color" -msgstr "Kleur" - -#: src/octoprint/templates/settings.jinja2:165 -msgid "Form Factor" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:167 -msgid "Rectangular" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:170 -msgid "Circular" -msgstr "Cirkelvormig" - -#: src/octoprint/templates/settings.jinja2:174 -msgid "Volume" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:176 -#: src/octoprint/templates/settings.jinja2:206 -msgid "X" -msgstr "X" - -#: src/octoprint/templates/settings.jinja2:183 -#: src/octoprint/templates/settings.jinja2:216 -msgid "Y" -msgstr "Y" - -#: src/octoprint/templates/settings.jinja2:190 -#: src/octoprint/templates/settings.jinja2:226 -msgid "Z" -msgstr "Z" - -#: src/octoprint/templates/settings.jinja2:198 -msgid "Heated Bed" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:204 -msgid "Axis" -msgstr "Assen" - -#: src/octoprint/templates/settings.jinja2:212 -#: src/octoprint/templates/settings.jinja2:222 -#: src/octoprint/templates/settings.jinja2:232 -msgid "Invert control" -msgstr "Bedieining spiegelen" - -#: src/octoprint/templates/settings.jinja2:236 -msgid "E" -msgstr "E" - -#: src/octoprint/templates/settings.jinja2:244 -msgid "Nozzle Diameter" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:253 -msgid "Number of Extruders" -msgstr "Aantal Extruders" - -#: src/octoprint/templates/settings.jinja2:259 -msgid "Extruder Offsets" -msgstr "Extruder Offsets" - -#: src/octoprint/templates/settings.jinja2:278 -#: src/octoprint/templates/settings.jinja2:610 -#: src/octoprint/templates/settings.jinja2:639 -#: src/octoprint/templates/settings.jinja2:689 -msgid "Abort" -msgstr "Afbreken" - -#: src/octoprint/templates/settings.jinja2:279 -#: src/octoprint/templates/settings.jinja2:611 -#: src/octoprint/templates/settings.jinja2:640 -#: src/octoprint/templates/settings.jinja2:690 -msgid "Confirm" -msgstr "Bevestig" - -#: src/octoprint/templates/settings.jinja2:286 -msgid "Stream URL" -msgstr "Stream URL" - -#: src/octoprint/templates/settings.jinja2:292 -msgid "Snapshot URL" -msgstr "Snapshot URL" - -#: src/octoprint/templates/settings.jinja2:298 -msgid "Path to FFMPEG" -msgstr "Lokatie van FFMPEG" - -#: src/octoprint/templates/settings.jinja2:304 -msgid "Timelapse bitrate" -msgstr "Timelapse bitrate" - -#: src/octoprint/templates/settings.jinja2:312 -msgid "Enable OctoPrint watermark in timelapse movies" -msgstr "Schakel OctoPrint watermerk in bij timelapse films" - -#: src/octoprint/templates/settings.jinja2:319 -msgid "Flip webcam horizontally" -msgstr "Spiegel webcam Horizontaal" - -#: src/octoprint/templates/settings.jinja2:324 -msgid "Flip webcam vertically" -msgstr "Spiegel webcam verticaal" - -#: src/octoprint/templates/settings.jinja2:335 -msgid "Enable Temperature Graph" -msgstr "Schakel temperatuur grafiek in" - -#: src/octoprint/templates/settings.jinja2:342 -msgid "Enable GCode Visualizer" -msgstr "Schakel GCode Visualizer in" - -#: src/octoprint/templates/settings.jinja2:349 -msgid "Enable SD support" -msgstr "Schakel SD ondersteuning in" - -#: src/octoprint/templates/settings.jinja2:356 -msgid "Always assume SD card is present" -msgstr "Neem aan dat SD kaart altijd aanwezig is" - -#: src/octoprint/templates/settings.jinja2:356 -#: src/octoprint/templates/settings.jinja2:370 -#: src/octoprint/templates/settings.jinja2:377 -msgid "Repetier" -msgstr "Repetier" - -#: src/octoprint/templates/settings.jinja2:363 -msgid "Wait for start on connect" -msgstr "Wacht voor start bij het verbinden" - -#: src/octoprint/templates/settings.jinja2:370 -msgid "Send a checksum with every command" -msgstr "Stuur een checksum met elk commando" - -#: src/octoprint/templates/settings.jinja2:377 -#, python-format -msgid "" -"Support TargetExtr%%n/TargetBed target temperature" -" format" -msgstr "Support TargetExtr%%n/TargetBed target temperature format" - -#: src/octoprint/templates/settings.jinja2:384 -msgid "Swallow the first \"ok\" after a resend response" -msgstr "Eerste \"ok\" negeren na opnieuw verzonden reactie" - -#: src/octoprint/templates/settings.jinja2:393 -msgid "Upload Folder" -msgstr "Lokatie voor Uploads" - -#: src/octoprint/templates/settings.jinja2:399 -msgid "Timelapse Folder" -msgstr "Lokatie voor timelapse" - -#: src/octoprint/templates/settings.jinja2:405 -msgid "Timelapse Temp Folder" -msgstr "Tijdelijke timelapse map" - -#: src/octoprint/templates/settings.jinja2:411 -msgid "Logs Folder" -msgstr "Logboek map" - -#: src/octoprint/templates/settings.jinja2:417 -msgid "Watched Folder" -msgstr "Bekeken map" - -#: src/octoprint/templates/settings.jinja2:427 -msgid "Extruder" -msgstr "Extruder" - -#: src/octoprint/templates/settings.jinja2:459 -msgid "RegExp" -msgstr "Reguliere Expressie" - -#: src/octoprint/templates/settings.jinja2:484 -msgid "Title" -msgstr "Titel" - -#: src/octoprint/templates/settings.jinja2:503 -msgid "Enable" -msgstr "Ingeschakeld" - -#: src/octoprint/templates/settings.jinja2:510 -#, python-format -msgid "Allow Cross Origin Resource Sharing (CORS)" -msgstr "Sta Cross Origin Resource Sharing (CORS) toe" - -#: src/octoprint/templates/settings.jinja2:515 -#: src/octoprint/templates/settings.jinja2:542 -msgid "API Key" -msgstr "API sleutel" - -#: src/octoprint/templates/settings.jinja2:521 -#: src/octoprint/templates/settings.jinja2:679 -msgid "QR Code" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:535 -#: src/octoprint/templates/settings.jinja2:596 -#: src/octoprint/templates/settings.jinja2:625 -msgid "Active" -msgstr "Aktief" - -#: src/octoprint/templates/settings.jinja2:536 -#: src/octoprint/templates/settings.jinja2:603 -#: src/octoprint/templates/settings.jinja2:632 -msgid "Admin" -msgstr "Admin" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Update User" -msgstr "Update gebruiker" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Change password" -msgstr "Verander wachtwoord" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Delete user" -msgstr "Gebruiker verwijderen" - -#: src/octoprint/templates/settings.jinja2:563 -#: src/octoprint/templates/settings.jinja2:570 -msgid "Add user" -msgstr "Gebruiker toevoegen" - -#: src/octoprint/templates/settings.jinja2:587 -#: src/octoprint/templates/settings.jinja2:658 -msgid "Repeat Password" -msgstr "Wachtwoord herhalen" - -#: src/octoprint/templates/settings.jinja2:618 -#, python-format -msgid "Edit user \"%(user)s\"" -msgstr "Bewerk gebruiker \"%(user)s\"" - -#: src/octoprint/templates/settings.jinja2:647 -#, python-format -msgid "Change password for user \"%(user)s\"" -msgstr "Verander wachtwoord voor gebruiker \"%(user)s\"" - -#: src/octoprint/templates/settings.jinja2:652 -msgid "New Password" -msgstr "Nieuw wachtwoord" - -#: src/octoprint/templates/settings.jinja2:667 -msgid "Current API Key" -msgstr "Huidige API sleutel" - -#: src/octoprint/templates/settings.jinja2:670 -msgid "N/A" -msgstr "N/B" - -#: src/octoprint/templates/settings.jinja2:709 -msgid "Modification date" -msgstr "Datum aangepast" - -#: src/octoprint/templates/settings.jinja2:717 -msgid "Date" -msgstr "Datum" - -#: src/octoprint/templates/settings.jinja2:756 -msgid "Save" -msgstr "Opslaan" diff --git a/src/octoprint/translations/no/LC_MESSAGES/messages.mo b/src/octoprint/translations/no/LC_MESSAGES/messages.mo deleted file mode 100644 index 080e1bcfed014d06b3785bf981cdd6ee5ca467f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20068 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, 2014 -# zelluz , 2014 -msgid "" -msgstr "" -"Project-Id-Version: OctoPrint\n" -"Report-Msgid-Bugs-To: i18n@octoprint.org\n" -"POT-Creation-Date: 2014-12-18 14:45+0100\n" -"PO-Revision-Date: 2014-12-18 14:04+0000\n" -"Last-Translator: Gina Häußge \n" -"Language-Team: Norwegian (http://www.transifex.com/projects/p/octoprint/language/no/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Language: no\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: src/octoprint/static/js/app/dataupdater.js:52 -#: src/octoprint/static/js/app/dataupdater.js:85 -#: src/octoprint/static/js/app/helpers.js:434 -#: src/octoprint/templates/dialogs.jinja2:55 -msgid "Server is offline" -msgstr "Server er frakoblet" - -#: src/octoprint/static/js/app/dataupdater.js:53 -msgid "" -"The server appears to be offline, at least I'm not getting any response from" -" it. I'll try to reconnect automatically over the next couple of " -"minutes, however you are welcome to try a manual reconnect anytime " -"using the button below." -msgstr "Serveren er tilsynelatende frakoblet, i det minste får jeg ikke noen respons fra den. Jeg prøver å koble til automatisk over de neste minuttene, du kan prøve en manuell oppkobling når du ønsker det ved å bruke knappen nedenfor." - -#: src/octoprint/static/js/app/dataupdater.js:86 -msgid "" -"The server appears to be offline, at least I'm not getting any response from" -" it. I could not reconnect automatically, but you may try a" -" manual reconnect using the button below." -msgstr "Serveren er tilsynelatende frakoblet, i det minste får jeg ikke noen respons fra den. Jeg kan ikke koble til den automatisk, du kan prøve en manuell oppkobling når du ønsker det ved å bruke knappen nedenfor." - -#: src/octoprint/static/js/app/dataupdater.js:158 -#: src/octoprint/static/js/app/dataupdater.js:199 -#, python-format -msgid "Slicing ... (%(percentage)d%%)" -msgstr "" - -#: src/octoprint/static/js/app/dataupdater.js:187 -msgid "Rendering timelapse" -msgstr "Sammensetter timelapse" - -#: src/octoprint/static/js/app/dataupdater.js:187 -#, python-format -msgid "Now rendering timelapse %(movie_basename)s" -msgstr "Sammensetter timelapse %(movie_basename)s" - -#: src/octoprint/static/js/app/dataupdater.js:189 -msgid "Timelapse ready" -msgstr "Timelapse klar" - -#: src/octoprint/static/js/app/dataupdater.js:189 -#, python-format -msgid "New timelapse %(movie_basename)s is done rendering." -msgstr "Ny timelapse for %(movie_basename)s er ferdig sammensatt" - -#: src/octoprint/static/js/app/dataupdater.js:192 -#, python-format -msgid "" -"Rendering of timelapse %(movie_basename)s failed with return code " -"%(returncode)s" -msgstr "" - -#: src/octoprint/static/js/app/dataupdater.js:194 -msgid "Rendering failed" -msgstr "Sammensetting feilet" - -#: src/octoprint/static/js/app/dataupdater.js:201 -msgid "Slicing ..." -msgstr "Slicing ..." - -#: src/octoprint/static/js/app/dataupdater.js:207 -msgid "Slicing done" -msgstr "Slicing ferdig" - -#: src/octoprint/static/js/app/dataupdater.js:207 -#, python-format -msgid "Sliced %(stl)s to %(gcode)s, took %(time).2f seconds" -msgstr "Sliced %(stl)s til %(gcode)s, tok %(time).2f sekunder" - -#: src/octoprint/static/js/app/dataupdater.js:228 -#, python-format -msgid "Could not slice %(stl)s to %(gcode)s: %(reason)s" -msgstr "Feilet å slice %(stl)s til %(gcode)s: %(reason)s" - -#: src/octoprint/static/js/app/dataupdater.js:229 -msgid "Slicing failed" -msgstr "Slicing feilet" - -#: src/octoprint/static/js/app/dataupdater.js:238 -msgid "Streaming ..." -msgstr "Strømmer..." - -#: src/octoprint/static/js/app/dataupdater.js:244 -msgid "Streaming done" -msgstr "Strømming ferdig" - -#: src/octoprint/static/js/app/dataupdater.js:245 -#, python-format -msgid "Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds" -msgstr "Strømmet %(local)s til %(remote)s på minnekort, tok %(time).2f sekunder" - -#: src/octoprint/static/js/app/helpers.js:355 -#, python-format -msgid "%(hour)02d:%(minute)02d:%(second)02d" -msgstr "%(hour)02d:%(minute)02d:%(second)02d" - -#: src/octoprint/static/js/app/helpers.js:375 -msgid "YYYY-MM-DD HH:mm" -msgstr "YYYY-MM-DD HH:mm" - -#: src/octoprint/static/js/app/helpers.js:393 -#: src/octoprint/static/js/app/helpers.js:398 -msgid "off" -msgstr "Av" - -#: src/octoprint/static/js/app/main.js:17 -msgid "Offline" -msgstr "Frakoblet" - -#: src/octoprint/static/js/app/main.js:18 -msgid "Opening serial port" -msgstr "Åpner serialport" - -#: src/octoprint/static/js/app/main.js:19 -msgid "Detecting serial port" -msgstr "Finner serialport" - -#: src/octoprint/static/js/app/main.js:20 -msgid "Detecting baudrate" -msgstr "Finner seriell hastighet" - -#: src/octoprint/static/js/app/main.js:21 -msgid "Connecting" -msgstr "Kobler til" - -#: src/octoprint/static/js/app/main.js:22 -msgid "Operational" -msgstr "Operativ" - -#: src/octoprint/static/js/app/main.js:23 -msgid "Printing from SD" -msgstr "Utskrift fra minnekort" - -#: src/octoprint/static/js/app/main.js:24 -msgid "Sending file to SD" -msgstr "Sender fil til minnekort" - -#: src/octoprint/static/js/app/main.js:25 -msgid "Printing" -msgstr "Skriver ut" - -#: src/octoprint/static/js/app/main.js:26 -msgid "Paused" -msgstr "Pause" - -#: src/octoprint/static/js/app/main.js:27 -msgid "Closed" -msgstr "Lukket" - -#: src/octoprint/static/js/app/main.js:28 -msgid "Transfering file to SD" -msgstr "Overfører til minnekort" - -#: src/octoprint/static/js/app/main.js:184 -msgid "" -"Could not upload the file. Make sure that it is a GCODE file and has the " -"extension \".gcode\" or \".gco\" or that it is an STL file with the " -"extension \".stl\" and slicing support is enabled and configured." -msgstr "Klarte ikke å laste opp filen, Sørg for at det er en GCODE fil med filtype \".gcode\" eller \".gco\" eller det er en STL fil med filtype \".stl\" og at slicing er aktivert og konfigurert." - -#: src/octoprint/static/js/app/main.js:200 -msgid "Uploading ..." -msgstr "Laster opp ..." - -#: src/octoprint/static/js/app/main.js:203 -msgid "Saving ..." -msgstr "Lagrer ..." - -#: src/octoprint/static/js/app/viewmodels/appearance.js:9 -#: src/octoprint/static/js/app/viewmodels/appearance.js:11 -#: src/octoprint/static/js/app/viewmodels/appearance.js:16 -#: src/octoprint/static/js/app/viewmodels/appearance.js:18 -msgid "OctoPrint" -msgstr "OctoPrint" - -#: src/octoprint/static/js/app/viewmodels/connection.js:41 -#: src/octoprint/templates/index.jinja2:144 -msgid "Connect" -msgstr "Koble til" - -#: src/octoprint/static/js/app/viewmodels/connection.js:43 -msgid "Disconnect" -msgstr "Koble fra" - -#: src/octoprint/static/js/app/viewmodels/control.js:42 -#: src/octoprint/static/js/app/viewmodels/files.js:298 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -#: src/octoprint/static/js/app/viewmodels/gcode.js:432 -#: src/octoprint/static/js/app/viewmodels/printerstate.js:166 -#: src/octoprint/static/js/app/viewmodels/temperature.js:56 -msgid "Tool" -msgstr "Verktøy" - -#: src/octoprint/static/js/app/viewmodels/control.js:49 -#: src/octoprint/static/js/app/viewmodels/temperature.js:68 -msgid "Hotend" -msgstr "Dyse" - -#: src/octoprint/static/js/app/viewmodels/files.js:293 -#: src/octoprint/static/js/app/viewmodels/files.js:298 -msgid "Filament" -msgstr "Tråd" - -#: src/octoprint/static/js/app/viewmodels/files.js:302 -msgid "Estimated Print Time" -msgstr "Bergenet utskriftstid" - -#: src/octoprint/static/js/app/viewmodels/files.js:305 -msgid "Last Printed" -msgstr "Sist utskrevet" - -#: src/octoprint/static/js/app/viewmodels/files.js:307 -msgid "Last Print Time" -msgstr "Siste utskriftstid" - -#: src/octoprint/static/js/app/viewmodels/firstrun.js:37 -msgid "" -"If you disable Access Control and your OctoPrint " -"installation is accessible from the internet, your printer will be " -"accessible by everyone - that also includes the bad guys!" -msgstr "Hvis du slår av adgangskontroll og din OctoPrint innstallasjon er tilgjengelig fra internett, din printer vil bli tilgjengelig for alle - inkluderer også dei med uærlige intensjoner" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:13 -msgid "Loading..." -msgstr "Laster..." - -#: src/octoprint/static/js/app/viewmodels/gcode.js:17 -msgid "Analyzing..." -msgstr "Analyserer..." - -#: src/octoprint/static/js/app/viewmodels/gcode.js:21 -msgid "Analyzed" -msgstr "Analysert" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:395 -msgid "Model size" -msgstr "Modellstørrelse" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:397 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -msgid "Total filament used" -msgstr "Totalt trådforbruk" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:397 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -#: src/octoprint/static/js/app/viewmodels/gcode.js:404 -msgid "mm" -msgstr "mm" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:403 -msgid "Estimated print time" -msgstr "Beregnet printtid" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:404 -msgid "Estimated layer height" -msgstr "Estimert laghøyde" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "Layer count" -msgstr "Antall lag" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "printed" -msgstr "Utskrevet" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "visited" -msgstr "besøkt" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:424 -msgid "Layer number" -msgstr "Lag nummer" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:425 -msgid "Layer height" -msgstr "Lag høyde" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:426 -msgid "GCODE commands in layer" -msgstr "GCODE kommandoer i lag" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:429 -#: src/octoprint/static/js/app/viewmodels/gcode.js:432 -msgid "Filament used by layer" -msgstr "Tråd brukt i laget" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:436 -msgid "Print time for layer" -msgstr "Printtid for lag" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:15 -#: src/octoprint/templates/index.jinja2:99 -#: src/octoprint/templates/index.jinja2:110 -msgid "Login" -msgstr "Logg inn" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:70 -msgid "Login successful" -msgstr "Logg inn vellykket" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:70 -#, python-format -msgid "You are now logged in as \"%(username)s\"" -msgstr "Du er no logget inn som \"%(username)s\"" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:74 -msgid "Login failed" -msgstr "Logg inn misslykkes" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:74 -msgid "User unknown or wrong password" -msgstr "Bruker ukjent eller feil passord" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:84 -msgid "Logout successful" -msgstr "Logg ut vellykket" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:84 -msgid "You are now logged out" -msgstr "Du er nå logget ut" - -#: src/octoprint/static/js/app/viewmodels/navigation.js:17 -#, python-format -msgid "The command \"%(command)s\" executed successfully" -msgstr "Kommando \"%(command)s\" vellykket" - -#: src/octoprint/static/js/app/viewmodels/navigation.js:20 -#, python-format -msgid "The command \"%(command)s\" could not be executed." -msgstr "Kommando \"%(command)s\" mislykkes" - -#: src/octoprint/static/js/app/viewmodels/navigation.js:22 -msgid "Error" -msgstr "Feil" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:84 -#: src/octoprint/static/js/app/viewmodels/settings.js:16 -#: src/octoprint/static/js/app/viewmodels/settings.js:43 -msgid "default" -msgstr "standard" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:85 -#: src/octoprint/static/js/app/viewmodels/settings.js:17 -#: src/octoprint/static/js/app/viewmodels/settings.js:29 -msgid "red" -msgstr "rød" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:86 -#: src/octoprint/static/js/app/viewmodels/settings.js:18 -#: src/octoprint/static/js/app/viewmodels/settings.js:31 -msgid "orange" -msgstr "orange" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:87 -#: src/octoprint/static/js/app/viewmodels/settings.js:19 -#: src/octoprint/static/js/app/viewmodels/settings.js:33 -msgid "yellow" -msgstr "gul" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:88 -#: src/octoprint/static/js/app/viewmodels/settings.js:20 -#: src/octoprint/static/js/app/viewmodels/settings.js:35 -msgid "green" -msgstr "grønn" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:89 -#: src/octoprint/static/js/app/viewmodels/settings.js:21 -#: src/octoprint/static/js/app/viewmodels/settings.js:37 -msgid "blue" -msgstr "blå" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:90 -#: src/octoprint/static/js/app/viewmodels/settings.js:23 -#: src/octoprint/static/js/app/viewmodels/settings.js:41 -msgid "black" -msgstr "svart" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:245 -msgid "Add Printer Profile" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:245 -#, python-format -msgid "Edit Printer Profile \"%(name)s\"" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:33 -msgid "Restarts the print job from the beginning" -msgstr "Omstarter utskriftsjobben fra begynnelsen" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:34 -msgid "Starts the print job" -msgstr "Starter utskriften" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:35 -msgid "Resumes the print job" -msgstr "Fortsetter utskriften" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:36 -msgid "Pauses the print job" -msgstr "Pause utskriften" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:69 -msgid "Calculating..." -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:82 -msgid "Continue" -msgstr "Fortsett" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:84 -#: src/octoprint/templates/index.jinja2:171 -msgid "Pause" -msgstr "Pause" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:95 -#: src/octoprint/templates/index.jinja2:570 -msgid "On Z Change" -msgstr "Ved Z endring" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:97 -#: src/octoprint/templates/index.jinja2:571 -msgid "Timed" -msgstr "Tidtakes" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:97 -#: src/octoprint/templates/index.jinja2:577 -#: src/octoprint/templates/index.jinja2:584 -msgid "sec" -msgstr "sek" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:205 -msgid "This will restart the print job from the beginning." -msgstr "Dette vil starte utskriftsjobbene fra starten" - -#: src/octoprint/static/js/app/viewmodels/settings.js:22 -#: src/octoprint/static/js/app/viewmodels/settings.js:39 -msgid "violet" -msgstr "fiolett" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:24 -msgid "Do nothing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:25 -msgid "Select for printing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:26 -msgid "Start printing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:33 -#, python-format -msgid "Slicing %(filename)s" -msgstr "Slicer %(filename)s" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:22 -#: src/octoprint/static/js/app/viewmodels/temperature.js:74 -#: src/octoprint/templates/settings.jinja2:428 -msgid "Bed" -msgstr "Brett" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:113 -msgid "just now" -msgstr "Akkurat no" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:115 -msgid "min" -msgstr "min" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:255 -#: src/octoprint/templates/index.jinja2:308 -msgid "Actual" -msgstr "Faktisk" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:260 -#: src/octoprint/templates/index.jinja2:309 -msgid "Target" -msgstr "Mål" - -#: src/octoprint/templates/dialogs.jinja2:7 -msgid "" -"Please configure which slicer and which slicing profile to use and name the " -"GCode file to slice to below, or click \"Cancel\" if you do not wish to " -"slice the file now." -msgstr "Vennligst konfigurer hvilken slicer og profil for bruk og velg GCode fil for slicing nedenfor, eller trykk \"Avbryt\" hvis du ikke ønsker å slice filen no." - -#: src/octoprint/templates/dialogs.jinja2:10 -msgid "Slicer" -msgstr "Slicer" - -#: src/octoprint/templates/dialogs.jinja2:12 -msgid "Select a slicer..." -msgstr "Velg en slicer" - -#: src/octoprint/templates/dialogs.jinja2:16 -msgid "Slicing Profile" -msgstr "Slicer profil" - -#: src/octoprint/templates/dialogs.jinja2:18 -msgid "Select a slicing profile..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:22 -#: src/octoprint/templates/index.jinja2:136 -msgid "Printer Profile" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:24 -msgid "Select a printer profile..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:28 -msgid "GCode Filename" -msgstr "GCode filnavn" - -#: src/octoprint/templates/dialogs.jinja2:37 -msgid "After slicing..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:45 -#: src/octoprint/templates/dialogs.jinja2:90 -#: src/octoprint/templates/index.jinja2:172 -#: src/octoprint/templates/settings.jinja2:755 -msgid "Cancel" -msgstr "Avbryt" - -#: src/octoprint/templates/dialogs.jinja2:46 -#: src/octoprint/templates/index.jinja2:243 -msgid "Slice" -msgstr "Slice" - -#: src/octoprint/templates/dialogs.jinja2:58 -msgid "Attempt to reconnect" -msgstr "Forsøk å koble til på nytt" - -#: src/octoprint/templates/dialogs.jinja2:69 -msgid "Upload locally" -msgstr "Last opp lokalt" - -#: src/octoprint/templates/dialogs.jinja2:71 -#: src/octoprint/templates/index.jinja2:264 -msgid "Upload to SD" -msgstr "Last opp til minnekort" - -#: src/octoprint/templates/dialogs.jinja2:71 -msgid "SD not initialized" -msgstr "Minnekort er ikke startet" - -#: src/octoprint/templates/dialogs.jinja2:74 -#: src/octoprint/templates/index.jinja2:259 -#: src/octoprint/templates/index.jinja2:270 -msgid "Upload" -msgstr "Last opp" - -#: src/octoprint/templates/dialogs.jinja2:83 -msgid "Are you sure?" -msgstr "Er du sikker?" - -#: src/octoprint/templates/dialogs.jinja2:87 -msgid "Are you sure you want to proceed?" -msgstr "Er du sikker du vil fortsette?" - -#: src/octoprint/templates/dialogs.jinja2:91 -msgid "Proceed" -msgstr "Fortsett" - -#: src/octoprint/templates/dialogs.jinja2:97 -msgid "Configure Access Control" -msgstr "Konfigurer adgangskontroll" - -#: src/octoprint/templates/dialogs.jinja2:100 -msgid "" -"

\n" -" Please read the following, it is very important for your printer's health!\n" -"

\n" -"

\n" -" OctoPrint by default now ships with Access Control enabled, meaning you won't be able to do anything with the\n" -" printer unless you login first as a configured user. This is to prevent strangers - possibly with\n" -" malicious intent - to gain access to your printer via the internet or another untrustworthy network\n" -" and using it in such a way that it is damaged or worse (i.e. causes a fire).\n" -"

\n" -"

\n" -" It looks like you haven't configured access control yet. Please set up an username and password for the\n" -" initial administrator account who will have full access to both the printer and OctoPrint's settings, then click\n" -" on \"Keep Access Control Enabled\":\n" -"

" -msgstr "

\nVennligst les følgende, det er veldig viktig for din printers helse!!\n

\n

\nOctoPrint kommer originalt med adgangskontroll aktivert, som betyr at du ikke får gjort noe med\nprinteren med mindre du logger inn med en konfigurert bruker. Dette er for å forhindre ukjente - med potensielt\nuærlige intensjoner - fra å få tilgang til din printer via Internett eller et usikret nettverk\nog bruker den i en slik måte at skade oppstår eller verre (f.eks forårsaker en brann).\n

\n

\nDu har ikke konfigurert adgangskontrollen enda. Vennligst sett et brukernavn og passord for den\nførste administratorkontoen som vil ha full adgang til både skriveren og OctoPrint innstillinger, klikk deretter på\n\"Behold adgangskontroll aktivert\":\n

" - -#: src/octoprint/templates/dialogs.jinja2:116 -#: src/octoprint/templates/index.jinja2:103 -#: src/octoprint/templates/index.jinja2:104 -#: src/octoprint/templates/settings.jinja2:575 -msgid "Username" -msgstr "Brukernavn" - -#: src/octoprint/templates/dialogs.jinja2:122 -#: src/octoprint/templates/index.jinja2:105 -#: src/octoprint/templates/index.jinja2:106 -#: src/octoprint/templates/settings.jinja2:581 -msgid "Password" -msgstr "Passord" - -#: src/octoprint/templates/dialogs.jinja2:128 -msgid "Confirm Password" -msgstr "Bekreft passord" - -#: src/octoprint/templates/dialogs.jinja2:131 -#: src/octoprint/templates/settings.jinja2:590 -#: src/octoprint/templates/settings.jinja2:661 -msgid "Passwords do not match" -msgstr "Passordet er ikke likt" - -#: src/octoprint/templates/dialogs.jinja2:135 -msgid "" -"

\n" -" Note: In case that your OctoPrint installation is only accessible from within a trustworthy network and you don't\n" -" need Access Control for other reasons, you may alternatively disable Access Control. You should only\n" -" do this if you are absolutely certain that only people you know and trust will be able to connect to it.\n" -"

\n" -"

\n" -" Do NOT underestimate the risk of an unsecured access from the internet to your printer!\n" -"

" -msgstr "

\nNoter: Hvis din OctoPrint installasjon er på et nettverk som du er helt sikker på at det er kun du eller folk du stoler på og du ikke ønsker adgangskontroll av en eller annen grunn,\nkan du deaktivere adgangskontrollen. Du burde kun\ngjøre dette vist du er helt sikker på at det er bare folk du kjenner og stoler på som vil koble til printeren.\n

\n

\nIKKE undervurder faren ved en usikret adgang fra Internett til din printer!\n

" - -#: src/octoprint/templates/dialogs.jinja2:145 -msgid "Disable Access Control" -msgstr "Deaktiver adgangskontroll" - -#: src/octoprint/templates/dialogs.jinja2:146 -msgid "Keep Access Control Enabled" -msgstr "Behold adgangskontroll aktivert" - -#: src/octoprint/templates/index.jinja2:82 -msgid "Settings" -msgstr "Innstillinger" - -#: src/octoprint/templates/index.jinja2:88 -msgid "System" -msgstr "System" - -#: src/octoprint/templates/index.jinja2:108 -msgid "Remember me" -msgstr "Husk meg" - -#: src/octoprint/templates/index.jinja2:113 -msgid "Change Password" -msgstr "Endre passord" - -#: src/octoprint/templates/index.jinja2:114 -msgid "Logout" -msgstr "Logg ut" - -#: src/octoprint/templates/index.jinja2:128 -msgid "Connection" -msgstr "Tilkobling" - -#: src/octoprint/templates/index.jinja2:132 -#: src/octoprint/templates/settings.jinja2:37 -msgid "Serial Port" -msgstr "Seriellport" - -#: src/octoprint/templates/index.jinja2:134 -#: src/octoprint/templates/settings.jinja2:43 -msgid "Baudrate" -msgstr "Baudrate" - -#: src/octoprint/templates/index.jinja2:139 -msgid "Save connection settings" -msgstr "Lagre tilkoblingsinnstillinger" - -#: src/octoprint/templates/index.jinja2:142 -msgid "Auto-connect on server startup" -msgstr "Koble til automatisk ved oppstart" - -#: src/octoprint/templates/index.jinja2:150 -msgid "State" -msgstr "Tilstand" - -#: src/octoprint/templates/index.jinja2:154 -msgid "Machine State" -msgstr "Maskintilstand" - -#: src/octoprint/templates/index.jinja2:155 -msgid "File" -msgstr "Fil" - -#: src/octoprint/templates/index.jinja2:156 -#: src/octoprint/templates/index.jinja2:293 -msgid "Timelapse" -msgstr "Timelapse" - -#: src/octoprint/templates/index.jinja2:160 -msgid "Approx. Total Print Time" -msgstr "Beregnet total utskriftstid" - -#: src/octoprint/templates/index.jinja2:161 -msgid "Print Time" -msgstr "Utskriftstid" - -#: src/octoprint/templates/index.jinja2:162 -msgid "Print Time Left" -msgstr "Gjenstående utskriftstid" - -#: src/octoprint/templates/index.jinja2:163 -msgid "Printed" -msgstr "Utskrevet" - -#: src/octoprint/templates/index.jinja2:170 -msgid "Restart" -msgstr "Omstart" - -#: src/octoprint/templates/index.jinja2:170 -msgid "Print" -msgstr "Utskriv" - -#: src/octoprint/templates/index.jinja2:171 -msgid "Resume" -msgstr "Fortsett" - -#: src/octoprint/templates/index.jinja2:172 -msgid "Cancels the print job" -msgstr "Avbryter utskriftsjobben" - -#: src/octoprint/templates/index.jinja2:179 -msgid "Files" -msgstr "Filer" - -#: src/octoprint/templates/index.jinja2:186 -msgid "Sort by name" -msgstr "Sorter ved navn" - -#: src/octoprint/templates/index.jinja2:186 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "ascending" -msgstr "stigende" - -#: src/octoprint/templates/index.jinja2:187 -msgid "Sort by upload date" -msgstr "Sorter etter opplastningsdato" - -#: src/octoprint/templates/index.jinja2:187 -#: src/octoprint/templates/index.jinja2:188 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "descending" -msgstr "synkende" - -#: src/octoprint/templates/index.jinja2:188 -msgid "Sort by file size" -msgstr "Sorter filer etter størrelse" - -#: src/octoprint/templates/index.jinja2:190 -msgid "Only show GCode files" -msgstr "Bare vis GCode filer" - -#: src/octoprint/templates/index.jinja2:191 -msgid "Only show STL files" -msgstr "Vis kun STL filer" - -#: src/octoprint/templates/index.jinja2:194 -msgid "Only show files stored locally" -msgstr "Bare vis filer lagret lokalt" - -#: src/octoprint/templates/index.jinja2:195 -msgid "Only show files stored on SD" -msgstr "Bare vis filer lagret på minnekortet" - -#: src/octoprint/templates/index.jinja2:198 -msgid "Hide successfully printed files" -msgstr "Skjul vellykkede utskriftsfiler" - -#: src/octoprint/templates/index.jinja2:208 -msgid "Initialize SD card" -msgstr "Start minnekortet" - -#: src/octoprint/templates/index.jinja2:209 -msgid "Refresh SD files" -msgstr "Oppdater minnekort" - -#: src/octoprint/templates/index.jinja2:210 -msgid "Release SD card" -msgstr "Løs ut minnekort" - -#: src/octoprint/templates/index.jinja2:218 -msgid "Search..." -msgstr "Søk..." - -#: src/octoprint/templates/index.jinja2:225 -#: src/octoprint/templates/index.jinja2:239 -msgid "Uploaded" -msgstr "Opplastet" - -#: src/octoprint/templates/index.jinja2:226 -#: src/octoprint/templates/index.jinja2:240 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/index.jinja2:608 -#: src/octoprint/templates/settings.jinja2:709 -#: src/octoprint/templates/settings.jinja2:716 -msgid "Size" -msgstr "Størrelse" - -#: src/octoprint/templates/index.jinja2:230 -msgid "Download" -msgstr "Last ned" - -#: src/octoprint/templates/index.jinja2:231 -#: src/octoprint/templates/index.jinja2:242 -msgid "Remove" -msgstr "Fjern" - -#: src/octoprint/templates/index.jinja2:232 -msgid "Load" -msgstr "Last" - -#: src/octoprint/templates/index.jinja2:233 -msgid "Load and Print" -msgstr "Last og skriv ut" - -#: src/octoprint/templates/index.jinja2:252 -msgid "Free" -msgstr "Ledig" - -#: src/octoprint/templates/index.jinja2:279 -msgid "Hint: You can also drag and drop files on this page to upload them." -msgstr "Tips: Du kan også dra og slippe filer på denne siden for å laste de opp" - -#: src/octoprint/templates/index.jinja2:289 -msgid "Temperature" -msgstr "Temperatur" - -#: src/octoprint/templates/index.jinja2:290 -msgid "Control" -msgstr "Kontroll" - -#: src/octoprint/templates/index.jinja2:291 -msgid "GCode Viewer" -msgstr "GCode framviser" - -#: src/octoprint/templates/index.jinja2:292 -msgid "Terminal" -msgstr "Terminal" - -#: src/octoprint/templates/index.jinja2:310 -msgid "Offset" -msgstr "Avvik" - -#: src/octoprint/templates/index.jinja2:326 -#: src/octoprint/templates/index.jinja2:348 -msgid "Set" -msgstr "Velg" - -#: src/octoprint/templates/index.jinja2:338 -#: src/octoprint/templates/index.jinja2:569 -msgid "Off" -msgstr "Av" - -#: src/octoprint/templates/index.jinja2:406 -msgid "Select Tool..." -msgstr "Velg verktøy" - -#: src/octoprint/templates/index.jinja2:417 -msgid "Extrude" -msgstr "Extrude" - -#: src/octoprint/templates/index.jinja2:418 -msgid "Retract" -msgstr "Tilbaketrekking" - -#: src/octoprint/templates/index.jinja2:423 -msgid "General" -msgstr "Generell" - -#: src/octoprint/templates/index.jinja2:425 -msgid "Motors off" -msgstr "Motorer av" - -#: src/octoprint/templates/index.jinja2:426 -msgid "Fans on" -msgstr "Vifter på" - -#: src/octoprint/templates/index.jinja2:427 -msgid "Fans off" -msgstr "Vifter av" - -#: src/octoprint/templates/index.jinja2:491 -msgid "Sync with job progress" -msgstr "Synkroniser med jobbprogresjon" - -#: src/octoprint/templates/index.jinja2:496 -msgid "Center viewport on model" -msgstr "Sentrer bilde på modell" - -#: src/octoprint/templates/index.jinja2:499 -msgid "Zoom in on model" -msgstr "Zoom inn på modell" - -#: src/octoprint/templates/index.jinja2:505 -msgid "Show moves" -msgstr "Vis forflyttninger" - -#: src/octoprint/templates/index.jinja2:508 -msgid "Show retracts" -msgstr "Vis tilbaketrekninger" - -#: src/octoprint/templates/index.jinja2:514 -msgid "Also show previous layer" -msgstr "Også vis forrige lag" - -#: src/octoprint/templates/index.jinja2:517 -msgid "Also show next layer" -msgstr "Også vis neste lag" - -#: src/octoprint/templates/index.jinja2:522 -msgid "Reload" -msgstr "Last på nytt" - -#: src/octoprint/templates/index.jinja2:549 -msgid "Autoscroll" -msgstr "Autoscroll" - -#: src/octoprint/templates/index.jinja2:559 -msgid "Send" -msgstr "Send" - -#: src/octoprint/templates/index.jinja2:565 -msgid "Timelapse Configuration" -msgstr "Timelapse konfigurasjon" - -#: src/octoprint/templates/index.jinja2:567 -msgid "Timelapse Mode" -msgstr "Timelapse modus" - -#: src/octoprint/templates/index.jinja2:574 -msgid "Timelapse post roll (in rendered seconds)" -msgstr "Timelapse etter opptak (i sekunder)" - -#: src/octoprint/templates/index.jinja2:581 -msgid "Interval" -msgstr "Interval" - -#: src/octoprint/templates/index.jinja2:590 -msgid "Save as default" -msgstr "Lagre som standard" - -#: src/octoprint/templates/index.jinja2:595 -msgid "Save config" -msgstr "Lagre konfigurasjon" - -#: src/octoprint/templates/index.jinja2:599 -msgid "Finished Timelapses" -msgstr "Ferdig timelapser" - -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "Sort by" -msgstr "Sorter etter" - -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/index.jinja2:607 -#: src/octoprint/templates/settings.jinja2:114 -#: src/octoprint/templates/settings.jinja2:140 -#: src/octoprint/templates/settings.jinja2:458 -#: src/octoprint/templates/settings.jinja2:534 -#: src/octoprint/templates/settings.jinja2:709 -#: src/octoprint/templates/settings.jinja2:715 -msgid "Name" -msgstr "Navn" - -#: src/octoprint/templates/index.jinja2:602 -msgid "Creation date" -msgstr "Opprettelsesdato" - -#: src/octoprint/templates/index.jinja2:609 -#: src/octoprint/templates/settings.jinja2:116 -#: src/octoprint/templates/settings.jinja2:537 -#: src/octoprint/templates/settings.jinja2:718 -msgid "Action" -msgstr "Handling" - -#: src/octoprint/templates/index.jinja2:638 -msgid "Version" -msgstr "Versjon" - -#: src/octoprint/templates/index.jinja2:641 -msgid "Homepage" -msgstr "Hjemmeside" - -#: src/octoprint/templates/index.jinja2:642 -msgid "Sourcecode" -msgstr "Kildekode" - -#: src/octoprint/templates/index.jinja2:643 -msgid "Documentation" -msgstr "Dokumentasjon" - -#: src/octoprint/templates/index.jinja2:644 -msgid "Bugs and Requests" -msgstr "Feilrapportering og ønsker" - -#: src/octoprint/templates/settings.jinja2:4 -msgid "OctoPrint Settings" -msgstr "OctoPrint innstillinger" - -#: src/octoprint/templates/settings.jinja2:9 -msgid "Printer" -msgstr "Printer" - -#: src/octoprint/templates/settings.jinja2:10 -msgid "Serial Connection" -msgstr "Seriell kontakt" - -#: src/octoprint/templates/settings.jinja2:11 -#: src/octoprint/templates/settings.jinja2:110 -msgid "Printer Profiles" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:12 -msgid "Temperatures" -msgstr "Temperaturer" - -#: src/octoprint/templates/settings.jinja2:13 -msgid "Terminal filters" -msgstr "Terminal filtre" - -#: src/octoprint/templates/settings.jinja2:14 -#: src/octoprint/templates/settings.jinja2:15 -msgid "Features" -msgstr "Funksjoner" - -#: src/octoprint/templates/settings.jinja2:16 -msgid "Webcam" -msgstr "Nettkamera" - -#: src/octoprint/templates/settings.jinja2:17 -msgid "Access Control" -msgstr "Adgangskontroll" - -#: src/octoprint/templates/settings.jinja2:18 -msgid "API" -msgstr "API" - -#: src/octoprint/templates/settings.jinja2:20 -msgid "Folders" -msgstr "Mapper" - -#: src/octoprint/templates/settings.jinja2:21 -msgid "Appearance" -msgstr "Utseende" - -#: src/octoprint/templates/settings.jinja2:22 -#: src/octoprint/templates/settings.jinja2:705 -msgid "Logs" -msgstr "Logger" - -#: src/octoprint/templates/settings.jinja2:51 -msgid "Auto-connect to printer on server start" -msgstr "Koble til printer automatisk ved oppstart" - -#: src/octoprint/templates/settings.jinja2:56 -msgid "Communication timeout" -msgstr "Kommunikasjon tidsavbrudd" - -#: src/octoprint/templates/settings.jinja2:65 -msgid "Temperature timeout" -msgstr "Temperatur tidsavbrudd" - -#: src/octoprint/templates/settings.jinja2:74 -msgid "SD status timeout" -msgstr "Minnekort tidsavbrudd" - -#: src/octoprint/templates/settings.jinja2:83 -msgid "Connection timeout" -msgstr "Oppkoblingstidsavbrudd" - -#: src/octoprint/templates/settings.jinja2:92 -msgid "Autodetection timeout" -msgstr "Automatisk detekteringstidsavbrudd" - -#: src/octoprint/templates/settings.jinja2:103 -msgid "Log communication to serial.log (might negatively impact performance)" -msgstr "Skriv logg til serial.log (kan redusere ytelsen)" - -#: src/octoprint/templates/settings.jinja2:103 -msgid "Warning" -msgstr "Advarsel" - -#: src/octoprint/templates/settings.jinja2:115 -#: src/octoprint/templates/settings.jinja2:152 -msgid "Model" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Set as default profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Edit Profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Delete Profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:130 -msgid "Add Profile..." -msgstr "" - -#: src/octoprint/templates/settings.jinja2:146 -msgid "Identifier" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:158 -#: src/octoprint/templates/settings.jinja2:490 -msgid "Color" -msgstr "Farge" - -#: src/octoprint/templates/settings.jinja2:165 -msgid "Form Factor" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:167 -msgid "Rectangular" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:170 -msgid "Circular" -msgstr "Sirkulær" - -#: src/octoprint/templates/settings.jinja2:174 -msgid "Volume" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:176 -#: src/octoprint/templates/settings.jinja2:206 -msgid "X" -msgstr "X" - -#: src/octoprint/templates/settings.jinja2:183 -#: src/octoprint/templates/settings.jinja2:216 -msgid "Y" -msgstr "Y" - -#: src/octoprint/templates/settings.jinja2:190 -#: src/octoprint/templates/settings.jinja2:226 -msgid "Z" -msgstr "Z" - -#: src/octoprint/templates/settings.jinja2:198 -msgid "Heated Bed" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:204 -msgid "Axis" -msgstr "Akse" - -#: src/octoprint/templates/settings.jinja2:212 -#: src/octoprint/templates/settings.jinja2:222 -#: src/octoprint/templates/settings.jinja2:232 -msgid "Invert control" -msgstr "Inverter kontroller" - -#: src/octoprint/templates/settings.jinja2:236 -msgid "E" -msgstr "E" - -#: src/octoprint/templates/settings.jinja2:244 -msgid "Nozzle Diameter" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:253 -msgid "Number of Extruders" -msgstr "Antall dyser" - -#: src/octoprint/templates/settings.jinja2:259 -msgid "Extruder Offsets" -msgstr "Extruder avvik" - -#: src/octoprint/templates/settings.jinja2:278 -#: src/octoprint/templates/settings.jinja2:610 -#: src/octoprint/templates/settings.jinja2:639 -#: src/octoprint/templates/settings.jinja2:689 -msgid "Abort" -msgstr "Avbryt" - -#: src/octoprint/templates/settings.jinja2:279 -#: src/octoprint/templates/settings.jinja2:611 -#: src/octoprint/templates/settings.jinja2:640 -#: src/octoprint/templates/settings.jinja2:690 -msgid "Confirm" -msgstr "Bekreft" - -#: src/octoprint/templates/settings.jinja2:286 -msgid "Stream URL" -msgstr "Strøm URL" - -#: src/octoprint/templates/settings.jinja2:292 -msgid "Snapshot URL" -msgstr "Hurtigbilde URL" - -#: src/octoprint/templates/settings.jinja2:298 -msgid "Path to FFMPEG" -msgstr "Sti til FFMPEG" - -#: src/octoprint/templates/settings.jinja2:304 -msgid "Timelapse bitrate" -msgstr "Timelapse bitrate" - -#: src/octoprint/templates/settings.jinja2:312 -msgid "Enable OctoPrint watermark in timelapse movies" -msgstr "Aktiver OctoPrint vannmerke i timelapsefilmer" - -#: src/octoprint/templates/settings.jinja2:319 -msgid "Flip webcam horizontally" -msgstr "Inverter webcam horisontalt" - -#: src/octoprint/templates/settings.jinja2:324 -msgid "Flip webcam vertically" -msgstr "Inverter webcam vertikalt" - -#: src/octoprint/templates/settings.jinja2:335 -msgid "Enable Temperature Graph" -msgstr "Aktiver temperaturgraf" - -#: src/octoprint/templates/settings.jinja2:342 -msgid "Enable GCode Visualizer" -msgstr "Aktiver GCode framviser" - -#: src/octoprint/templates/settings.jinja2:349 -msgid "Enable SD support" -msgstr "Aktiver støtte for minnekort" - -#: src/octoprint/templates/settings.jinja2:356 -msgid "Always assume SD card is present" -msgstr "Alltid anta at minnekort er på plass" - -#: src/octoprint/templates/settings.jinja2:356 -#: src/octoprint/templates/settings.jinja2:370 -#: src/octoprint/templates/settings.jinja2:377 -msgid "Repetier" -msgstr "Repeter" - -#: src/octoprint/templates/settings.jinja2:363 -msgid "Wait for start on connect" -msgstr "Vent for start på tilkobling" - -#: src/octoprint/templates/settings.jinja2:370 -msgid "Send a checksum with every command" -msgstr "Send en kontrollsum med alle kommandoer" - -#: src/octoprint/templates/settings.jinja2:377 -#, python-format -msgid "" -"Support TargetExtr%%n/TargetBed target temperature" -" format" -msgstr "Støtte TargetExtr%%n/TargetBed mål temperatur format" - -#: src/octoprint/templates/settings.jinja2:384 -msgid "Swallow the first \"ok\" after a resend response" -msgstr "Svelg unna første \"ok\" etter svar" - -#: src/octoprint/templates/settings.jinja2:393 -msgid "Upload Folder" -msgstr "Opplastningsmappe" - -#: src/octoprint/templates/settings.jinja2:399 -msgid "Timelapse Folder" -msgstr "Timelapse mappe" - -#: src/octoprint/templates/settings.jinja2:405 -msgid "Timelapse Temp Folder" -msgstr "Timelapse midlertidig mappe" - -#: src/octoprint/templates/settings.jinja2:411 -msgid "Logs Folder" -msgstr "Loggmappe" - -#: src/octoprint/templates/settings.jinja2:417 -msgid "Watched Folder" -msgstr "Kontrollert mappe" - -#: src/octoprint/templates/settings.jinja2:427 -msgid "Extruder" -msgstr "Extruder" - -#: src/octoprint/templates/settings.jinja2:459 -msgid "RegExp" -msgstr "RegExp" - -#: src/octoprint/templates/settings.jinja2:484 -msgid "Title" -msgstr "Tittel" - -#: src/octoprint/templates/settings.jinja2:503 -msgid "Enable" -msgstr "Aktiver" - -#: src/octoprint/templates/settings.jinja2:510 -#, python-format -msgid "Allow Cross Origin Resource Sharing (CORS)" -msgstr "Tillat Cross Origin Resource Sharing (CORS)" - -#: src/octoprint/templates/settings.jinja2:515 -#: src/octoprint/templates/settings.jinja2:542 -msgid "API Key" -msgstr "API nøkkel" - -#: src/octoprint/templates/settings.jinja2:521 -#: src/octoprint/templates/settings.jinja2:679 -msgid "QR Code" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:535 -#: src/octoprint/templates/settings.jinja2:596 -#: src/octoprint/templates/settings.jinja2:625 -msgid "Active" -msgstr "Aktiv" - -#: src/octoprint/templates/settings.jinja2:536 -#: src/octoprint/templates/settings.jinja2:603 -#: src/octoprint/templates/settings.jinja2:632 -msgid "Admin" -msgstr "Admin" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Update User" -msgstr "Oppdater bruker" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Change password" -msgstr "Endre passord" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Delete user" -msgstr "Slett bruker" - -#: src/octoprint/templates/settings.jinja2:563 -#: src/octoprint/templates/settings.jinja2:570 -msgid "Add user" -msgstr "Legg til bruker" - -#: src/octoprint/templates/settings.jinja2:587 -#: src/octoprint/templates/settings.jinja2:658 -msgid "Repeat Password" -msgstr "Gjenta passord" - -#: src/octoprint/templates/settings.jinja2:618 -#, python-format -msgid "Edit user \"%(user)s\"" -msgstr "Endre bruker \"%(user)s\"" - -#: src/octoprint/templates/settings.jinja2:647 -#, python-format -msgid "Change password for user \"%(user)s\"" -msgstr "Endre passord for bruker \"%(user)s\"" - -#: src/octoprint/templates/settings.jinja2:652 -msgid "New Password" -msgstr "Nytt passord" - -#: src/octoprint/templates/settings.jinja2:667 -msgid "Current API Key" -msgstr "Nåværende API nøkkel" - -#: src/octoprint/templates/settings.jinja2:670 -msgid "N/A" -msgstr "N/A" - -#: src/octoprint/templates/settings.jinja2:709 -msgid "Modification date" -msgstr "Endret dato" - -#: src/octoprint/templates/settings.jinja2:717 -msgid "Date" -msgstr "Dato" - -#: src/octoprint/templates/settings.jinja2:756 -msgid "Save" -msgstr "Lagre" diff --git a/src/octoprint/translations/ro/LC_MESSAGES/messages.mo b/src/octoprint/translations/ro/LC_MESSAGES/messages.mo deleted file mode 100644 index e7f8bf36cd9dd7c7e14af5699a2f14f17de8cd64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21301 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 diff --git a/src/octoprint/translations/ro/LC_MESSAGES/messages.po b/src/octoprint/translations/ro/LC_MESSAGES/messages.po deleted file mode 100644 index 9292af94..00000000 --- a/src/octoprint/translations/ro/LC_MESSAGES/messages.po +++ /dev/null @@ -1,1403 +0,0 @@ -# Translations template for OctoPrint. -# Copyright (C) 2014 The OctoPrint Project -# This file is distributed under the same license as the OctoPrint project. -# -# Translators: -# 3Dmaker4U <3dmaker4u@gmail.com>, 2014 -msgid "" -msgstr "" -"Project-Id-Version: OctoPrint\n" -"Report-Msgid-Bugs-To: i18n@octoprint.org\n" -"POT-Creation-Date: 2014-12-18 14:45+0100\n" -"PO-Revision-Date: 2014-12-18 14:04+0000\n" -"Last-Translator: Gina Häußge \n" -"Language-Team: Romanian (http://www.transifex.com/projects/p/octoprint/language/ro/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 1.3\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" - -#: src/octoprint/static/js/app/dataupdater.js:52 -#: src/octoprint/static/js/app/dataupdater.js:85 -#: src/octoprint/static/js/app/helpers.js:434 -#: src/octoprint/templates/dialogs.jinja2:55 -msgid "Server is offline" -msgstr "Serverul este deconectat" - -#: src/octoprint/static/js/app/dataupdater.js:53 -msgid "" -"The server appears to be offline, at least I'm not getting any response from" -" it. I'll try to reconnect automatically over the next couple of " -"minutes, however you are welcome to try a manual reconnect anytime " -"using the button below." -msgstr "Se pare că serverul nu este connectat sau, cel puțin, mie nu-mi răspunde. Voi încerca să mă reconectez automat în următoarele două minute, dar poți încerca oricând să te reconectezi manual utilizând butonul de mai jos." - -#: src/octoprint/static/js/app/dataupdater.js:86 -msgid "" -"The server appears to be offline, at least I'm not getting any response from" -" it. I could not reconnect automatically, but you may try a" -" manual reconnect using the button below." -msgstr "Se pare că serverul nu este conectat sau, cel puțin, mie nu-mi răspunde. Eu nu pot să mă reconectez automat, dar poți încerca să te reconectezi manual utilizând butonul de mai jos." - -#: src/octoprint/static/js/app/dataupdater.js:158 -#: src/octoprint/static/js/app/dataupdater.js:199 -#, python-format -msgid "Slicing ... (%(percentage)d%%)" -msgstr "" - -#: src/octoprint/static/js/app/dataupdater.js:187 -msgid "Rendering timelapse" -msgstr "Redare înregistrare rapidă" - -#: src/octoprint/static/js/app/dataupdater.js:187 -#, python-format -msgid "Now rendering timelapse %(movie_basename)s" -msgstr "Acum se redă înregistrarea rapidă %(movie_basename)s" - -#: src/octoprint/static/js/app/dataupdater.js:189 -msgid "Timelapse ready" -msgstr "Înregistrarea rapidă este gata" - -#: src/octoprint/static/js/app/dataupdater.js:189 -#, python-format -msgid "New timelapse %(movie_basename)s is done rendering." -msgstr "Redarea noii înregistrări rapide %(movie_basename)s s-a terminat." - -#: src/octoprint/static/js/app/dataupdater.js:192 -#, python-format -msgid "" -"Rendering of timelapse %(movie_basename)s failed with return code " -"%(returncode)s" -msgstr "" - -#: src/octoprint/static/js/app/dataupdater.js:194 -msgid "Rendering failed" -msgstr "Redarea a eșuat" - -#: src/octoprint/static/js/app/dataupdater.js:201 -msgid "Slicing ..." -msgstr "Se feliază..." - -#: src/octoprint/static/js/app/dataupdater.js:207 -msgid "Slicing done" -msgstr "Feliere terminată" - -#: src/octoprint/static/js/app/dataupdater.js:207 -#, python-format -msgid "Sliced %(stl)s to %(gcode)s, took %(time).2f seconds" -msgstr "S-a feliat %(stl)s ca %(gcode)s în %(time).2f secunde" - -#: src/octoprint/static/js/app/dataupdater.js:228 -#, python-format -msgid "Could not slice %(stl)s to %(gcode)s: %(reason)s" -msgstr "Nu s-a putut felia %(stl)s în %(gcode)s: %(reason)s" - -#: src/octoprint/static/js/app/dataupdater.js:229 -msgid "Slicing failed" -msgstr "Felierea a eșuat" - -#: src/octoprint/static/js/app/dataupdater.js:238 -msgid "Streaming ..." -msgstr "Se transmite..." - -#: src/octoprint/static/js/app/dataupdater.js:244 -msgid "Streaming done" -msgstr "Transmiterea s-a terminat" - -#: src/octoprint/static/js/app/dataupdater.js:245 -#, python-format -msgid "Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds" -msgstr "Transmiterea %(local)s către %(remote)s pe SD, a durat %(time).2f secunde" - -#: src/octoprint/static/js/app/helpers.js:355 -#, python-format -msgid "%(hour)02d:%(minute)02d:%(second)02d" -msgstr "%(hour)02d:%(minute)02d:%(second)02d" - -#: src/octoprint/static/js/app/helpers.js:375 -msgid "YYYY-MM-DD HH:mm" -msgstr "DD.MM.YYYY HH.mm" - -#: src/octoprint/static/js/app/helpers.js:393 -#: src/octoprint/static/js/app/helpers.js:398 -msgid "off" -msgstr "oprit" - -#: src/octoprint/static/js/app/main.js:17 -msgid "Offline" -msgstr "Neconectat" - -#: src/octoprint/static/js/app/main.js:18 -msgid "Opening serial port" -msgstr "Se deschide portul serial" - -#: src/octoprint/static/js/app/main.js:19 -msgid "Detecting serial port" -msgstr "Se detectează portul serial" - -#: src/octoprint/static/js/app/main.js:20 -msgid "Detecting baudrate" -msgstr "Se detectează viteza de transfer" - -#: src/octoprint/static/js/app/main.js:21 -msgid "Connecting" -msgstr "Se conectează" - -#: src/octoprint/static/js/app/main.js:22 -msgid "Operational" -msgstr "Funcțional" - -#: src/octoprint/static/js/app/main.js:23 -msgid "Printing from SD" -msgstr "Se imprimă de pe SD" - -#: src/octoprint/static/js/app/main.js:24 -msgid "Sending file to SD" -msgstr "Se transmite fișierul către SD" - -#: src/octoprint/static/js/app/main.js:25 -msgid "Printing" -msgstr "Se imprimă" - -#: src/octoprint/static/js/app/main.js:26 -msgid "Paused" -msgstr "În pauză" - -#: src/octoprint/static/js/app/main.js:27 -msgid "Closed" -msgstr "Închis" - -#: src/octoprint/static/js/app/main.js:28 -msgid "Transfering file to SD" -msgstr "Se transferă fișierul pe SD" - -#: src/octoprint/static/js/app/main.js:184 -msgid "" -"Could not upload the file. Make sure that it is a GCODE file and has the " -"extension \".gcode\" or \".gco\" or that it is an STL file with the " -"extension \".stl\" and slicing support is enabled and configured." -msgstr "Nu pot încărca fișierul. Asigură-te că este un fișier GCODE și că are extensia \".gcode\" sau \".gco\" sau că este un fișier STL cu extensia \".stl\" și că felierea este activată și configurată." - -#: src/octoprint/static/js/app/main.js:200 -msgid "Uploading ..." -msgstr "Se încarcă..." - -#: src/octoprint/static/js/app/main.js:203 -msgid "Saving ..." -msgstr "Se salvează..." - -#: src/octoprint/static/js/app/viewmodels/appearance.js:9 -#: src/octoprint/static/js/app/viewmodels/appearance.js:11 -#: src/octoprint/static/js/app/viewmodels/appearance.js:16 -#: src/octoprint/static/js/app/viewmodels/appearance.js:18 -msgid "OctoPrint" -msgstr "OctoPrint" - -#: src/octoprint/static/js/app/viewmodels/connection.js:41 -#: src/octoprint/templates/index.jinja2:144 -msgid "Connect" -msgstr "Connectare" - -#: src/octoprint/static/js/app/viewmodels/connection.js:43 -msgid "Disconnect" -msgstr "Deconectare" - -#: src/octoprint/static/js/app/viewmodels/control.js:42 -#: src/octoprint/static/js/app/viewmodels/files.js:298 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -#: src/octoprint/static/js/app/viewmodels/gcode.js:432 -#: src/octoprint/static/js/app/viewmodels/printerstate.js:166 -#: src/octoprint/static/js/app/viewmodels/temperature.js:56 -msgid "Tool" -msgstr "Unealtă" - -#: src/octoprint/static/js/app/viewmodels/control.js:49 -#: src/octoprint/static/js/app/viewmodels/temperature.js:68 -msgid "Hotend" -msgstr "Hotend" - -#: src/octoprint/static/js/app/viewmodels/files.js:293 -#: src/octoprint/static/js/app/viewmodels/files.js:298 -msgid "Filament" -msgstr "Filament" - -#: src/octoprint/static/js/app/viewmodels/files.js:302 -msgid "Estimated Print Time" -msgstr "Timp de imprimare estimat" - -#: src/octoprint/static/js/app/viewmodels/files.js:305 -msgid "Last Printed" -msgstr "Ultima dată imprimat" - -#: src/octoprint/static/js/app/viewmodels/files.js:307 -msgid "Last Print Time" -msgstr "Ultima imprimare a durat" - -#: src/octoprint/static/js/app/viewmodels/firstrun.js:37 -msgid "" -"If you disable Access Control and your OctoPrint " -"installation is accessible from the internet, your printer will be " -"accessible by everyone - that also includes the bad guys!" -msgstr "Dacă dezactivezi controlul accesului și aplicația ta OctoPrint este accesibilă din Internet, imprimanta ta va putea fi accesată de oricine - asta incluzând și tipii răi!" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:13 -msgid "Loading..." -msgstr "Se încarcă" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:17 -msgid "Analyzing..." -msgstr "Se analizează..." - -#: src/octoprint/static/js/app/viewmodels/gcode.js:21 -msgid "Analyzed" -msgstr "Analizat" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:395 -msgid "Model size" -msgstr "Mărimea modelului" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:397 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -msgid "Total filament used" -msgstr "Filament utilizat în total" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:397 -#: src/octoprint/static/js/app/viewmodels/gcode.js:400 -#: src/octoprint/static/js/app/viewmodels/gcode.js:404 -msgid "mm" -msgstr "mm" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:403 -msgid "Estimated print time" -msgstr "Timp de imprimare estimat" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:404 -msgid "Estimated layer height" -msgstr "Înălțimea stratului estimată" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "Layer count" -msgstr "Număr de straturi" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "printed" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:405 -msgid "visited" -msgstr "vizitat" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:424 -msgid "Layer number" -msgstr "Numărul stratului" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:425 -msgid "Layer height" -msgstr "Înălțimea stratului" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:426 -msgid "GCODE commands in layer" -msgstr "comenzi GCODE în strat" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:429 -#: src/octoprint/static/js/app/viewmodels/gcode.js:432 -msgid "Filament used by layer" -msgstr "Filament utilizat în strat" - -#: src/octoprint/static/js/app/viewmodels/gcode.js:436 -msgid "Print time for layer" -msgstr "Timp de imprimare pentru strat" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:15 -#: src/octoprint/templates/index.jinja2:99 -#: src/octoprint/templates/index.jinja2:110 -msgid "Login" -msgstr "Conectare" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:70 -msgid "Login successful" -msgstr "Conectare reușită" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:70 -#, python-format -msgid "You are now logged in as \"%(username)s\"" -msgstr "Acum ești conectat ca \"%(username)s\"" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:74 -msgid "Login failed" -msgstr "Conectare eșuată" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:74 -msgid "User unknown or wrong password" -msgstr "Utilizator necunoscut sau parolă greșită" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:84 -msgid "Logout successful" -msgstr "Deconectare reușită" - -#: src/octoprint/static/js/app/viewmodels/loginstate.js:84 -msgid "You are now logged out" -msgstr "Acum ești deconectat" - -#: src/octoprint/static/js/app/viewmodels/navigation.js:17 -#, python-format -msgid "The command \"%(command)s\" executed successfully" -msgstr "Comanda \"%(command)s\" a fost executată cu succes" - -#: src/octoprint/static/js/app/viewmodels/navigation.js:20 -#, python-format -msgid "The command \"%(command)s\" could not be executed." -msgstr "Comanda \"%(command)s\" nu a putut fi executată." - -#: src/octoprint/static/js/app/viewmodels/navigation.js:22 -msgid "Error" -msgstr "Eroare" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:84 -#: src/octoprint/static/js/app/viewmodels/settings.js:16 -#: src/octoprint/static/js/app/viewmodels/settings.js:43 -msgid "default" -msgstr "implicit" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:85 -#: src/octoprint/static/js/app/viewmodels/settings.js:17 -#: src/octoprint/static/js/app/viewmodels/settings.js:29 -msgid "red" -msgstr "roșu" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:86 -#: src/octoprint/static/js/app/viewmodels/settings.js:18 -#: src/octoprint/static/js/app/viewmodels/settings.js:31 -msgid "orange" -msgstr "portocaliu" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:87 -#: src/octoprint/static/js/app/viewmodels/settings.js:19 -#: src/octoprint/static/js/app/viewmodels/settings.js:33 -msgid "yellow" -msgstr "galben" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:88 -#: src/octoprint/static/js/app/viewmodels/settings.js:20 -#: src/octoprint/static/js/app/viewmodels/settings.js:35 -msgid "green" -msgstr "verde" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:89 -#: src/octoprint/static/js/app/viewmodels/settings.js:21 -#: src/octoprint/static/js/app/viewmodels/settings.js:37 -msgid "blue" -msgstr "albastru" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:90 -#: src/octoprint/static/js/app/viewmodels/settings.js:23 -#: src/octoprint/static/js/app/viewmodels/settings.js:41 -msgid "black" -msgstr "negru" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:245 -msgid "Add Printer Profile" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:245 -#, python-format -msgid "Edit Printer Profile \"%(name)s\"" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:33 -msgid "Restarts the print job from the beginning" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:34 -msgid "Starts the print job" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:35 -msgid "Resumes the print job" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:36 -msgid "Pauses the print job" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:69 -msgid "Calculating..." -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:82 -msgid "Continue" -msgstr "Continuare" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:84 -#: src/octoprint/templates/index.jinja2:171 -msgid "Pause" -msgstr "Pauză" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:95 -#: src/octoprint/templates/index.jinja2:570 -msgid "On Z Change" -msgstr "La schimbarea Z" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:97 -#: src/octoprint/templates/index.jinja2:571 -msgid "Timed" -msgstr "Temporizat" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:97 -#: src/octoprint/templates/index.jinja2:577 -#: src/octoprint/templates/index.jinja2:584 -msgid "sec" -msgstr "sec" - -#: src/octoprint/static/js/app/viewmodels/printerstate.js:205 -msgid "This will restart the print job from the beginning." -msgstr "Se va relua imprimarea de la început." - -#: src/octoprint/static/js/app/viewmodels/settings.js:22 -#: src/octoprint/static/js/app/viewmodels/settings.js:39 -msgid "violet" -msgstr "violet" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:24 -msgid "Do nothing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:25 -msgid "Select for printing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:26 -msgid "Start printing" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/slicing.js:33 -#, python-format -msgid "Slicing %(filename)s" -msgstr "" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:22 -#: src/octoprint/static/js/app/viewmodels/temperature.js:74 -#: src/octoprint/templates/settings.jinja2:428 -msgid "Bed" -msgstr "Masă" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:113 -msgid "just now" -msgstr "chiar acum" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:115 -msgid "min" -msgstr "min" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:255 -#: src/octoprint/templates/index.jinja2:308 -msgid "Actual" -msgstr "Efectiv" - -#: src/octoprint/static/js/app/viewmodels/temperature.js:260 -#: src/octoprint/templates/index.jinja2:309 -msgid "Target" -msgstr "Țintă" - -#: src/octoprint/templates/dialogs.jinja2:7 -msgid "" -"Please configure which slicer and which slicing profile to use and name the " -"GCode file to slice to below, or click \"Cancel\" if you do not wish to " -"slice the file now." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:10 -msgid "Slicer" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:12 -msgid "Select a slicer..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:16 -msgid "Slicing Profile" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:18 -msgid "Select a slicing profile..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:22 -#: src/octoprint/templates/index.jinja2:136 -msgid "Printer Profile" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:24 -msgid "Select a printer profile..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:28 -msgid "GCode Filename" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:37 -msgid "After slicing..." -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:45 -#: src/octoprint/templates/dialogs.jinja2:90 -#: src/octoprint/templates/index.jinja2:172 -#: src/octoprint/templates/settings.jinja2:755 -msgid "Cancel" -msgstr "Abandonare" - -#: src/octoprint/templates/dialogs.jinja2:46 -#: src/octoprint/templates/index.jinja2:243 -msgid "Slice" -msgstr "" - -#: src/octoprint/templates/dialogs.jinja2:58 -msgid "Attempt to reconnect" -msgstr "Încercare de reconectare" - -#: src/octoprint/templates/dialogs.jinja2:69 -msgid "Upload locally" -msgstr "Încărcare locală" - -#: src/octoprint/templates/dialogs.jinja2:71 -#: src/octoprint/templates/index.jinja2:264 -msgid "Upload to SD" -msgstr "Încărcare pe SD" - -#: src/octoprint/templates/dialogs.jinja2:71 -msgid "SD not initialized" -msgstr "SD nu este inițializat" - -#: src/octoprint/templates/dialogs.jinja2:74 -#: src/octoprint/templates/index.jinja2:259 -#: src/octoprint/templates/index.jinja2:270 -msgid "Upload" -msgstr "Încărcare" - -#: src/octoprint/templates/dialogs.jinja2:83 -msgid "Are you sure?" -msgstr "Ești sigur?" - -#: src/octoprint/templates/dialogs.jinja2:87 -msgid "Are you sure you want to proceed?" -msgstr "Ești sigur că vrei să mergi mai departe?" - -#: src/octoprint/templates/dialogs.jinja2:91 -msgid "Proceed" -msgstr "Continuare" - -#: src/octoprint/templates/dialogs.jinja2:97 -msgid "Configure Access Control" -msgstr "Configurare control acces" - -#: src/octoprint/templates/dialogs.jinja2:100 -msgid "" -"

\n" -" Please read the following, it is very important for your printer's health!\n" -"

\n" -"

\n" -" OctoPrint by default now ships with Access Control enabled, meaning you won't be able to do anything with the\n" -" printer unless you login first as a configured user. This is to prevent strangers - possibly with\n" -" malicious intent - to gain access to your printer via the internet or another untrustworthy network\n" -" and using it in such a way that it is damaged or worse (i.e. causes a fire).\n" -"

\n" -"

\n" -" It looks like you haven't configured access control yet. Please set up an username and password for the\n" -" initial administrator account who will have full access to both the printer and OctoPrint's settings, then click\n" -" on \"Keep Access Control Enabled\":\n" -"

" -msgstr "

\nTe rog să citești în continuare, este foarte important pentru siguranța imprimantei tale!\n

\n

\nOctoPrint este livrat acum cu controlul accesului activat implicit, ceea ce înseamnă că nu vei putea face nimic cu\nimprimanta, dacă nu te vei conecta mai întâi ca un utilizator declarat. Asta este pentru a împiedica persoanele străine - având poate\nintenții răuvoitoare - să acceseze imprimanta ta din Internet sau prin alte rețele nesigure\nși să o utilizeze într-un mod care să o poată deteriora sau și mai rău (de exemplu să declanșeze un incendiu).\n

\n

\nSe pare că nu ai configurat încă modul de control al accesului. Te rog stabilește un nume de utilizator și o parolă pentru \ncontul inițial de administrator, care va avea acces deplin la configurațiile imprimantei și OctoPrint, apoi apasă \n\"Menține controlul accesului activat\":\n

" - -#: src/octoprint/templates/dialogs.jinja2:116 -#: src/octoprint/templates/index.jinja2:103 -#: src/octoprint/templates/index.jinja2:104 -#: src/octoprint/templates/settings.jinja2:575 -msgid "Username" -msgstr "Numele utilizatorului" - -#: src/octoprint/templates/dialogs.jinja2:122 -#: src/octoprint/templates/index.jinja2:105 -#: src/octoprint/templates/index.jinja2:106 -#: src/octoprint/templates/settings.jinja2:581 -msgid "Password" -msgstr "Parolă" - -#: src/octoprint/templates/dialogs.jinja2:128 -msgid "Confirm Password" -msgstr "Confirmare parolă" - -#: src/octoprint/templates/dialogs.jinja2:131 -#: src/octoprint/templates/settings.jinja2:590 -#: src/octoprint/templates/settings.jinja2:661 -msgid "Passwords do not match" -msgstr "Parolele nu se potrivesc" - -#: src/octoprint/templates/dialogs.jinja2:135 -msgid "" -"

\n" -" Note: In case that your OctoPrint installation is only accessible from within a trustworthy network and you don't\n" -" need Access Control for other reasons, you may alternatively disable Access Control. You should only\n" -" do this if you are absolutely certain that only people you know and trust will be able to connect to it.\n" -"

\n" -"

\n" -" Do NOT underestimate the risk of an unsecured access from the internet to your printer!\n" -"

" -msgstr "

\nNotă: În cazul în care aplicația ta OctoPrint este accesibilă doar dintr-o rețea sigură și nu\nai nevoie de controlul accesului pentru alte mootive, poți să dezactivezi controlul accesului. Îți recomand asta\nnumai dacă ești absolut sigur că se vor putea conecta doar oameni pe care îi cunoști și în care ai încredere.\n

\n

\nNU subestima riscul pe care-l prezintă accesul nesecurizat din Internet la imprimanta ta!\n

" - -#: src/octoprint/templates/dialogs.jinja2:145 -msgid "Disable Access Control" -msgstr "Dezactivează controlul accesului" - -#: src/octoprint/templates/dialogs.jinja2:146 -msgid "Keep Access Control Enabled" -msgstr "Menține controlul accesului activat" - -#: src/octoprint/templates/index.jinja2:82 -msgid "Settings" -msgstr "Configurații" - -#: src/octoprint/templates/index.jinja2:88 -msgid "System" -msgstr "Sistem" - -#: src/octoprint/templates/index.jinja2:108 -msgid "Remember me" -msgstr "Ține-mă minte" - -#: src/octoprint/templates/index.jinja2:113 -msgid "Change Password" -msgstr "Schimbă parola" - -#: src/octoprint/templates/index.jinja2:114 -msgid "Logout" -msgstr "Deconectare" - -#: src/octoprint/templates/index.jinja2:128 -msgid "Connection" -msgstr "Conexiune" - -#: src/octoprint/templates/index.jinja2:132 -#: src/octoprint/templates/settings.jinja2:37 -msgid "Serial Port" -msgstr "Port serial" - -#: src/octoprint/templates/index.jinja2:134 -#: src/octoprint/templates/settings.jinja2:43 -msgid "Baudrate" -msgstr "Viteză de transfer" - -#: src/octoprint/templates/index.jinja2:139 -msgid "Save connection settings" -msgstr "Salvare configurație conexiune" - -#: src/octoprint/templates/index.jinja2:142 -msgid "Auto-connect on server startup" -msgstr "Conectare automată la pornirea serverului" - -#: src/octoprint/templates/index.jinja2:150 -msgid "State" -msgstr "Stare" - -#: src/octoprint/templates/index.jinja2:154 -msgid "Machine State" -msgstr "Starea mașinii" - -#: src/octoprint/templates/index.jinja2:155 -msgid "File" -msgstr "Fișier" - -#: src/octoprint/templates/index.jinja2:156 -#: src/octoprint/templates/index.jinja2:293 -msgid "Timelapse" -msgstr "Înregistrare rapidă" - -#: src/octoprint/templates/index.jinja2:160 -msgid "Approx. Total Print Time" -msgstr "Timp de imprimare total estimat" - -#: src/octoprint/templates/index.jinja2:161 -msgid "Print Time" -msgstr "Timp de imprimare" - -#: src/octoprint/templates/index.jinja2:162 -msgid "Print Time Left" -msgstr "Timp de imprimare rămas" - -#: src/octoprint/templates/index.jinja2:163 -msgid "Printed" -msgstr "Imprimat" - -#: src/octoprint/templates/index.jinja2:170 -msgid "Restart" -msgstr "Reluare" - -#: src/octoprint/templates/index.jinja2:170 -msgid "Print" -msgstr "Imprimare" - -#: src/octoprint/templates/index.jinja2:171 -msgid "Resume" -msgstr "" - -#: src/octoprint/templates/index.jinja2:172 -msgid "Cancels the print job" -msgstr "" - -#: src/octoprint/templates/index.jinja2:179 -msgid "Files" -msgstr "Fișiere" - -#: src/octoprint/templates/index.jinja2:186 -msgid "Sort by name" -msgstr "Sortare după nume" - -#: src/octoprint/templates/index.jinja2:186 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "ascending" -msgstr "crescător" - -#: src/octoprint/templates/index.jinja2:187 -msgid "Sort by upload date" -msgstr "Sortare după data încărcării" - -#: src/octoprint/templates/index.jinja2:187 -#: src/octoprint/templates/index.jinja2:188 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "descending" -msgstr "descrescător" - -#: src/octoprint/templates/index.jinja2:188 -msgid "Sort by file size" -msgstr "Sortare după mărimea fișierului" - -#: src/octoprint/templates/index.jinja2:190 -msgid "Only show GCode files" -msgstr "" - -#: src/octoprint/templates/index.jinja2:191 -msgid "Only show STL files" -msgstr "" - -#: src/octoprint/templates/index.jinja2:194 -msgid "Only show files stored locally" -msgstr "Arată doar fișierele stocate local" - -#: src/octoprint/templates/index.jinja2:195 -msgid "Only show files stored on SD" -msgstr "Arată doar fișierele stocate pe SD" - -#: src/octoprint/templates/index.jinja2:198 -msgid "Hide successfully printed files" -msgstr "Ascunde fișierele imprimate cu succes" - -#: src/octoprint/templates/index.jinja2:208 -msgid "Initialize SD card" -msgstr "Inițializare card SD" - -#: src/octoprint/templates/index.jinja2:209 -msgid "Refresh SD files" -msgstr "Reîmprospătează fișierele SD" - -#: src/octoprint/templates/index.jinja2:210 -msgid "Release SD card" -msgstr "Eliberează cardul SD" - -#: src/octoprint/templates/index.jinja2:218 -msgid "Search..." -msgstr "Se caută..." - -#: src/octoprint/templates/index.jinja2:225 -#: src/octoprint/templates/index.jinja2:239 -msgid "Uploaded" -msgstr "Încărcat" - -#: src/octoprint/templates/index.jinja2:226 -#: src/octoprint/templates/index.jinja2:240 -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/index.jinja2:608 -#: src/octoprint/templates/settings.jinja2:709 -#: src/octoprint/templates/settings.jinja2:716 -msgid "Size" -msgstr "Mărime" - -#: src/octoprint/templates/index.jinja2:230 -msgid "Download" -msgstr "Descărcare" - -#: src/octoprint/templates/index.jinja2:231 -#: src/octoprint/templates/index.jinja2:242 -msgid "Remove" -msgstr "Ștergere" - -#: src/octoprint/templates/index.jinja2:232 -msgid "Load" -msgstr "Încărcare" - -#: src/octoprint/templates/index.jinja2:233 -msgid "Load and Print" -msgstr "Încărcare și imprimare" - -#: src/octoprint/templates/index.jinja2:252 -msgid "Free" -msgstr "Liber" - -#: src/octoprint/templates/index.jinja2:279 -msgid "Hint: You can also drag and drop files on this page to upload them." -msgstr "Indiciu: Poți trage și lăsa fișierele pe această pagină pentru a le încărca." - -#: src/octoprint/templates/index.jinja2:289 -msgid "Temperature" -msgstr "Temperatură" - -#: src/octoprint/templates/index.jinja2:290 -msgid "Control" -msgstr "Control" - -#: src/octoprint/templates/index.jinja2:291 -msgid "GCode Viewer" -msgstr "Vizualizare GCode" - -#: src/octoprint/templates/index.jinja2:292 -msgid "Terminal" -msgstr "Terminal" - -#: src/octoprint/templates/index.jinja2:310 -msgid "Offset" -msgstr "Decalaj" - -#: src/octoprint/templates/index.jinja2:326 -#: src/octoprint/templates/index.jinja2:348 -msgid "Set" -msgstr "Configurare" - -#: src/octoprint/templates/index.jinja2:338 -#: src/octoprint/templates/index.jinja2:569 -msgid "Off" -msgstr "Oprit" - -#: src/octoprint/templates/index.jinja2:406 -msgid "Select Tool..." -msgstr "Selectare unealtă..." - -#: src/octoprint/templates/index.jinja2:417 -msgid "Extrude" -msgstr "Extrudare" - -#: src/octoprint/templates/index.jinja2:418 -msgid "Retract" -msgstr "Retragere" - -#: src/octoprint/templates/index.jinja2:423 -msgid "General" -msgstr "General" - -#: src/octoprint/templates/index.jinja2:425 -msgid "Motors off" -msgstr "Oprire motoare" - -#: src/octoprint/templates/index.jinja2:426 -msgid "Fans on" -msgstr "Pornire ventilatoare" - -#: src/octoprint/templates/index.jinja2:427 -msgid "Fans off" -msgstr "Oprire ventilatoare" - -#: src/octoprint/templates/index.jinja2:491 -msgid "Sync with job progress" -msgstr "Sincronizare cu stadiul lucrării" - -#: src/octoprint/templates/index.jinja2:496 -msgid "Center viewport on model" -msgstr "Centrare ecran pe model" - -#: src/octoprint/templates/index.jinja2:499 -msgid "Zoom in on model" -msgstr "Mărire model" - -#: src/octoprint/templates/index.jinja2:505 -msgid "Show moves" -msgstr "Vizualizare mișcări" - -#: src/octoprint/templates/index.jinja2:508 -msgid "Show retracts" -msgstr "Vizualizare retgrageri" - -#: src/octoprint/templates/index.jinja2:514 -msgid "Also show previous layer" -msgstr "Vizualizare strat anterior" - -#: src/octoprint/templates/index.jinja2:517 -msgid "Also show next layer" -msgstr "Vizualizare strat următor" - -#: src/octoprint/templates/index.jinja2:522 -msgid "Reload" -msgstr "Reîncărcare" - -#: src/octoprint/templates/index.jinja2:549 -msgid "Autoscroll" -msgstr "Defilare automată" - -#: src/octoprint/templates/index.jinja2:559 -msgid "Send" -msgstr "Trimitere" - -#: src/octoprint/templates/index.jinja2:565 -msgid "Timelapse Configuration" -msgstr "Configurare înregistrare rapidă" - -#: src/octoprint/templates/index.jinja2:567 -msgid "Timelapse Mode" -msgstr "Mod înregistrare rapidă" - -#: src/octoprint/templates/index.jinja2:574 -msgid "Timelapse post roll (in rendered seconds)" -msgstr "Întârziere oprire înregistrare automată (în secunde vizualizate)" - -#: src/octoprint/templates/index.jinja2:581 -msgid "Interval" -msgstr "Interval" - -#: src/octoprint/templates/index.jinja2:590 -msgid "Save as default" -msgstr "Salvare ca valori implicite" - -#: src/octoprint/templates/index.jinja2:595 -msgid "Save config" -msgstr "Salvare configurație" - -#: src/octoprint/templates/index.jinja2:599 -msgid "Finished Timelapses" -msgstr "Înregistrări rapide finalizate" - -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/settings.jinja2:709 -msgid "Sort by" -msgstr "Sortare după" - -#: src/octoprint/templates/index.jinja2:602 -#: src/octoprint/templates/index.jinja2:607 -#: src/octoprint/templates/settings.jinja2:114 -#: src/octoprint/templates/settings.jinja2:140 -#: src/octoprint/templates/settings.jinja2:458 -#: src/octoprint/templates/settings.jinja2:534 -#: src/octoprint/templates/settings.jinja2:709 -#: src/octoprint/templates/settings.jinja2:715 -msgid "Name" -msgstr "Nume" - -#: src/octoprint/templates/index.jinja2:602 -msgid "Creation date" -msgstr "Dată creare" - -#: src/octoprint/templates/index.jinja2:609 -#: src/octoprint/templates/settings.jinja2:116 -#: src/octoprint/templates/settings.jinja2:537 -#: src/octoprint/templates/settings.jinja2:718 -msgid "Action" -msgstr "Acțiune" - -#: src/octoprint/templates/index.jinja2:638 -msgid "Version" -msgstr "Versiune" - -#: src/octoprint/templates/index.jinja2:641 -msgid "Homepage" -msgstr "Pagina de gardă" - -#: src/octoprint/templates/index.jinja2:642 -msgid "Sourcecode" -msgstr "Cod sursă" - -#: src/octoprint/templates/index.jinja2:643 -msgid "Documentation" -msgstr "Documentație" - -#: src/octoprint/templates/index.jinja2:644 -msgid "Bugs and Requests" -msgstr "Probleme și solicitări" - -#: src/octoprint/templates/settings.jinja2:4 -msgid "OctoPrint Settings" -msgstr "Configurare OctoPrint" - -#: src/octoprint/templates/settings.jinja2:9 -msgid "Printer" -msgstr "Imprimantă" - -#: src/octoprint/templates/settings.jinja2:10 -msgid "Serial Connection" -msgstr "Conexiune serială" - -#: src/octoprint/templates/settings.jinja2:11 -#: src/octoprint/templates/settings.jinja2:110 -msgid "Printer Profiles" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:12 -msgid "Temperatures" -msgstr "Temperaturi" - -#: src/octoprint/templates/settings.jinja2:13 -msgid "Terminal filters" -msgstr "Filtre pentru terminal" - -#: src/octoprint/templates/settings.jinja2:14 -#: src/octoprint/templates/settings.jinja2:15 -msgid "Features" -msgstr "Caracteristici" - -#: src/octoprint/templates/settings.jinja2:16 -msgid "Webcam" -msgstr "Webcam" - -#: src/octoprint/templates/settings.jinja2:17 -msgid "Access Control" -msgstr "Control acces" - -#: src/octoprint/templates/settings.jinja2:18 -msgid "API" -msgstr "API" - -#: src/octoprint/templates/settings.jinja2:20 -msgid "Folders" -msgstr "Directoare" - -#: src/octoprint/templates/settings.jinja2:21 -msgid "Appearance" -msgstr "Aspect" - -#: src/octoprint/templates/settings.jinja2:22 -#: src/octoprint/templates/settings.jinja2:705 -msgid "Logs" -msgstr "Înregistrări activitate" - -#: src/octoprint/templates/settings.jinja2:51 -msgid "Auto-connect to printer on server start" -msgstr "Conectare automată a imprimantei la pornirea serverului" - -#: src/octoprint/templates/settings.jinja2:56 -msgid "Communication timeout" -msgstr "Expirare temporizare comunicație" - -#: src/octoprint/templates/settings.jinja2:65 -msgid "Temperature timeout" -msgstr "Expirare temporizare temperatură" - -#: src/octoprint/templates/settings.jinja2:74 -msgid "SD status timeout" -msgstr "Expirare temporizare stare SD" - -#: src/octoprint/templates/settings.jinja2:83 -msgid "Connection timeout" -msgstr "Expirare temporizare conexiune" - -#: src/octoprint/templates/settings.jinja2:92 -msgid "Autodetection timeout" -msgstr "Expirare temporizare autodetectare" - -#: src/octoprint/templates/settings.jinja2:103 -msgid "Log communication to serial.log (might negatively impact performance)" -msgstr "Înregistrare comunicație în serial.log (poate afecta negativ performanța)" - -#: src/octoprint/templates/settings.jinja2:103 -msgid "Warning" -msgstr "Avertizare" - -#: src/octoprint/templates/settings.jinja2:115 -#: src/octoprint/templates/settings.jinja2:152 -msgid "Model" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Set as default profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Edit Profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:124 -msgid "Delete Profile" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:130 -msgid "Add Profile..." -msgstr "" - -#: src/octoprint/templates/settings.jinja2:146 -msgid "Identifier" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:158 -#: src/octoprint/templates/settings.jinja2:490 -msgid "Color" -msgstr "Culoare" - -#: src/octoprint/templates/settings.jinja2:165 -msgid "Form Factor" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:167 -msgid "Rectangular" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:170 -msgid "Circular" -msgstr "Circular" - -#: src/octoprint/templates/settings.jinja2:174 -msgid "Volume" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:176 -#: src/octoprint/templates/settings.jinja2:206 -msgid "X" -msgstr "X" - -#: src/octoprint/templates/settings.jinja2:183 -#: src/octoprint/templates/settings.jinja2:216 -msgid "Y" -msgstr "Y" - -#: src/octoprint/templates/settings.jinja2:190 -#: src/octoprint/templates/settings.jinja2:226 -msgid "Z" -msgstr "Z" - -#: src/octoprint/templates/settings.jinja2:198 -msgid "Heated Bed" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:204 -msgid "Axis" -msgstr "Axă" - -#: src/octoprint/templates/settings.jinja2:212 -#: src/octoprint/templates/settings.jinja2:222 -#: src/octoprint/templates/settings.jinja2:232 -msgid "Invert control" -msgstr "Inversare comandă" - -#: src/octoprint/templates/settings.jinja2:236 -msgid "E" -msgstr "E" - -#: src/octoprint/templates/settings.jinja2:244 -msgid "Nozzle Diameter" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:253 -msgid "Number of Extruders" -msgstr "Număr de extrudere" - -#: src/octoprint/templates/settings.jinja2:259 -msgid "Extruder Offsets" -msgstr "Decalaje extruder" - -#: src/octoprint/templates/settings.jinja2:278 -#: src/octoprint/templates/settings.jinja2:610 -#: src/octoprint/templates/settings.jinja2:639 -#: src/octoprint/templates/settings.jinja2:689 -msgid "Abort" -msgstr "Abandonare" - -#: src/octoprint/templates/settings.jinja2:279 -#: src/octoprint/templates/settings.jinja2:611 -#: src/octoprint/templates/settings.jinja2:640 -#: src/octoprint/templates/settings.jinja2:690 -msgid "Confirm" -msgstr "Confirmare" - -#: src/octoprint/templates/settings.jinja2:286 -msgid "Stream URL" -msgstr "URL flux video" - -#: src/octoprint/templates/settings.jinja2:292 -msgid "Snapshot URL" -msgstr "URL imagine capturată" - -#: src/octoprint/templates/settings.jinja2:298 -msgid "Path to FFMPEG" -msgstr "Cale către FFMPEG" - -#: src/octoprint/templates/settings.jinja2:304 -msgid "Timelapse bitrate" -msgstr "Viteză înregistrare rapidă" - -#: src/octoprint/templates/settings.jinja2:312 -msgid "Enable OctoPrint watermark in timelapse movies" -msgstr "Activează marcajul OctoPrint în înregistrările rapide" - -#: src/octoprint/templates/settings.jinja2:319 -msgid "Flip webcam horizontally" -msgstr "Rotește camera pe orizontală" - -#: src/octoprint/templates/settings.jinja2:324 -msgid "Flip webcam vertically" -msgstr "Rotește camera pe verticală" - -#: src/octoprint/templates/settings.jinja2:335 -msgid "Enable Temperature Graph" -msgstr "Activează graficul temperaturii" - -#: src/octoprint/templates/settings.jinja2:342 -msgid "Enable GCode Visualizer" -msgstr "Activează vizualizarea GCode" - -#: src/octoprint/templates/settings.jinja2:349 -msgid "Enable SD support" -msgstr "Activează suportul pentru SD" - -#: src/octoprint/templates/settings.jinja2:356 -msgid "Always assume SD card is present" -msgstr "Consideră întotdeauna cardul SD prezent" - -#: src/octoprint/templates/settings.jinja2:356 -#: src/octoprint/templates/settings.jinja2:370 -#: src/octoprint/templates/settings.jinja2:377 -msgid "Repetier" -msgstr "Repetier" - -#: src/octoprint/templates/settings.jinja2:363 -msgid "Wait for start on connect" -msgstr "Așteaptă start la conectare" - -#: src/octoprint/templates/settings.jinja2:370 -msgid "Send a checksum with every command" -msgstr "Transmite suma de control cu fiecare comandă" - -#: src/octoprint/templates/settings.jinja2:377 -#, python-format -msgid "" -"Support TargetExtr%%n/TargetBed target temperature" -" format" -msgstr "Susține formatul TargetExtr%%n/TargetBed pentru temperatura țintă" - -#: src/octoprint/templates/settings.jinja2:384 -msgid "Swallow the first \"ok\" after a resend response" -msgstr "Ascunde primul \"ok\" după un răspuns retransmis" - -#: src/octoprint/templates/settings.jinja2:393 -msgid "Upload Folder" -msgstr "Încarcă director" - -#: src/octoprint/templates/settings.jinja2:399 -msgid "Timelapse Folder" -msgstr "Director pentru înregistrarea rapidă" - -#: src/octoprint/templates/settings.jinja2:405 -msgid "Timelapse Temp Folder" -msgstr "Director temporar pentru înregistrarea rapidă" - -#: src/octoprint/templates/settings.jinja2:411 -msgid "Logs Folder" -msgstr "Director pentru înregistrarea activității" - -#: src/octoprint/templates/settings.jinja2:417 -msgid "Watched Folder" -msgstr "Director pentru înregistrări rapide vizionate" - -#: src/octoprint/templates/settings.jinja2:427 -msgid "Extruder" -msgstr "Extruder" - -#: src/octoprint/templates/settings.jinja2:459 -msgid "RegExp" -msgstr "RegExp" - -#: src/octoprint/templates/settings.jinja2:484 -msgid "Title" -msgstr "Titlu" - -#: src/octoprint/templates/settings.jinja2:503 -msgid "Enable" -msgstr "Activare" - -#: src/octoprint/templates/settings.jinja2:510 -#, python-format -msgid "Allow Cross Origin Resource Sharing (CORS)" -msgstr "Permite Cross Origin Resource Sharing (CORS)" - -#: src/octoprint/templates/settings.jinja2:515 -#: src/octoprint/templates/settings.jinja2:542 -msgid "API Key" -msgstr "Cheie API" - -#: src/octoprint/templates/settings.jinja2:521 -#: src/octoprint/templates/settings.jinja2:679 -msgid "QR Code" -msgstr "" - -#: src/octoprint/templates/settings.jinja2:535 -#: src/octoprint/templates/settings.jinja2:596 -#: src/octoprint/templates/settings.jinja2:625 -msgid "Active" -msgstr "Activ" - -#: src/octoprint/templates/settings.jinja2:536 -#: src/octoprint/templates/settings.jinja2:603 -#: src/octoprint/templates/settings.jinja2:632 -msgid "Admin" -msgstr "Admin" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Update User" -msgstr "Actualizare utilizator" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Change password" -msgstr "Modificare parolă" - -#: src/octoprint/templates/settings.jinja2:546 -msgid "Delete user" -msgstr "Ștergere utilizator" - -#: src/octoprint/templates/settings.jinja2:563 -#: src/octoprint/templates/settings.jinja2:570 -msgid "Add user" -msgstr "Adăugare utilizator" - -#: src/octoprint/templates/settings.jinja2:587 -#: src/octoprint/templates/settings.jinja2:658 -msgid "Repeat Password" -msgstr "Repetare parolă" - -#: src/octoprint/templates/settings.jinja2:618 -#, python-format -msgid "Edit user \"%(user)s\"" -msgstr "Editare utilizator \"%(user)s\"" - -#: src/octoprint/templates/settings.jinja2:647 -#, python-format -msgid "Change password for user \"%(user)s\"" -msgstr "Modificare parolă pentru utilizatorul \"%(user)s\"" - -#: src/octoprint/templates/settings.jinja2:652 -msgid "New Password" -msgstr "Parolă nouă" - -#: src/octoprint/templates/settings.jinja2:667 -msgid "Current API Key" -msgstr "Cheie API curentă" - -#: src/octoprint/templates/settings.jinja2:670 -msgid "N/A" -msgstr "N/A" - -#: src/octoprint/templates/settings.jinja2:709 -msgid "Modification date" -msgstr "Data modificării" - -#: src/octoprint/templates/settings.jinja2:717 -msgid "Date" -msgstr "Dată" - -#: src/octoprint/templates/settings.jinja2:756 -msgid "Save" -msgstr "Salvare" diff --git a/src/octoprint_setuptools/__init__.py b/src/octoprint_setuptools/__init__.py index d98e0b0c..1dd96287 100644 --- a/src/octoprint_setuptools/__init__.py +++ b/src/octoprint_setuptools/__init__.py @@ -292,14 +292,149 @@ class CompileTranslation(Command): self.babel_compile_messages.run() -def get_babel_commandclasses(pot_file=None, mapping_file="babel.cfg", input_dirs=".", output_dir=None, mail_address="i18n@octoprint.org", copyright_holder="The OctoPrint Project"): - return dict( +class BundleTranslation(Command): + description = "bundles translations" + user_options = [ + ('locale=', 'l', 'locale for the translation to bundle') + ] + boolean_options = [] + + source_dir = None + target_dir = None + + @classmethod + def for_options(cls, source_dir=None, target_dir=None): + if source_dir is None: + raise ValueError("source_dir must not be None") + if target_dir is None: + raise ValueError("target_dir must not be None") + + return type(cls)(cls.__name__, (cls,), dict( + source_dir=source_dir, + target_dir=target_dir + )) + + def initialize_options(self): + self.locale = None + + def finalize_options(self): + pass + + def run(self): + locale = self.locale + source_path = os.path.join(self.__class__.source_dir, locale) + target_path = os.path.join(self.__class__.target_dir, locale) + + if not os.path.exists(source_path): + raise RuntimeError("source path " + source_path + " does not exist") + + if os.path.exists(target_path): + if not os.path.isdir(target_path): + raise RuntimeError("target path " + target_path + " exists and is not a directory") + shutil.rmtree(target_path) + + print("Copying translations for locale {locale} from {source_path} to {target_path}...".format(**locals())) + shutil.copytree(source_path, target_path) + + +class PackTranslation(Command): + description = "bundles translations" + user_options = [ + ('locale=', 'l', 'locale for the translation to bundle'), + ('author=', 'a', 'author of the translation') + ] + boolean_options = [] + + source_dir = None + pack_name_prefix = None + pack_path_prefix = None + + @classmethod + def for_options(cls, source_dir=None, pack_name_prefix=None, pack_path_prefix=None): + if source_dir is None: + raise ValueError("source_dir must not be None") + if pack_name_prefix is None: + raise ValueError("pack_name_prefix must not be None") + if pack_path_prefix is None: + raise ValueError("pack_path_prefix must not be None") + + return type(cls)(cls.__name__, (cls,), dict( + source_dir=source_dir, + pack_name_prefix=pack_name_prefix, + pack_path_prefix=pack_path_prefix + )) + + def initialize_options(self): + self.locale = None + self.author = None + + def finalize_options(self): + if self.locale is None: + raise ValueError("locale must be provided") + + def run(self): + locale = self.locale + locale_dir = os.path.join(self.__class__.source_dir, locale) + + if not os.path.isdir(locale_dir): + raise RuntimeError("translation does not exist, please create it first") + + import datetime + + now = datetime.datetime.utcnow().replace(microsecond=0) + + zip_path = os.path.join(self.__class__.source_dir, "{prefix}{locale}_{date}.zip".format(prefix=self.__class__.pack_name_prefix, locale=locale, date=now.strftime("%Y%m%d%H%M%S"))) + print("Packing translation to {zip_path}".format(**locals())) + + def add_recursively(zip, path, prefix): + if not os.path.isdir(path): + return + + for entry in os.listdir(path): + entry_path = os.path.join(path, entry) + new_prefix = prefix + "/" + entry + if os.path.isdir(entry_path): + add_recursively(zip, entry_path, new_prefix) + elif os.path.isfile(entry_path): + print("Adding {entry_path} as {new_prefix}".format(**locals())) + zip.write(entry_path, new_prefix) + + meta_str = "last_update: {date}\n".format(date=now.isoformat()) + if self.author: + meta_str += "author: {author}\n".format(author=self.author) + + zip_locale_root = self.__class__.pack_path_prefix + locale + + import zipfile + with zipfile.ZipFile(zip_path, "w") as zip: + add_recursively(zip, locale_dir, zip_locale_root) + + print("Adding meta.yaml as {zip_locale_root}/meta.yaml".format(**locals())) + zip.writestr(zip_locale_root + "/meta.yaml", meta_str) + + +def get_babel_commandclasses(pot_file=None, + mapping_file="babel.cfg", + input_dirs=".", + output_dir=None, + pack_name_prefix=None, + pack_path_prefix=None, + bundled_dir=None, + mail_address="i18n@octoprint.org", + copyright_holder="The OctoPrint Project"): + result = dict( babel_new=NewTranslation.for_options(pot_file=pot_file, output_dir=output_dir), babel_extract=ExtractTranslation.for_options(mapping_file=mapping_file, pot_file=pot_file, input_dirs=input_dirs, mail_address=mail_address, copyright_holder=copyright_holder), babel_refresh=RefreshTranslation.for_options(mapping_file=mapping_file, pot_file=pot_file, input_dirs=input_dirs, output_dir=output_dir, mail_address=mail_address, copyright_holder=copyright_holder), - babel_compile=CompileTranslation.for_options(output_dir=output_dir) + babel_compile=CompileTranslation.for_options(output_dir=output_dir), + babel_pack=PackTranslation.for_options(source_dir=output_dir, pack_name_prefix=pack_name_prefix, pack_path_prefix=pack_path_prefix) ) + if bundled_dir is not None: + result["babel_bundle"] = BundleTranslation.for_options(source_dir=output_dir, target_dir=bundled_dir) + + return result + def create_plugin_setup_parameters(identifier="todo", name="TODO", version="0.1", description="TODO", author="TODO", mail="todo@example.com", url="TODO", license="AGPLv3", additional_data=None, @@ -341,10 +476,11 @@ def create_plugin_setup_parameters(identifier="todo", name="TODO", version="0.1" clean=CleanCommand.for_options(source_folder=package, eggs=eggs) )) - translation_dir = os.path.join(package, "translations") + translation_dir = os.path.join("translations") pot_file = os.path.join(translation_dir, "messages.pot") + bundled_dir = os.path.join(package, "translations") if os.path.isdir(translation_dir) and os.path.isfile(pot_file): - cmdclass.update(get_babel_commandclasses(pot_file=pot_file, output_dir=translation_dir)) + cmdclass.update(get_babel_commandclasses(pot_file=pot_file, output_dir=translation_dir, bundled_dir=bundled_dir, pack_name_prefix="{name}-i18n-".format(**locals()), pack_path_prefix="_plugins/{identifier}/".format(**locals()))) return dict( name=name, diff --git a/translations/de/LC_MESSAGES/messages.mo b/translations/de/LC_MESSAGES/messages.mo new file mode 100644 index 0000000000000000000000000000000000000000..ce65f3296ba228b6c513efbdd20b7c04463fb4e8 GIT binary patch literal 39484 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 R$=!f><>mW1Caq5f{|^C1K#c$Z literal 0 HcmV?d00001 diff --git a/translations/de/LC_MESSAGES/messages.po b/translations/de/LC_MESSAGES/messages.po new file mode 100644 index 00000000..0c6249d9 --- /dev/null +++ b/translations/de/LC_MESSAGES/messages.po @@ -0,0 +1,2186 @@ +# German translations for OctoPrint. +# Copyright (C) 2014 The OctoPrint Project +# This file is distributed under the same license as the OctoPrint project. +# +# Translators: +# demod , 2014 +# FIRST AUTHOR , 2014 +# Gina Häußge , 2014 +# Johannes Rebling , 2014 +msgid "" +msgstr "" +"Project-Id-Version: OctoPrint\n" +"Report-Msgid-Bugs-To: i18n@octoprint.org\n" +"POT-Creation-Date: 2015-06-02 13:09+0200\n" +"PO-Revision-Date: 2015-05-29 18:04+0100\n" +"Last-Translator: Gina Häußge \n" +"Language-Team: German (http://www.transifex.com/projects/p/octoprint/language/de/)\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 1.3\n" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:1 +#: src/octoprint/templates/tabs/control.jinja2:98 +msgid "General" +msgstr "Allgemein" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:5 +msgid "Path to CuraEngine" +msgstr "Pfad zu CuraEngine" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:13 +msgid "Log the output of CuraEngine to plugin_cura_engine.log" +msgstr "Output von CuraEngine nach plugin_cura_engine.log loggen" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:19 +msgid "Profiles" +msgstr "Profile" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:22 +#: src/octoprint/templates/dialogs/settings/logs.jinja2:6 +#: src/octoprint/templates/tabs/timelapse.jinja2:45 +msgid "Sort by" +msgstr "Sortieren" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:22 +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:27 +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:76 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:51 +msgid "Identifier" +msgstr "ID" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:22 +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:66 +#: src/octoprint/templates/dialogs/settings/logs.jinja2:6 +#: src/octoprint/templates/sidebar/files_header.jinja2:6 +#: src/octoprint/templates/tabs/timelapse.jinja2:45 +msgid "ascending" +msgstr "aufsteigend" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:22 +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:28 +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:82 +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:6 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:4 +#: src/octoprint/templates/dialogs/settings/logs.jinja2:6 +#: src/octoprint/templates/dialogs/settings/logs.jinja2:12 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:5 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:44 +#: src/octoprint/templates/dialogs/settings/terminalfilters.jinja2:3 +#: src/octoprint/templates/tabs/timelapse.jinja2:45 +#: src/octoprint/templates/tabs/timelapse.jinja2:50 +msgid "Name" +msgstr "Name" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:29 +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:7 +msgid "Actions" +msgstr "Aktionen" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:37 +msgid "Make default" +msgstr "Als Standard speichern" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:37 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:15 +msgid "Delete Profile" +msgstr "Profil entfernen" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:54 +msgid "Import Profile..." +msgstr "Profil importieren..." + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:59 +msgid "Import Existing Cura Profile" +msgstr "Vorhandenes Curaprofil importieren" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:64 +msgid "Profile ini file" +msgstr "Profil-INI-Datei" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:68 +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:132 +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:71 +msgid "Browse..." +msgstr "Durchsuchen..." + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:88 +msgid "Description" +msgstr "Beschreibung" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:96 +msgid "Overwrite existing file" +msgstr "Vorhandene Datei überschreiben" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:103 +#: src/octoprint/templates/dialogs/usersettings.jinja2:46 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:80 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:109 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:151 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:194 +msgid "Abort" +msgstr "Abbrechen" + +#: src/octoprint/plugins/cura/templates/cura_settings.jinja2:104 +#: src/octoprint/templates/dialogs/usersettings.jinja2:47 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:81 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:110 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:152 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:195 +msgid "Confirm" +msgstr "Bestätigen" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:110 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:234 +msgid "Installing plugin..." +msgstr "Installiere Plugin..." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:110 +msgid "Installing plugin from uploaded archive..." +msgstr "Installiere Plugin von hochgeladenem Archiv..." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:122 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:194 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:259 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:285 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:490 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:520 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:537 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:554 +msgid "Something went wrong" +msgstr "Etwas ist schief gegangen" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:123 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:195 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:260 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:286 +msgid "Please consult octoprint.log for details" +msgstr "Bitte konsultiere octoprint.log für Details" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:236 +#, python-format +msgid "Installing plugin \"%(name)s\" from %(url)s..." +msgstr "Installiere Plugin \"%(name)s\" von %(url)s..." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:238 +#, python-format +msgid "Installing plugin from %(url)s..." +msgstr "Installiere Plugin von %(url)s..." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:241 +msgid "Reinstalling plugin..." +msgstr "Reinstalliere Plugin..." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:242 +#, python-format +msgid "Reinstalling plugin \"%(name)s\" from %(url)s..." +msgstr "Reinstalliere Plugin \"%(name)s\" von %(url)s..." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:276 +msgid "Uninstalling plugin..." +msgstr "Deinstalliere Plugin..." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:276 +#, python-format +msgid "Uninstalling plugin \"%(name)s\"" +msgstr "Deinstalliere Plugin \"%(name)s\"" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:313 +msgid "Reinstall" +msgstr "Reinstallieren" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:313 +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:121 +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:137 +msgid "Install" +msgstr "Installieren" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:313 +msgid "Incompatible" +msgstr "Inkompatibel" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:331 +msgid "Reload now" +msgstr "Jetzt neu laden" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:400 +msgid "Done!" +msgstr "Fertig!" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:420 +msgid "Enable Plugin" +msgstr "Plugin enablen" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:420 +msgid "Disable Plugin" +msgstr "Plugin disablen" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:479 +#, python-format +msgid "Plugin \"%(name)s\" reinstalled" +msgstr "Plugin \"%(name)s\" reinstalliert" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:480 +msgid "The plugin was reinstalled successfully" +msgstr "Das Plugin wurde erfolgreich reinstalliert" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:481 +msgid "The plugin was reinstalled successfully, however a restart of OctoPrint is needed for that to take effect." +msgstr "Das Plugin wurde erfolgreich reinstalliert, es ist aber ein Neustart von OctoPrint notwendig bevor es genutzt werden kann." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:482 +msgid "The plugin was reinstalled successfully, however a reload of the page is needed for that to take effect." +msgstr "Das Plugin wurde erfolgreich reinstalliert, es ist aber ein Neuladen der Seite notwendig bevor es genutzt werden kann." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:484 +#, python-format +msgid "Plugin \"%(name)s\" installed" +msgstr "Plugin \"%(name)s\" installiert" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:485 +msgid "The plugin was installed successfully" +msgstr "Das Plugin wurde erfolgreich installiert" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:486 +msgid "The plugin was installed successfully, however a restart of OctoPrint is needed for that to take effect." +msgstr "Das Plugin wurde erfolgreich installiert, es ist jedoch ein Neustart von OctoPrint notwendig bevor es genutzt werden kann." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:487 +msgid "The plugin was installed successfully, however a reload of the page is needed for that to take effect." +msgstr "Das Plugin wurde erfolgreich installiert, es ist jedoch ein Neuladen der Seite notwendig bevor es genutzt werden kann." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:498 +#, python-format +msgid "Reinstalling the plugin from URL \"%(url)s\" failed: %(reason)s" +msgstr "Reinstallation des Plugins von URL \"%(url)s\" fehlgeschlagen: %(reason)s" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:500 +#, python-format +msgid "Installing the plugin from URL \"%(url)s\" failed: %(reason)s" +msgstr "Installation des Plugins von URL \"%(url)s\" fehlgeschlagen: %(reason)s" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:504 +#, python-format +msgid "Reinstalling the plugin from URL \"%(url)s\" failed, please see the log for details." +msgstr "Reinstallation des Plugins von URL \"%(url)s\" fehlgeschlagen, bitte konsultiere das Log für Details." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:506 +#, python-format +msgid "Installing the plugin from URL \"%(url)s\" failed, please see the log for details." +msgstr "Installation des Plugins von URL \"%(url)s\" fehlgeschlagen, bitte konsultiere das Log für Details" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:515 +#, python-format +msgid "Plugin \"%(name)s\" uninstalled" +msgstr "Plugin \"%(name)s\" deinstalliert" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:516 +msgid "The plugin was uninstalled successfully" +msgstr "Das Plugin wurde erfolgreich deinstalliert" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:517 +msgid "The plugin was uninstalled successfully, however a restart of OctoPrint is needed for that to take effect." +msgstr "Das Plugin wurde erfolgreich deinstalliert, es ist jedoch ein Neustart von OctoPrint notwendig." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:518 +msgid "The plugin was uninstalled successfully, however a reload of the page is needed for that to take effect." +msgstr "Das Plugin wurde erfolgreich deinstalliert, es ist jedoch ein Neuladen der Seite notwendig." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:522 +#, python-format +msgid "Uninstalling the plugin failed: %(reason)s" +msgstr "Deinstallation des Plugins fehlgeschlagen: %(reason)s" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:524 +msgid "Uninstalling the plugin failed, please see the log for details." +msgstr "Deinstallation des Plugins fehlgeschlagen, bitte konsultiere das Log für Details." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:532 +#, python-format +msgid "Plugin \"%(name)s\" enabled" +msgstr "Plugin \"%(name)s\" aktiviert" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:533 +msgid "The plugin was enabled successfully." +msgstr "Das Plugin wurde erfolgreich aktiviert." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:534 +msgid "The plugin was enabled successfully, however a restart of OctoPrint is needed for that to take effect." +msgstr "Das Plugin wurde erfolgreich aktiviert, es ist jedoch ein Neustart von OctoPrint notwendig." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:535 +msgid "The plugin was enabled successfully, however a reload of the page is needed for that to take effect." +msgstr "Das Plugin wurde erfolgreich aktiviert, es ist jedoch ein Neuladen der Seite notwendig." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:539 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:556 +#, python-format +msgid "Toggling the plugin failed: %(reason)s" +msgstr "Togglen des Plugins fehlgeschalgen: %(reason)s" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:541 +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:558 +msgid "Toggling the plugin failed, please see the log for details." +msgstr "Togglen des Plugins fehlgeschlagen, bitte konsultiere das Log für Details." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:549 +#, python-format +msgid "Plugin \"%(name)s\" disabled" +msgstr "Plugin \"%(name)s\" deaktiviert" + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:550 +msgid "The plugin was disabled successfully." +msgstr "Das Plugin wurde erfolgreich deaktiviert." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:551 +msgid "The plugin was disabled successfully, however a restart of OctoPrint is needed for that to take effect." +msgstr "Das Plugin wurde erfolgreich deaktiviert, es ist jedoch ein Neustart von OctoPrint notwendig." + +#: src/octoprint/plugins/pluginmanager/static/js/pluginmanager.js:552 +msgid "The plugin was disabled successfully, however a reload of the page is needed for that to take effect." +msgstr "Das Plugin wurde erfolgreich deaktiviert, es ist jedoch ein Neuladen der Seite notwendig." + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:1 +msgid "Installed Plugins" +msgstr "Installierte Plugins" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:13 +msgid "Bundled" +msgstr "Gebundled" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:16 +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:90 +#: src/octoprint/templates/index.jinja2:118 +msgid "Homepage" +msgstr "Homepage" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:23 +msgid "Uninstall Plugin" +msgstr "Plugin deinstallieren" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:40 +msgid "Get More..." +msgstr "Mehr..." + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:51 +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:143 +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:82 +msgid "Close" +msgstr "Schließen" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:58 +msgid "Install new Plugins..." +msgstr "Installation neuer Plugins..." + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:62 +#, python-format +msgid "... from the Plugin Repository" +msgstr "... vom Plugin Repository" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:66 +msgid "Sort by title" +msgstr "Nach Titel sortieren" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:67 +msgid "Sort by publication date" +msgstr "Nach Veröffentlichungsdatum sortieren" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:67 +#: src/octoprint/templates/dialogs/settings/logs.jinja2:6 +#: src/octoprint/templates/sidebar/files_header.jinja2:7 +#: src/octoprint/templates/sidebar/files_header.jinja2:8 +#: src/octoprint/templates/tabs/timelapse.jinja2:45 +msgid "descending" +msgstr "absteigend" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:69 +msgid "Only show uninstalled plugins" +msgstr "Nur uninstallierte Plugins anzeigen" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:70 +msgid "Only show compatible plugins" +msgstr "Nur kompatible Plugins anzeigen" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:72 +msgid "Refresh list from repository" +msgstr "Liste vom Repository neu laden" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:78 +#: src/octoprint/templates/sidebar/files.jinja2:2 +msgid "Search..." +msgstr "Suchen..." + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:89 +msgid "Details" +msgstr "Details" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:106 +msgid "Sadly the repository is currently not available" +msgstr "Das Repository ist leider zur Zeit nicht verfügbar" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:109 +msgid "Is your OctoPrint installation connected to the internet?" +msgstr "Ist Deine OctoPrint Installation mit dem Internet verbunden?" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:114 +msgid "... from URL" +msgstr "... von URL" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:119 +msgid "Enter URL..." +msgstr "URL eingeben..." + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:123 +msgid "This does not look like a valid \"http://\" or \"https://\" URL." +msgstr "Das sieht nicht wie eine valide \"http://\" oder \"https://\" URL aus." + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:126 +msgid "... from an uploaded archive" +msgstr "... von einem hochgeladenen Archiv" + +#: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:139 +msgid "This does not look like a valid plugin archive. Valid plugin archives should be either zip files or tarballs and have the extension \".zip\", \".tar.gz\", \".tgz\" or \".tar\"" +msgstr "Das sieht nicht aus wie ein valides Pluginarchiv. Valide Pluginarchive sollten entweder ZIP-Dateien oder Tarballs sein und die Dateiextension \".zip\", \".tar.gz\", \".tgz\" oder \".tar\" haben" + +#: src/octoprint/server/views.py:123 +msgid "Connection" +msgstr "Verbindung" + +#: src/octoprint/server/views.py:124 +msgid "State" +msgstr "Status" + +#: src/octoprint/server/views.py:125 +msgid "Files" +msgstr "Dateien" + +#: src/octoprint/server/views.py:131 +msgid "Temperature" +msgstr "Temperatur" + +#: src/octoprint/server/views.py:132 +msgid "Control" +msgstr "Kontrolle" + +#: src/octoprint/server/views.py:133 +msgid "Terminal" +msgstr "Terminal" + +#: src/octoprint/server/views.py:136 +msgid "GCode Viewer" +msgstr "GCode Viewer" + +#: src/octoprint/server/views.py:138 +#: src/octoprint/templates/sidebar/state.jinja2:3 +msgid "Timelapse" +msgstr "Zeitraffer" + +#: src/octoprint/server/views.py:143 +msgid "Printer" +msgstr "Drucker" + +#: src/octoprint/server/views.py:145 +msgid "Serial Connection" +msgstr "Serielle Verbindung" + +#: src/octoprint/server/views.py:146 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:1 +msgid "Printer Profiles" +msgstr "Druckerprofile" + +#: src/octoprint/server/views.py:147 +msgid "Temperatures" +msgstr "Temperaturen" + +#: src/octoprint/server/views.py:148 +msgid "Terminal Filters" +msgstr "Terminalfilter" + +#: src/octoprint/server/views.py:149 +msgid "GCODE Scripts" +msgstr "GCODE Scripts" + +#: src/octoprint/server/views.py:151 src/octoprint/server/views.py:153 +msgid "Features" +msgstr "Funktionen" + +#: src/octoprint/server/views.py:154 +msgid "Webcam" +msgstr "Webcam" + +#: src/octoprint/server/views.py:155 +msgid "API" +msgstr "API" + +#: src/octoprint/server/views.py:157 +#: src/octoprint/static/js/app/viewmodels/appearance.js:11 +#: src/octoprint/static/js/app/viewmodels/appearance.js:13 +#: src/octoprint/static/js/app/viewmodels/appearance.js:18 +#: src/octoprint/static/js/app/viewmodels/appearance.js:20 +msgid "OctoPrint" +msgstr "OctoPrint" + +#: src/octoprint/server/views.py:159 +msgid "Folders" +msgstr "Verzeichnisse" + +#: src/octoprint/server/views.py:160 +msgid "Appearance" +msgstr "Aussehen" + +#: src/octoprint/server/views.py:161 +#: src/octoprint/templates/dialogs/settings/logs.jinja2:2 +msgid "Logs" +msgstr "Logs" + +#: src/octoprint/server/views.py:164 +msgid "Access Control" +msgstr "Zugangsbeschränkung" + +#: src/octoprint/server/views.py:170 +msgid "Access" +msgstr "Zugriff" + +#: src/octoprint/server/views.py:171 +msgid "Interface" +msgstr "Interface" + +#: src/octoprint/server/views.py:258 +msgid "Plugins" +msgstr "Plugins" + +#: src/octoprint/static/js/app/dataupdater.js:61 +#: src/octoprint/static/js/app/dataupdater.js:95 +#: src/octoprint/static/js/app/helpers.js:421 +#: src/octoprint/templates/overlays/offline.jinja2:6 +msgid "Server is offline" +msgstr "Der Server ist offline" + +#: src/octoprint/static/js/app/dataupdater.js:62 +msgid "The server appears to be offline, at least I'm not getting any response from it. I'll try to reconnect automatically over the next couple of minutes, however you are welcome to try a manual reconnect anytime using the button below." +msgstr "Der Server scheint offline zu sein, zumindest kann ich mich nicht mit ihm verbinden. Ich werde in den nächsten Minuten versuchen mich erneut zu verbinden, aber Du kannst mittels des folgenden Buttons auch jederzeit einen manuellen Verbindungsversuch anstoßen." + +#: src/octoprint/static/js/app/dataupdater.js:96 +msgid "The server appears to be offline, at least I'm not getting any response from it. I could not reconnect automatically, but you may try a manual reconnect using the button below." +msgstr "Der Server scheint offline zu sein, zumindest kann ich mich nicht mit ihm verbinden. Ich konnte mich nicht automatisch neu verbinden, aber Du kannst mittels des folgenden Buttons einen manuellen Verbindungsversuch anstoßen." + +#: src/octoprint/static/js/app/dataupdater.js:168 +#: src/octoprint/static/js/app/dataupdater.js:196 +#, python-format +msgid "Slicing ... (%(percentage)d%%)" +msgstr "Slice ... (%(percentage)d%%)" + +#: src/octoprint/static/js/app/dataupdater.js:185 +msgid "Rendering timelapse" +msgstr "Zeitrafferaufnahme wird gerendert" + +#: src/octoprint/static/js/app/dataupdater.js:185 +#, python-format +msgid "Now rendering timelapse %(movie_basename)s" +msgstr "Rendere Zeitrafferaufnahme %(movie_basename)s" + +#: src/octoprint/static/js/app/dataupdater.js:187 +msgid "Timelapse ready" +msgstr "Zeitrafferaufnahme fertig" + +#: src/octoprint/static/js/app/dataupdater.js:187 +#, python-format +msgid "New timelapse %(movie_basename)s is done rendering." +msgstr "Neue Zeitrafferaufnahme %(movie_basename)s wurde fertig gerendert" + +#: src/octoprint/static/js/app/dataupdater.js:189 +#, python-format +msgid "Rendering of timelapse %(movie_basename)s failed with return code %(returncode)s" +msgstr "Rendering der Zeitrafferaufnahme %(movie_basename)s fehlgeschlagen mit Returncode %(returncode)s" + +#: src/octoprint/static/js/app/dataupdater.js:191 +msgid "Rendering failed" +msgstr "Rendering fehlgeschlagen" + +#: src/octoprint/static/js/app/dataupdater.js:198 +msgid "Slicing ..." +msgstr "Slice ..." + +#: src/octoprint/static/js/app/dataupdater.js:204 +msgid "Slicing done" +msgstr "Slicing abgeschlossen" + +#: src/octoprint/static/js/app/dataupdater.js:204 +#, python-format +msgid "Sliced %(stl)s to %(gcode)s, took %(time).2f seconds" +msgstr "%(stl)s nach %(gcode)s geslicet, dauerte %(time).2f Sekunden" + +#: src/octoprint/static/js/app/dataupdater.js:214 +#, python-format +msgid "Could not slice %(stl)s to %(gcode)s: %(reason)s" +msgstr "Konnte %(stl)s nicht nach %(gcode)s slicen: %(reason)s" + +#: src/octoprint/static/js/app/dataupdater.js:215 +msgid "Slicing failed" +msgstr "Slicing fehlgeschlagen" + +#: src/octoprint/static/js/app/dataupdater.js:219 +msgid "Streaming ..." +msgstr "Streaming ..." + +#: src/octoprint/static/js/app/dataupdater.js:225 +msgid "Streaming done" +msgstr "Streaming abgeschlossen" + +#: src/octoprint/static/js/app/dataupdater.js:226 +#, python-format +msgid "Streamed %(local)s to %(remote)s on SD, took %(time).2f seconds" +msgstr "%(local)s nach %(remote)s gestreamt, dauerte %(time).2f Sekunden" + +#: src/octoprint/static/js/app/helpers.js:342 +#, python-format +msgid "%(hour)02d:%(minute)02d:%(second)02d" +msgstr "%(hour)02d:%(minute)02d:%(second)02d" + +#: src/octoprint/static/js/app/helpers.js:362 +msgid "YYYY-MM-DD HH:mm" +msgstr "DD.MM.YYYY HH:mm" + +#: src/octoprint/static/js/app/helpers.js:380 +#: src/octoprint/static/js/app/helpers.js:385 +msgid "off" +msgstr "Aus" + +#: src/octoprint/static/js/app/main.js:46 +msgid "Offline" +msgstr "Offline" + +#: src/octoprint/static/js/app/main.js:47 +msgid "Opening serial port" +msgstr "Öffnet Serialport" + +#: src/octoprint/static/js/app/main.js:48 +msgid "Detecting serial port" +msgstr "Detektiere Serialport" + +#: src/octoprint/static/js/app/main.js:49 +msgid "Detecting baudrate" +msgstr "Detektiere Baudrate" + +#: src/octoprint/static/js/app/main.js:50 +msgid "Connecting" +msgstr "Verbinde" + +#: src/octoprint/static/js/app/main.js:51 +msgid "Operational" +msgstr "Bereit" + +#: src/octoprint/static/js/app/main.js:52 +msgid "Printing from SD" +msgstr "Drucke von SD" + +#: src/octoprint/static/js/app/main.js:53 +msgid "Sending file to SD" +msgstr "Sende Datei zu SD" + +#: src/octoprint/static/js/app/main.js:54 +msgid "Printing" +msgstr "Drucke" + +#: src/octoprint/static/js/app/main.js:55 +msgid "Paused" +msgstr "Pausiert" + +#: src/octoprint/static/js/app/main.js:56 +msgid "Closed" +msgstr "Geschlossen" + +#: src/octoprint/static/js/app/main.js:57 +msgid "Transfering file to SD" +msgstr "Sende Datei zu SD" + +#: src/octoprint/static/js/app/viewmodels/connection.js:42 +#: src/octoprint/templates/sidebar/connection.jinja2:13 +msgid "Connect" +msgstr "Verbinden" + +#: src/octoprint/static/js/app/viewmodels/connection.js:44 +msgid "Disconnect" +msgstr "Trennen" + +#: src/octoprint/static/js/app/viewmodels/control.js:60 +#: src/octoprint/static/js/app/viewmodels/files.js:301 +#: src/octoprint/static/js/app/viewmodels/gcode.js:453 +#: src/octoprint/static/js/app/viewmodels/printerstate.js:167 +#: src/octoprint/static/js/app/viewmodels/temperature.js:58 +msgid "Tool" +msgstr "Werkzeug" + +#: src/octoprint/static/js/app/viewmodels/control.js:67 +#: src/octoprint/static/js/app/viewmodels/temperature.js:70 +msgid "Hotend" +msgstr "Hotend" + +#: src/octoprint/static/js/app/viewmodels/files.js:296 +#: src/octoprint/static/js/app/viewmodels/files.js:301 +msgid "Filament" +msgstr "Filament" + +#: src/octoprint/static/js/app/viewmodels/files.js:305 +msgid "Estimated Print Time" +msgstr "Geschätzte Druckdauer" + +#: src/octoprint/static/js/app/viewmodels/files.js:308 +msgid "Last Printed" +msgstr "Zuletzt gedruckt" + +#: src/octoprint/static/js/app/viewmodels/files.js:310 +msgid "Last Print Time" +msgstr "Letzte Druckdauer" + +#: src/octoprint/static/js/app/viewmodels/files.js:388 +msgid "Could not upload the file. Make sure that it is a GCODE file and has the extension \".gcode\" or \".gco\" or that it is an STL file with the extension \".stl\"." +msgstr "Konnte die Datei nicht hochladen. Bitte stelle sicher, dass es sich um eine GCODE-Datei mit der Extension \".gcode\" oder \".gco\" oder um eine STL-Datei mit der Extension \".stl\" handelt." + +#: src/octoprint/static/js/app/viewmodels/files.js:404 +msgid "Uploading ..." +msgstr "Uploade ..." + +#: src/octoprint/static/js/app/viewmodels/files.js:407 +msgid "Saving ..." +msgstr "Speichere ..." + +#: src/octoprint/static/js/app/viewmodels/firstrun.js:38 +msgid "If you disable Access Control and your OctoPrint installation is accessible from the internet, your printer will be accessible by everyone - that also includes the bad guys!" +msgstr "Wenn Du die Zugangsbeschränkung deaktivierst und Deine OctoPrint Installation vom Internet aus erreichbar ist, kann jeder auf Deinen Drucker zugreifen - auch die bösen Jungs!" + +#: src/octoprint/static/js/app/viewmodels/gcode.js:14 +msgid "Loading..." +msgstr "Lade..." + +#: src/octoprint/static/js/app/viewmodels/gcode.js:18 +msgid "Analyzing..." +msgstr "Analysiere..." + +#: src/octoprint/static/js/app/viewmodels/gcode.js:22 +msgid "Analyzed" +msgstr "Analysiert" + +#: src/octoprint/static/js/app/viewmodels/gcode.js:420 +msgid "Model size" +msgstr "Modelgröße" + +#: src/octoprint/static/js/app/viewmodels/gcode.js:421 +msgid "Estimated layer height" +msgstr "Geschätzte Schichthöhe" + +#: src/octoprint/static/js/app/viewmodels/gcode.js:421 +msgid "mm" +msgstr "mm" + +#: src/octoprint/static/js/app/viewmodels/gcode.js:422 +msgid "Layer count" +msgstr "Schichtanzahl" + +#: src/octoprint/static/js/app/viewmodels/gcode.js:422 +msgid "printed" +msgstr "gedruckt" + +#: src/octoprint/static/js/app/viewmodels/gcode.js:422 +msgid "visited" +msgstr "besucht" + +#: src/octoprint/static/js/app/viewmodels/gcode.js:445 +msgid "Layer number" +msgstr "Schichtnummer" + +#: src/octoprint/static/js/app/viewmodels/gcode.js:446 +msgid "Layer height" +msgstr "Schichthöhe" + +#: src/octoprint/static/js/app/viewmodels/gcode.js:447 +msgid "GCODE commands in layer" +msgstr "GCODE Kommandos in Schicht" + +#: src/octoprint/static/js/app/viewmodels/gcode.js:450 +#: src/octoprint/static/js/app/viewmodels/gcode.js:453 +msgid "Filament used by layer" +msgstr "Genutztes Filament in Schicht" + +#: src/octoprint/static/js/app/viewmodels/gcode.js:457 +msgid "Print time for layer" +msgstr "Druckdauer für Schicht" + +#: src/octoprint/static/js/app/viewmodels/loginstate.js:22 +#: src/octoprint/templates/navbar/login.jinja2:2 +#: src/octoprint/templates/navbar/login.jinja2:13 +msgid "Login" +msgstr "Login" + +#: src/octoprint/static/js/app/viewmodels/loginstate.js:91 +msgid "Login successful" +msgstr "Login erfolgreich" + +#: src/octoprint/static/js/app/viewmodels/loginstate.js:91 +#, python-format +msgid "You are now logged in as \"%(username)s\"" +msgstr "Du bist jetzt eingeloggt als \"%(username)s\"" + +#: src/octoprint/static/js/app/viewmodels/loginstate.js:95 +msgid "Login failed" +msgstr "Login fehlgeschlagen" + +#: src/octoprint/static/js/app/viewmodels/loginstate.js:95 +msgid "User unknown or wrong password" +msgstr "Nutzer unbekannt oder falsches Passwort" + +#: src/octoprint/static/js/app/viewmodels/loginstate.js:105 +msgid "Logout successful" +msgstr "Logout erfolgreich" + +#: src/octoprint/static/js/app/viewmodels/loginstate.js:105 +msgid "You are now logged out" +msgstr "Du bist jetzt ausgeloggt" + +#: src/octoprint/static/js/app/viewmodels/navigation.js:28 +#, python-format +msgid "The command \"%(command)s\" executed successfully" +msgstr "Das Kommando \"%(command)s\" wurde erfolgreich ausgeführt" + +#: src/octoprint/static/js/app/viewmodels/navigation.js:31 +#, python-format +msgid "The command \"%(command)s\" could not be executed." +msgstr "Das Kommando \"%(command)s\" konnte nicht ausgeführt werden." + +#: src/octoprint/static/js/app/viewmodels/navigation.js:33 +msgid "Error" +msgstr "Fehler" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:96 +#: src/octoprint/static/js/app/viewmodels/settings.js:52 +#: src/octoprint/static/js/app/viewmodels/settings.js:82 +msgid "default" +msgstr "Standard" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:97 +#: src/octoprint/static/js/app/viewmodels/settings.js:53 +#: src/octoprint/static/js/app/viewmodels/settings.js:66 +msgid "red" +msgstr "Rot" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:98 +#: src/octoprint/static/js/app/viewmodels/settings.js:54 +#: src/octoprint/static/js/app/viewmodels/settings.js:68 +msgid "orange" +msgstr "Orange" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:99 +#: src/octoprint/static/js/app/viewmodels/settings.js:55 +#: src/octoprint/static/js/app/viewmodels/settings.js:70 +msgid "yellow" +msgstr "Gelb" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:100 +#: src/octoprint/static/js/app/viewmodels/settings.js:56 +#: src/octoprint/static/js/app/viewmodels/settings.js:72 +msgid "green" +msgstr "Grün" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:101 +#: src/octoprint/static/js/app/viewmodels/settings.js:57 +#: src/octoprint/static/js/app/viewmodels/settings.js:74 +msgid "blue" +msgstr "Blau" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:102 +#: src/octoprint/static/js/app/viewmodels/settings.js:59 +#: src/octoprint/static/js/app/viewmodels/settings.js:78 +msgid "black" +msgstr "Schwarz" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:109 +msgid "Lower Left" +msgstr "Unten links" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:110 +msgid "Center" +msgstr "Mittelpunkt" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:172 +msgid "Identifier must be set" +msgstr "Identifier muss gesetzt sein" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:174 +msgid "Invalid characters, only a-z, A-Z, 0-9, -, ., _, ( and ) are allowed" +msgstr "Invalide Zeichen, es sind nur a-z, A-Z, 0-9, -, ., _, ( und ) erlaubt" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:176 +msgid "A profile with such an identifier already exists" +msgstr "Es gibt bereits ein Profil mit diesem Identifier" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:247 +msgid "There was unexpected error while saving the printer profile, please consult the logs." +msgstr "Unerwarteter Fehler beim Speichern des Profils, bitte konsultiere das Log" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:248 +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:266 +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:294 +msgid "Saving failed" +msgstr "Speichern fehlgeschlagen" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:265 +msgid "There was unexpected error while removing the printer profile, please consult the logs." +msgstr "Unerwarteter Fehler beim Löschen des Profils, bitte konsultiere das Log" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:293 +msgid "There was unexpected error while updating the printer profile, please consult the logs." +msgstr "Unerwarteter Fehler beim Aktualisieren des Profils, bitte konsultiere das Log" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:348 +msgid "Add Printer Profile" +msgstr "Druckerprofil hinzufügen" + +#: src/octoprint/static/js/app/viewmodels/printerprofiles.js:348 +#, python-format +msgid "Edit Printer Profile \"%(name)s\"" +msgstr "Druckerprofile \"%(name)s\" bearbeiten" + +#: src/octoprint/static/js/app/viewmodels/printerstate.js:34 +msgid "Restarts the print job from the beginning" +msgstr "Started den Druckjob von vorne" + +#: src/octoprint/static/js/app/viewmodels/printerstate.js:35 +msgid "Starts the print job" +msgstr "Startet den Druckjob" + +#: src/octoprint/static/js/app/viewmodels/printerstate.js:36 +msgid "Resumes the print job" +msgstr "Setzt den Druckjob fort" + +#: src/octoprint/static/js/app/viewmodels/printerstate.js:37 +msgid "Pauses the print job" +msgstr "Pausiert den Druckjob" + +#: src/octoprint/static/js/app/viewmodels/printerstate.js:70 +msgid "Calculating..." +msgstr "Wird ermittelt..." + +#: src/octoprint/static/js/app/viewmodels/printerstate.js:83 +msgid "Continue" +msgstr "Fortsetzen" + +#: src/octoprint/static/js/app/viewmodels/printerstate.js:85 +#: src/octoprint/templates/sidebar/state.jinja2:18 +msgid "Pause" +msgstr "Pause" + +#: src/octoprint/static/js/app/viewmodels/printerstate.js:96 +#: src/octoprint/templates/tabs/timelapse.jinja2:7 +msgid "On Z Change" +msgstr "Bei Ebenenwechsel" + +#: src/octoprint/static/js/app/viewmodels/printerstate.js:98 +#: src/octoprint/templates/tabs/timelapse.jinja2:8 +msgid "Timed" +msgstr "Nach Zeit" + +#: src/octoprint/static/js/app/viewmodels/printerstate.js:98 +#: src/octoprint/templates/tabs/timelapse.jinja2:20 +#: src/octoprint/templates/tabs/timelapse.jinja2:27 +msgid "sec" +msgstr "Sek" + +#: src/octoprint/static/js/app/viewmodels/printerstate.js:206 +msgid "This will restart the print job from the beginning." +msgstr "Der Druckjob wird zurückgesetzt und von vorne begonnen." + +#: src/octoprint/static/js/app/viewmodels/settings.js:58 +#: src/octoprint/static/js/app/viewmodels/settings.js:76 +msgid "violet" +msgstr "Violett" + +#: src/octoprint/static/js/app/viewmodels/settings.js:60 +#: src/octoprint/static/js/app/viewmodels/settings.js:80 +msgid "white" +msgstr "weiß" + +#: src/octoprint/static/js/app/viewmodels/settings.js:88 +msgid "Autodetect from browser" +msgstr "Automatisch vom Browser erkennen" + +#: src/octoprint/static/js/app/viewmodels/slicing.js:31 +msgid "Do nothing" +msgstr "Nichts machen" + +#: src/octoprint/static/js/app/viewmodels/slicing.js:32 +msgid "Select for printing" +msgstr "Zum Drucken auswählen" + +#: src/octoprint/static/js/app/viewmodels/slicing.js:33 +msgid "Start printing" +msgstr "Drucken" + +#: src/octoprint/static/js/app/viewmodels/slicing.js:45 +#, python-format +msgid "Slicing %(filename)s" +msgstr "Slice %(filename)s" + +#: src/octoprint/static/js/app/viewmodels/temperature.js:23 +#: src/octoprint/static/js/app/viewmodels/temperature.js:76 +#: src/octoprint/templates/dialogs/settings/temperatures.jinja2:16 +msgid "Bed" +msgstr "Bett" + +#: src/octoprint/static/js/app/viewmodels/temperature.js:115 +msgid "just now" +msgstr "gerade eben" + +#: src/octoprint/static/js/app/viewmodels/temperature.js:117 +msgid "min" +msgstr "Min" + +#: src/octoprint/static/js/app/viewmodels/temperature.js:263 +#: src/octoprint/templates/tabs/temperature.jinja2:11 +msgid "Actual" +msgstr "Ist" + +#: src/octoprint/static/js/app/viewmodels/temperature.js:268 +#: src/octoprint/templates/tabs/temperature.jinja2:12 +msgid "Target" +msgstr "Soll" + +#: src/octoprint/static/js/app/viewmodels/terminal.js:59 +#, python-format +msgid "showing %(displayed)d lines" +msgstr "zeige %(displayed)d Zeilen" + +#: src/octoprint/static/js/app/viewmodels/terminal.js:61 +#, python-format +msgid "showing %(displayed)d lines (%(filtered)d of %(total)d total lines filtered)" +msgstr "zeige %(displayed)d Zeilen (%(filtered)d von %(total)d Zeilen gefiltert)" + +#: src/octoprint/static/js/app/viewmodels/usersettings.js:10 +msgid "Site default" +msgstr "Seitenvoreinstellung" + +#: src/octoprint/templates/index.jinja2:115 +msgid "Version" +msgstr "Version" + +#: src/octoprint/templates/index.jinja2:119 +msgid "Sourcecode" +msgstr "Quellcode" + +#: src/octoprint/templates/index.jinja2:120 +msgid "Documentation" +msgstr "Dokumentation" + +#: src/octoprint/templates/index.jinja2:121 +msgid "Bugs and Requests" +msgstr "Bugs und Requests" + +#: src/octoprint/templates/dialogs/confirmation.jinja2:4 +msgid "Are you sure?" +msgstr "Bist Du sicher?" + +#: src/octoprint/templates/dialogs/confirmation.jinja2:8 +msgid "Are you sure you want to proceed?" +msgstr "Bist Du sicher, dass du fortfahren willst?" + +#: src/octoprint/templates/dialogs/confirmation.jinja2:11 +#: src/octoprint/templates/dialogs/settings.jinja2:51 +#: src/octoprint/templates/dialogs/slicing.jinja2:50 +#: src/octoprint/templates/sidebar/state.jinja2:19 +msgid "Cancel" +msgstr "Abbruch" + +#: src/octoprint/templates/dialogs/confirmation.jinja2:12 +msgid "Proceed" +msgstr "Fortfahren" + +#: src/octoprint/templates/dialogs/firstrun.jinja2:3 +msgid "Configure Access Control" +msgstr "Zugangsbeschränkung konfigurieren" + +#: src/octoprint/templates/dialogs/firstrun.jinja2:6 +msgid "" +"

\n" +" Please read the following, it is very important for your printer's health!\n" +"

\n" +"

\n" +" OctoPrint by default now ships with Access Control enabled, meaning you won't be able to do anything with the\n" +" printer unless you login first as a configured user. This is to prevent strangers - possibly with\n" +" malicious intent - to gain access to your printer via the internet or another untrustworthy network\n" +" and using it in such a way that it is damaged or worse (i.e. causes a fire).\n" +"

\n" +"

\n" +" It looks like you haven't configured access control yet. Please set up an username and password for the\n" +" initial administrator account who will have full access to both the printer and OctoPrint's settings, then click\n" +" on \"Keep Access Control Enabled\":\n" +"

" +msgstr "" +"

\n" +" Bitte lies die folgenden Zeilen aufmerksam durch, es ist sehr wichtig für die Gesundheit Deines Druckers!\n" +"

\n" +"

\n" +" OctoPrint wird nun standardmässig mit aktivierter Zugangsbeschränkung ausgeliefert, das heißt, dass Du mit dem Drucker nichts\n" +" anfangen kannst, wenn du nicht als einer der konfigurierten Nutzer eingeloggt bist. Das dient dem Zweck, Fremde mit\n" +" möglicherweise böswilligen Absichten davon abzuhalten, auf Deinen Drucker über das Internet oder ein anderes\n" +" unsicheres Netzwerk zuzugreifen und ihn auf eine Art zu nutzen, die ihn beschädigt oder schlimmeres (z.B. ein Feuer verursacht).\n" +"

\n" +"

\n" +" Es sieht so aus, als hättest Du die Zugriffsbeschränkung noch nicht konfiguriert. Bitte konfiguriere einen Usernamen\n" +" und ein Passwort für das initiale Administratorkonto, das vollen Zugang zu sowohl dem Drucker als auch OctoPrints\n" +" Einstellungen haben wird, und klicke dann auf \"Zugangsbeschränkung aktiviert lassen\".\n" +"

" + +#: src/octoprint/templates/dialogs/firstrun.jinja2:22 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:45 +#: src/octoprint/templates/navbar/login.jinja2:6 +#: src/octoprint/templates/navbar/login.jinja2:7 +msgid "Username" +msgstr "Username" + +#: src/octoprint/templates/dialogs/firstrun.jinja2:28 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:51 +#: src/octoprint/templates/dialogs/usersettings/access.jinja2:3 +#: src/octoprint/templates/navbar/login.jinja2:8 +#: src/octoprint/templates/navbar/login.jinja2:9 +msgid "Password" +msgstr "Passwort" + +#: src/octoprint/templates/dialogs/firstrun.jinja2:34 +msgid "Confirm Password" +msgstr "Passwort bestätigen" + +#: src/octoprint/templates/dialogs/firstrun.jinja2:37 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:60 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:131 +#: src/octoprint/templates/dialogs/usersettings/access.jinja2:17 +msgid "Passwords do not match" +msgstr "Passwörter nicht identisch" + +#: src/octoprint/templates/dialogs/firstrun.jinja2:41 +msgid "" +"

\n" +" Note: In case that your OctoPrint installation is only accessible from within a trustworthy network and you don't\n" +" need Access Control for other reasons, you may alternatively disable Access Control. You should only\n" +" do this if you are absolutely certain that only people you know and trust will be able to connect to it.\n" +"

\n" +"

\n" +" Do NOT underestimate the risk of an unsecured access from the internet to your printer!\n" +"

" +msgstr "" +"

\n" +" Beachte: Falls Deine OctoPrint Installation ausschließlich innerhalb eines vertrauenswürdigen Netzwerks\n" +" erreicht werden kann und Du die Zugangsbeschränkung nicht für andere Zwecke benötigst, kannst Du sie alternativ auch\n" +" deaktivieren. Du solltest das nur tun, wenn Du Dir absolut sicher bist, dass nur Leute darauf zugreifen können, die du kennst\n" +" und denen du vertraust\n" +"

\n" +"

\n" +" UNTERSCHÄTZE NICHT das Risiko eines ungesicherten Zugriffs aus dem Internet auf Deinen Drucker!\n" +"

" + +#: src/octoprint/templates/dialogs/firstrun.jinja2:51 +msgid "Disable Access Control" +msgstr "Zugangsbeschränkung deaktivieren" + +#: src/octoprint/templates/dialogs/firstrun.jinja2:52 +msgid "Keep Access Control Enabled" +msgstr "Zugangsbeschränkung aktiviert lassen" + +#: src/octoprint/templates/dialogs/settings.jinja2:4 +msgid "OctoPrint Settings" +msgstr "OctoPrint Einstellungen" + +#: src/octoprint/templates/dialogs/settings.jinja2:52 +msgid "Save" +msgstr "Speichern" + +#: src/octoprint/templates/dialogs/slicing.jinja2:8 +msgid "Slicing is currently disabled since no slicer has been configured yet. Please configure a slicer under \"Settings\"." +msgstr "Slicing ist aktuell deaktiviert da noch kein Slicer konfiguriert wurde. Bitte konfiguriere einen Slicer unter \"Settings\"." + +#: src/octoprint/templates/dialogs/slicing.jinja2:11 +msgid "Please configure which slicer and which slicing profile to use and name the GCode file to slice to below, or click \"Cancel\" if you do not wish to slice the file now." +msgstr "Bitte wähle den zu nutzenden Slicer und das zu nutzende Slicerprofile und wie die GCode Datei heißen soll, die erzeugt wird. Alternativ kannst du auch auf \"Abbrechen\" klicken, wenn du die Datei jetzt nicht slicen willst." + +#: src/octoprint/templates/dialogs/slicing.jinja2:14 +msgid "Slicer" +msgstr "Slicer" + +#: src/octoprint/templates/dialogs/slicing.jinja2:16 +msgid "Select a slicer..." +msgstr "Slicer wählen..." + +#: src/octoprint/templates/dialogs/slicing.jinja2:20 +msgid "Slicing Profile" +msgstr "Slicingprofil" + +#: src/octoprint/templates/dialogs/slicing.jinja2:22 +msgid "Select a slicing profile..." +msgstr "Wähle ein Slicingprofile..." + +#: src/octoprint/templates/dialogs/slicing.jinja2:26 +#: src/octoprint/templates/sidebar/connection.jinja2:5 +msgid "Printer Profile" +msgstr "Druckerprofil" + +#: src/octoprint/templates/dialogs/slicing.jinja2:28 +msgid "Select a printer profile..." +msgstr "Wähle ein Druckerprofil..." + +#: src/octoprint/templates/dialogs/slicing.jinja2:32 +msgid "GCode Filename" +msgstr "GCode Dateiname" + +#: src/octoprint/templates/dialogs/slicing.jinja2:41 +msgid "After slicing..." +msgstr "Nach dem Slicing..." + +#: src/octoprint/templates/dialogs/slicing.jinja2:51 +#: src/octoprint/templates/sidebar/files.jinja2:28 +msgid "Slice" +msgstr "Slicen" + +#: src/octoprint/templates/dialogs/usersettings.jinja2:4 +#: src/octoprint/templates/navbar/login.jinja2:16 +msgid "User Settings" +msgstr "Nutzereinstellungen" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:5 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:66 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:95 +msgid "Active" +msgstr "Aktiv" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:6 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:73 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:102 +msgid "Admin" +msgstr "Admin" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:7 +#: src/octoprint/templates/dialogs/settings/logs.jinja2:15 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:7 +#: src/octoprint/templates/tabs/timelapse.jinja2:52 +msgid "Action" +msgstr "Aktion" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:12 +#: src/octoprint/templates/dialogs/settings/api.jinja2:17 +#: src/octoprint/templates/dialogs/usersettings/access.jinja2:22 +msgid "API Key" +msgstr "API Key" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:16 +msgid "Update User" +msgstr "Nutzer editieren" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:16 +msgid "Change password" +msgstr "Passwort ändern" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:16 +msgid "Delete user" +msgstr "Nutzer löschen" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:33 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:40 +msgid "Add user" +msgstr "Nutzer hinzufügen" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:57 +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:128 +#: src/octoprint/templates/dialogs/usersettings/access.jinja2:14 +msgid "Repeat Password" +msgstr "Passwort wiederholen" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:88 +#, python-format +msgid "Edit user \"%(user)s\"" +msgstr "Editiere Nutzer \"%(user)s\"" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:117 +#, python-format +msgid "Change password for user \"%(user)s\"" +msgstr "Passwortänderung für Nutzer \"%(user)s\"" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:122 +#: src/octoprint/templates/dialogs/usersettings/access.jinja2:8 +msgid "New Password" +msgstr "Neues Passwort" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:137 +#: src/octoprint/templates/dialogs/usersettings/access.jinja2:24 +msgid "Current API Key" +msgstr "Aktueller API-Key" + +#: src/octoprint/templates/dialogs/settings/accesscontrol.jinja2:140 +#: src/octoprint/templates/dialogs/usersettings/access.jinja2:27 +msgid "N/A" +msgstr "(nicht vorhanden)" + +#: src/octoprint/templates/dialogs/settings/api.jinja2:5 +msgid "Enable" +msgstr "Aktivieren" + +#: src/octoprint/templates/dialogs/settings/api.jinja2:12 +#, python-format +msgid "Allow Cross Origin Resource Sharing (CORS)" +msgstr "Cross Origin Resource Sharing (CORS) erlauben" + +#: src/octoprint/templates/dialogs/settings/api.jinja2:23 +#: src/octoprint/templates/dialogs/usersettings/access.jinja2:35 +msgid "QR Code" +msgstr "QR Code" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:2 +msgid "Name of this OctoPrint instance, will be shown in the navigation bar and broadcast on the network" +msgstr "Name dieser OctoPrint-Instanz, wird in der Navigationsleiste angezeigt und im Netzwerk announced." + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:3 +msgid "Title" +msgstr "Titel" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:8 +msgid "Personalize the color of the navigation bar - maybe to match your printer?" +msgstr "Personalisiere die Farbe the Navigationsleiste - vielleicht um zum Drucker zu passen?" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:9 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:64 +msgid "Color" +msgstr "Farbe" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:15 +msgid "For acrylic printers ;)" +msgstr "Für Drucker mit Acrylrahmen ;)" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:18 +msgid "Transparent Color" +msgstr "Transparente Farbe" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:23 +#, fuzzy +msgid "Language Packs" +msgstr "Sprache" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:25 +#, fuzzy +msgid "Manage..." +msgstr "Speichere ..." + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:29 +msgid "Default Language" +msgstr "Standardsprache" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:36 +msgid "Changes to the default interface language will only become active after a reload of the page and only be active if not overridden by the users language settings." +msgstr "Änderungen der Standardsprache werden erst nach einem Neuladen der Seite aktiv, und nur dann, wenn sie nicht durch die Nutzereinstellungen überschrieben sind." + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:44 +msgid "Manage Language Packs..." +msgstr "" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:58 +#, fuzzy +msgid "Delete" +msgstr "Standard" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:76 +#: src/octoprint/templates/overlays/dragndrop.jinja2:10 +#: src/octoprint/templates/sidebar/files.jinja2:44 +#: src/octoprint/templates/sidebar/files.jinja2:55 +msgid "Upload" +msgstr "Upload" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:78 +#, fuzzy +msgid "This does not look like a valid language pack. Valid language packs should be either zip files or tarballs and have the extension \".zip\", \".tar.gz\", \".tgz\" or \".tar\"" +msgstr "Das sieht nicht aus wie ein valides Pluginarchiv. Valide Pluginarchive sollten entweder ZIP-Dateien oder Tarballs sein und die Dateiextension \".zip\", \".tar.gz\", \".tgz\" oder \".tar\" haben" + +#: src/octoprint/templates/dialogs/settings/features.jinja2:5 +msgid "Enable Temperature Graph" +msgstr "Temperaturgraph aktivieren" + +#: src/octoprint/templates/dialogs/settings/features.jinja2:12 +msgid "Enable GCode Visualizer" +msgstr "GCode Viewer aktivieren" + +#: src/octoprint/templates/dialogs/settings/features.jinja2:19 +msgid "Enable SD support" +msgstr "SD-Unterstützung aktivieren" + +#: src/octoprint/templates/dialogs/settings/features.jinja2:26 +msgid "Enable Keyboard Control" +msgstr "Tastatursteuerung aktivieren" + +#: src/octoprint/templates/dialogs/settings/features.jinja2:33 +msgid "Wait for start on connect" +msgstr "Bei der Verbindung auf start warten" + +#: src/octoprint/templates/dialogs/settings/features.jinja2:40 +msgid "Always assume SD card is present" +msgstr "Immer davon ausgehen, dass eine SD-Karte vorhanden ist" + +#: src/octoprint/templates/dialogs/settings/features.jinja2:40 +#: src/octoprint/templates/dialogs/settings/features.jinja2:47 +#: src/octoprint/templates/dialogs/settings/features.jinja2:54 +#: src/octoprint/templates/dialogs/settings/features.jinja2:61 +msgid "Repetier" +msgstr "Repetier" + +#: src/octoprint/templates/dialogs/settings/features.jinja2:47 +msgid "Send a checksum with every command" +msgstr "Eine Prüfsumme mit jedem Kommando senden" + +#: src/octoprint/templates/dialogs/settings/features.jinja2:54 +#, python-format +msgid "Support TargetExtr%%n/TargetBed target temperature format" +msgstr "TargetExtr%%n/TargetBed Zieltemperaturformat unterstützen" + +#: src/octoprint/templates/dialogs/settings/features.jinja2:61 +msgid "Disable detection of external heatups" +msgstr "Detektierung externer Aufheizvorgänge deaktivieren" + +#: src/octoprint/templates/dialogs/settings/features.jinja2:68 +msgid "Swallow the first \"ok\" after a resend response" +msgstr "Erstes \"ok\" nach Resend ignorieren" + +#: src/octoprint/templates/dialogs/settings/folders.jinja2:3 +msgid "Upload Folder" +msgstr "Uploadverzeichnis" + +#: src/octoprint/templates/dialogs/settings/folders.jinja2:9 +msgid "Timelapse Folder" +msgstr "Zeitrafferverzeichnis" + +#: src/octoprint/templates/dialogs/settings/folders.jinja2:15 +msgid "Timelapse Temp Folder" +msgstr "Temporäres Zeitrafferverzeichnis" + +#: src/octoprint/templates/dialogs/settings/folders.jinja2:21 +msgid "Logs Folder" +msgstr "Logverzeichnis" + +#: src/octoprint/templates/dialogs/settings/folders.jinja2:27 +msgid "Watched Folder" +msgstr "Beobachtetes Verzeichnis" + +#: src/octoprint/templates/dialogs/settings/gcodescripts.jinja2:3 +msgid "Before print job starts" +msgstr "Vor dem Start eines Druckjobs" + +#: src/octoprint/templates/dialogs/settings/gcodescripts.jinja2:9 +msgid "After print job completes" +msgstr "Nach Vollendung eines Druckjobs" + +#: src/octoprint/templates/dialogs/settings/gcodescripts.jinja2:15 +msgid "After print job is cancelled" +msgstr "Nach dem Abbruch eines Druckjobs" + +#: src/octoprint/templates/dialogs/settings/gcodescripts.jinja2:21 +msgid "After print job is paused" +msgstr "Nach dem Pausieren eines Druckjobs" + +#: src/octoprint/templates/dialogs/settings/gcodescripts.jinja2:27 +msgid "Before print job is resumed" +msgstr "Vor dem Fortsetzen eines Druckjobs" + +#: src/octoprint/templates/dialogs/settings/gcodescripts.jinja2:33 +msgid "After connection to printer is established" +msgstr "Nach Verbindung mit dem Drucker" + +#: src/octoprint/templates/dialogs/settings/logs.jinja2:6 +msgid "Modification date" +msgstr "Änderungsdatum" + +#: src/octoprint/templates/dialogs/settings/logs.jinja2:6 +#: src/octoprint/templates/dialogs/settings/logs.jinja2:13 +#: src/octoprint/templates/sidebar/files.jinja2:10 +#: src/octoprint/templates/sidebar/files.jinja2:24 +#: src/octoprint/templates/tabs/timelapse.jinja2:45 +#: src/octoprint/templates/tabs/timelapse.jinja2:51 +msgid "Size" +msgstr "Größe" + +#: src/octoprint/templates/dialogs/settings/logs.jinja2:14 +msgid "Date" +msgstr "Datum" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:6 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:58 +msgid "Model" +msgstr "Modell" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:15 +msgid "Set as default profile" +msgstr "Als Standardprofil festlegen" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:15 +msgid "Edit Profile" +msgstr "Profil bearbeiten" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:34 +msgid "Add Profile..." +msgstr "Profil hinzufügen..." + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:47 +msgid "Name must be set" +msgstr "Name muss gesetzt sein" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:71 +msgid "Form Factor" +msgstr "Formfaktor" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:73 +msgid "Rectangular" +msgstr "Rechteckig" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:76 +msgid "Circular" +msgstr "Rund" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:81 +msgid "Origin" +msgstr "Ursprung" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:89 +msgid "Volume" +msgstr "Volumen" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:91 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:121 +msgid "X" +msgstr "X" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:98 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:131 +msgid "Y" +msgstr "Y" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:105 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:141 +msgid "Z" +msgstr "Z" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:113 +msgid "Heated Bed" +msgstr "Heizbett" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:119 +msgid "Axis" +msgstr "Achse" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:127 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:137 +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:147 +msgid "Invert control" +msgstr "Invertieren" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:151 +msgid "E" +msgstr "E" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:159 +msgid "Nozzle Diameter" +msgstr "Düsendurchmesser" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:168 +msgid "Number of Extruders" +msgstr "Anzahl Extruder" + +#: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:174 +msgid "Nozzle Offsets (relative to first nozzle T0)" +msgstr "Düsenoffsets (relativ zur ersten Düse T0)" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:2 +msgid "Serial port to connect to, setting this to AUTO will make OctoPrint try to automatically find the right setting" +msgstr "Serieller Port, mit der sich verbunden werden soll. Falls AUTO konfiguriert ist wird OctoPrint versuchen, automatisch den richtigen Port zu finden." + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:3 +#: src/octoprint/templates/sidebar/connection.jinja2:1 +msgid "Serial Port" +msgstr "Serialport" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:8 +msgid "Serial baud rate to connect with, setting this to AUTO will make OctoPrint try to automatically find the right setting" +msgstr "Baudrate mit der sich verbunden werden soll. Falls AUTO konfiguriert ist wird OctoPrint versuchen, automatisch die richtige Baudrate zu finden." + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:9 +#: src/octoprint/templates/sidebar/connection.jinja2:3 +msgid "Baudrate" +msgstr "Baudrate" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:14 +msgid "Makes OctoPrint try to connect to the printer automatically during start up" +msgstr "OctoPrint wird versuchen, sich beim Startup automatisch mit dem Drucker zu verbinden" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:17 +msgid "Auto-connect to printer on server start" +msgstr "Automatisch bei Serverstart verbinden" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:21 +msgid "Interval in which to poll for the temperature information from the printer while printing" +msgstr "Intervall in welchem die Temperaturdaten vom Drucker während des Druckens abgerufen werden sollen" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:22 +msgid "Temperature interval" +msgstr "Temperaturintervall" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:30 +msgid "Interval in which to poll for the SD printing status information from the printer while printing" +msgstr "Intervall in welchem die SD-Statusdaten vom Drucker während des Druckens abgerufen werden sollen" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:31 +msgid "SD status interval" +msgstr "SD-Status-Intervall" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:39 +msgid "Time after which the communication with your printer will be considered timed out if nothing was sent by your printer (and an attempt to get it talking again will be done). Increase this if your printer takes longer than this for some moves. This is also the interval in which the temperature will be polled from the printer while not printing." +msgstr "Zeit nach der OctoPrint davon ausgehen wird, dass die Kommunikation mit deinem Drucker unterbrochen wurde falls Dein Drucker keine Daten sendet. OctoPrint wird dann einen Versuch unternehmen, die Kommunikation wieder zu reetablieren. Erhöhe diesen Wert falls Dein Drucker für manche Bewegungen länger braucht. Das ist ebenfalls das Intervall in welchem die Temperaturdaten vom Drucker abgerufen werden wenn gerade kein Druckjob läuft." + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:40 +msgid "Communication timeout" +msgstr "Kommunikationstimeout" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:48 +msgid "Time after which a connection attempt to the printer will be considered as having failed" +msgstr "Zeit nach der ein unbeantworteter Verbindungsversuch als gescheitert angenommen wird" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:49 +msgid "Connection timeout" +msgstr "Verbindungstimeout" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:57 +msgid "Time after which to consider an auto detection attempt to have failed if no successful connection is detected" +msgstr "Zeit nach der ein unbeantworteter Autodetektierungsversuch als gescheitert angenommen wird" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:58 +msgid "Autodetection timeout" +msgstr "Autodetectiontimeout" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:69 +msgid "Log communication to serial.log (might negatively impact performance)" +msgstr "Logge die Kommunikation in das serial.log (kann die Performance negativ beeinflussen)" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:69 +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:60 +msgid "Warning" +msgstr "Warnung" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:74 +msgid "Additional serial ports" +msgstr "Zusätzliche serielle Ports" + +#: src/octoprint/templates/dialogs/settings/serialconnection.jinja2:77 +#, python-format +msgid "Use this to define additional glob patterns matching serial ports to list for connecting against, e.g. /dev/ttyAMA*. One entry per line." +msgstr "Nutze diese Einstellung um zusätzliche glob patterns zu konfigurieren, die auf serielle Ports deines Druckers matchen, z.B. /dev/ttyAMA*. Ein Eintrag pro Zeile." + +#: src/octoprint/templates/dialogs/settings/temperatures.jinja2:2 +msgid "Temperature Graph" +msgstr "Temperaturgraph" + +#: src/octoprint/templates/dialogs/settings/temperatures.jinja2:4 +msgid "Graph cutoff" +msgstr "Graphobergrenze" + +#: src/octoprint/templates/dialogs/settings/temperatures.jinja2:10 +msgid "Needs a restart of OctoPrint to become active." +msgstr "Benötigt einen Neustart von OctoPrint" + +#: src/octoprint/templates/dialogs/settings/temperatures.jinja2:13 +msgid "Temperature Presets" +msgstr "Temperaturvoreinstellungen" + +#: src/octoprint/templates/dialogs/settings/temperatures.jinja2:15 +msgid "Extruder" +msgstr "Extruder" + +#: src/octoprint/templates/dialogs/settings/terminalfilters.jinja2:4 +msgid "RegExp" +msgstr "RegExp" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:2 +msgid "URL to embed into the UI for live viewing of the webcam stream" +msgstr "URL, die in die Oberfläche zum Betrachten des Webcamstreams eingebunden werden soll" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:3 +msgid "Stream URL" +msgstr "Stream-URL" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:8 +msgid "URL to use for retrieving webcam snapshot images for timelapse creation" +msgstr "URL, die genutzt werden soll, um Einzelaufnahmen für die Zeitraffererstellung abzurufen" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:9 +msgid "Snapshot URL" +msgstr "Snapshot-URL" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:14 +msgid "Full path to the FFMPEG binary" +msgstr "Vollständiger Pfad zu FFMPEG" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:15 +msgid "Path to FFMPEG" +msgstr "Pfad zu FFMPEG" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:20 +msgid "Bitrate to use for encoding the timelapse video" +msgstr "Bitrate für die Enkodierung der Zeitrafferaufnahme" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:21 +msgid "Timelapse bitrate" +msgstr "Zeitrafferbitrate" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:26 +msgid "Number of FFMPEG encoding threads" +msgstr "Anzahl der FFMPEG Enkodierungsthreads" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:27 +msgid "FFMPEG threads" +msgstr "FFMPEG Threads" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:35 +msgid "Enable OctoPrint watermark in timelapse movies" +msgstr "OctoPrint Wasserzeichen in Zeitrafferaufnahmen aktivieren" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:42 +msgid "Flip webcam horizontally" +msgstr "Webcam horizontal flippen" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:47 +msgid "Flip webcam vertically" +msgstr "Webcam vertikal flippen" + +#: src/octoprint/templates/dialogs/settings/webcam.jinja2:52 +msgid "Rotate webcam 90 degrees counter clockwise" +msgstr "Webcam um 90° gegen den Uhrzeigersinn rotieren" + +#: src/octoprint/templates/dialogs/usersettings/access.jinja2:5 +msgid "If you do not wish to change your password, just leave the following fields empty." +msgstr "Falls Du Dein Passwort nicht ändern willst, lass die folgenden Felder leer." + +#: src/octoprint/templates/dialogs/usersettings/interface.jinja2:3 +msgid "Language" +msgstr "Sprache" + +#: src/octoprint/templates/dialogs/usersettings/interface.jinja2:11 +msgid "Changes to the interface language will only become active after a reload of the page." +msgstr "Änderungen der Oberflächensprache werden erst nach einem Neuladen der Seite aktiv." + +#: src/octoprint/templates/navbar/login.jinja2:11 +msgid "Remember me" +msgstr "Login merken" + +#: src/octoprint/templates/navbar/login.jinja2:17 +msgid "Logout" +msgstr "Logout" + +#: src/octoprint/templates/navbar/settings.jinja2:2 +msgid "Settings" +msgstr "Einstellungen" + +#: src/octoprint/templates/navbar/systemmenu.jinja2:2 +msgid "System" +msgstr "System" + +#: src/octoprint/templates/overlays/dragndrop.jinja2:5 +msgid "Upload locally" +msgstr "Upload (lokal)" + +#: src/octoprint/templates/overlays/dragndrop.jinja2:7 +#: src/octoprint/templates/sidebar/files.jinja2:49 +msgid "Upload to SD" +msgstr "Upload (SD)" + +#: src/octoprint/templates/overlays/dragndrop.jinja2:7 +msgid "SD not initialized" +msgstr "SD-Karte ist nicht initialisiert" + +#: src/octoprint/templates/overlays/offline.jinja2:9 +msgid "Attempt to reconnect" +msgstr "Erneut verbinden" + +#: src/octoprint/templates/sidebar/connection.jinja2:8 +msgid "Save connection settings" +msgstr "Verbindungseinstellungen speichern" + +#: src/octoprint/templates/sidebar/connection.jinja2:11 +msgid "Auto-connect on server startup" +msgstr "Automatisch bei Serverstart verbinden" + +#: src/octoprint/templates/sidebar/files.jinja2:9 +#: src/octoprint/templates/sidebar/files.jinja2:23 +msgid "Uploaded" +msgstr "Hochgeladen" + +#: src/octoprint/templates/sidebar/files.jinja2:14 +#: src/octoprint/templates/sidebar/files.jinja2:26 +msgid "Download" +msgstr "Download" + +#: src/octoprint/templates/sidebar/files.jinja2:15 +#: src/octoprint/templates/sidebar/files.jinja2:27 +msgid "Remove" +msgstr "Entfernen" + +#: src/octoprint/templates/sidebar/files.jinja2:16 +msgid "Load" +msgstr "Laden" + +#: src/octoprint/templates/sidebar/files.jinja2:17 +msgid "Load and Print" +msgstr "Laden und Drucken" + +#: src/octoprint/templates/sidebar/files.jinja2:37 +msgid "Free" +msgstr "Frei" + +#: src/octoprint/templates/sidebar/files.jinja2:64 +msgid "Hint: You can also drag and drop files on this page to upload them." +msgstr "Hinweis: Du kannst auch Dateien auf diese Seite ziehen um sie hochzuladen." + +#: src/octoprint/templates/sidebar/files_header.jinja2:6 +msgid "Sort by name" +msgstr "Nach Name sortieren" + +#: src/octoprint/templates/sidebar/files_header.jinja2:7 +msgid "Sort by upload date" +msgstr "Nach Uploaddatum sortieren" + +#: src/octoprint/templates/sidebar/files_header.jinja2:8 +msgid "Sort by file size" +msgstr "Nach Größe sortieren" + +#: src/octoprint/templates/sidebar/files_header.jinja2:10 +msgid "Only show GCode files" +msgstr "Nur GCode Dateien anzeigen" + +#: src/octoprint/templates/sidebar/files_header.jinja2:11 +msgid "Only show STL files" +msgstr "Nur STL Dateien anzeigen" + +#: src/octoprint/templates/sidebar/files_header.jinja2:14 +msgid "Only show files stored locally" +msgstr "Nur lokal abgelegte Dateien anzeigen" + +#: src/octoprint/templates/sidebar/files_header.jinja2:15 +msgid "Only show files stored on SD" +msgstr "Nur auf SD abgelegte Dateien anzeigen" + +#: src/octoprint/templates/sidebar/files_header.jinja2:18 +msgid "Hide successfully printed files" +msgstr "Erfolgreich gedruckte Dateien verbergen" + +#: src/octoprint/templates/sidebar/files_header.jinja2:28 +msgid "Initialize SD card" +msgstr "SD-Karte initialisieren" + +#: src/octoprint/templates/sidebar/files_header.jinja2:29 +msgid "Refresh SD files" +msgstr "SD-Dateien aktualisieren" + +#: src/octoprint/templates/sidebar/files_header.jinja2:30 +msgid "Release SD card" +msgstr "SD-Karte auswerfen" + +#: src/octoprint/templates/sidebar/state.jinja2:1 +msgid "Machine State" +msgstr "Druckerstatus" + +#: src/octoprint/templates/sidebar/state.jinja2:2 +msgid "File" +msgstr "Datei" + +#: src/octoprint/templates/sidebar/state.jinja2:7 +msgid "Approx. Total Print Time" +msgstr "Ungefähre Druckdauer" + +#: src/octoprint/templates/sidebar/state.jinja2:8 +msgid "Print Time" +msgstr "Druckdauer" + +#: src/octoprint/templates/sidebar/state.jinja2:9 +msgid "Print Time Left" +msgstr "Verbleibende Druckdauer" + +#: src/octoprint/templates/sidebar/state.jinja2:10 +msgid "Printed" +msgstr "Gedruckt" + +#: src/octoprint/templates/sidebar/state.jinja2:17 +msgid "Restart" +msgstr "Restart" + +#: src/octoprint/templates/sidebar/state.jinja2:17 +msgid "Print" +msgstr "Drucken" + +#: src/octoprint/templates/sidebar/state.jinja2:18 +msgid "Resume" +msgstr "Weiter" + +#: src/octoprint/templates/sidebar/state.jinja2:19 +msgid "Cancels the print job" +msgstr "Bricht den Druckjob ab" + +#: src/octoprint/templates/tabs/control.jinja2:7 +msgid "Keyboard controls active" +msgstr "Tastatursteuerung aktiv" + +#: src/octoprint/templates/tabs/control.jinja2:10 +msgid "X Axis" +msgstr "X-Achse" + +#: src/octoprint/templates/tabs/control.jinja2:11 +msgid "Y Axis" +msgstr "Y-Achse" + +#: src/octoprint/templates/tabs/control.jinja2:12 +msgid "Page↑" +msgstr "Bild↑" + +#: src/octoprint/templates/tabs/control.jinja2:12 +msgid "Page↓" +msgstr "Bild↓" + +#: src/octoprint/templates/tabs/control.jinja2:12 +msgid "Z Axis" +msgstr "Z-Achse" + +#: src/octoprint/templates/tabs/control.jinja2:15 +msgid "Home X/Y" +msgstr "Home X/Y" + +#: src/octoprint/templates/tabs/control.jinja2:16 +msgid "Home Z" +msgstr "Home Z" + +#: src/octoprint/templates/tabs/control.jinja2:17 +msgid "Stepsize" +msgstr "Schrittgröße" + +#: src/octoprint/templates/tabs/control.jinja2:23 +msgid "Hint: If you move your mouse over the picture, you enter keyboard control mode." +msgstr "Hinweis: Bewegen der Maus über das Bild aktiviert die Tastatursteuerung" + +#: src/octoprint/templates/tabs/control.jinja2:69 +msgid "Feed rate:" +msgstr "Feedrate:" + +#: src/octoprint/templates/tabs/control.jinja2:77 +msgid "Select Tool..." +msgstr "Werkzeug wählen..." + +#: src/octoprint/templates/tabs/control.jinja2:88 +msgid "Extrude" +msgstr "Extrude" + +#: src/octoprint/templates/tabs/control.jinja2:89 +msgid "Retract" +msgstr "Retract" + +#: src/octoprint/templates/tabs/control.jinja2:93 +msgid "Flow rate:" +msgstr "Flowrate:" + +#: src/octoprint/templates/tabs/control.jinja2:100 +msgid "Motors off" +msgstr "Motoren aus" + +#: src/octoprint/templates/tabs/control.jinja2:101 +msgid "Fan on" +msgstr "Lüfter an" + +#: src/octoprint/templates/tabs/control.jinja2:102 +msgid "Fan off" +msgstr "Lüfter aus" + +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:12 +msgid "Model info" +msgstr "Modelinformationen" + +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:19 +msgid "Renderer options" +msgstr "Rendereroptionen" + +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:23 +msgid "Sync with job progress" +msgstr "Job mit Fortschritt synchronisieren" + +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:28 +msgid "Center viewport on model" +msgstr "Ausschnitt auf Modell zentrieren" + +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:31 +msgid "Zoom in on model" +msgstr "Auf Model zoomen" + +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:37 +msgid "Show moves" +msgstr "Bewegungen zeigen" + +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:40 +msgid "Show retracts" +msgstr "Retracts zeigen" + +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:46 +msgid "Also show previous layer" +msgstr "Auch vorherige Schicht anzeigen" + +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:49 +msgid "Also show next layer" +msgstr "Auch nächste Schicht anzeigen" + +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:54 +msgid "Reload" +msgstr "Neu laden" + +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:61 +msgid "" +"

\n" +" You've selected for printing which has a size of\n" +" . Depending on your machine this\n" +" might be too large for rendering and cause your browser to become unresponsive or crash.\n" +"

\n" +"\n" +"

\n" +" Are you sure you want to visualize this file nevertheless?\n" +"

" +msgstr "" +"

\n" +" Du hast zum Drucken ausgewählt das\n" +" groß ist. Abhängig von Deinem\n" +" System könnte das zu groß zum Rendern sein und Deinen Browser zum Absturz bringen. might be too large for rendering and cause your browser to become unresponsive or crash.\n" +"

\n" +"\n" +"

\n" +" Bist Du sicher, dass du die Datei trotzdem visualisieren willst?\n" +"

" + +#: src/octoprint/templates/tabs/gcodeviewer.jinja2:72 +#, python-format +msgid "Yes, please visualize %(name)s regardless of its size" +msgstr "Ja, bitte visualisiere %(name)s unabhängig seiner Größe" + +#: src/octoprint/templates/tabs/temperature.jinja2:13 +msgid "Offset" +msgstr "Offset" + +#: src/octoprint/templates/tabs/temperature.jinja2:29 +#: src/octoprint/templates/tabs/temperature.jinja2:51 +msgid "Set" +msgstr "Setzen" + +#: src/octoprint/templates/tabs/temperature.jinja2:41 +#: src/octoprint/templates/tabs/timelapse.jinja2:6 +msgid "Off" +msgstr "Aus" + +#: src/octoprint/templates/tabs/terminal.jinja2:3 +msgid "Autoscroll" +msgstr "Autoscroll" + +#: src/octoprint/templates/tabs/terminal.jinja2:4 +msgid "Scroll to end" +msgstr "Zum Ende scrollen" + +#: src/octoprint/templates/tabs/terminal.jinja2:4 +msgid "Select all" +msgstr "Alles auswählen" + +#: src/octoprint/templates/tabs/terminal.jinja2:18 +msgid "Send" +msgstr "Senden" + +#: src/octoprint/templates/tabs/terminal.jinja2:20 +msgid "Hint: Use the arrow up/down keys to recall commands sent previously" +msgstr "Hinweis: Nutze die Pfeil hoch/runter Tasten um vorher versandte Kommandos wiederaufzurufen " + +#: src/octoprint/templates/tabs/terminal.jinja2:25 +msgid "Advanced options" +msgstr "Erweiterte Optionen" + +#: src/octoprint/templates/tabs/terminal.jinja2:27 +msgid "Fake Acknowledgement" +msgstr "Bestätigung faken" + +#: src/octoprint/templates/tabs/terminal.jinja2:28 +msgid "If acknowledgements (\"ok\"s) sent by the firmware get lost due to issues with the serial communication to your printer, OctoPrint's communication with it can become stuck. If that happens, this can help. Please be advised that such occurences hint at general communication issues with your printer which will probably negatively influence your printing results and which you should therefore try to resolve!" +msgstr "Falls Bestätigungen (\"ok\"s) Deiner Firmware aufgrund von Kommunikationsproblemen mit Deinem Drucker verloren gehen, kann die Kommunikation zwischen OctoPrint und Deinem Drucker zum Stillstand kommen. Falls das passiert, kann das hier helfen. Bitte bedenke, dass solche Vorfälle ein Hinweis auf ein generelles Kommunikationsproblem mit Deinem Drucker hindeuten, das wahrscheinlich Deine Druckergebnisse negativ beeinflusst und dass du daher versuchen solltest, zu beseitigen!" + +#: src/octoprint/templates/tabs/timelapse.jinja2:2 +msgid "Timelapse Configuration" +msgstr "Zeitrafferkonfiguration" + +#: src/octoprint/templates/tabs/timelapse.jinja2:4 +msgid "Timelapse Mode" +msgstr "Zeitraffermodus" + +#: src/octoprint/templates/tabs/timelapse.jinja2:11 +msgid "Timelapse frame rate (in frames per second)" +msgstr "Zeitrafferbildrate (in Bildern pro Sekunde)" + +#: src/octoprint/templates/tabs/timelapse.jinja2:14 +msgid "fps" +msgstr "FPS" + +#: src/octoprint/templates/tabs/timelapse.jinja2:17 +msgid "Timelapse post roll (in rendered seconds)" +msgstr "Zeitraffernachlauf (in gerenderten Sekunden)" + +#: src/octoprint/templates/tabs/timelapse.jinja2:24 +msgid "Interval" +msgstr "Intervall" + +#: src/octoprint/templates/tabs/timelapse.jinja2:33 +msgid "Save as default" +msgstr "Als Standard speichern" + +#: src/octoprint/templates/tabs/timelapse.jinja2:38 +msgid "Save config" +msgstr "Konfiguration speichern" + +#: src/octoprint/templates/tabs/timelapse.jinja2:42 +msgid "Finished Timelapses" +msgstr "Abgeschlossene Zeitraffer" + +#: src/octoprint/templates/tabs/timelapse.jinja2:45 +msgid "Creation date" +msgstr "Erstellungsdatum" + +#~ msgid "Total filament used" +#~ msgstr "Gesamtmenge genutzten Filaments" + +#~ msgid "Estimated print time" +#~ msgstr "Geschätzte Druckdauer" + +#~ msgid "Change Password" +#~ msgstr "Passwort ändern" + +#~ msgid "SD status timeout" +#~ msgstr "SD-Status-Timeout" + +#~ msgid "Extruder Offsets" +#~ msgstr "Extruderoffsets" + +#~ msgid "Edit Cura Profile" +#~ msgstr "Profil bearbeiten" + +#~ msgid "Basic" +#~ msgstr "Schwarz" + +#~ msgid "Layer height (mm)" +#~ msgstr "Schichthöhe" + +#~ msgid "Speed and Temperature" +#~ msgstr "Temperatur" + +#~ msgid "Print temperature (°C)" +#~ msgstr "Temperatur" + +#~ msgid "None" +#~ msgstr "Orange" + +#~ msgid "Touching buildplate" +#~ msgstr "Detektiere Baudrate" + diff --git a/src/octoprint/translations/messages.pot b/translations/messages.pot similarity index 95% rename from src/octoprint/translations/messages.pot rename to translations/messages.pot index 49d927e5..ad8d916d 100644 --- a/src/octoprint/translations/messages.pot +++ b/translations/messages.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: OctoPrint 1.2.0-dev-880-gff9765f-dirty\n" +"Project-Id-Version: OctoPrint 1.2.0-dev-884-g449dd43-dirty\n" "Report-Msgid-Bugs-To: i18n@octoprint.org\n" -"POT-Creation-Date: 2015-05-29 17:21+0200\n" +"POT-Creation-Date: 2015-06-02 13:09+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -98,6 +98,7 @@ msgstr "" #: src/octoprint/plugins/cura/templates/cura_settings.jinja2:68 #: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:132 +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:71 msgid "Browse..." msgstr "" @@ -385,6 +386,7 @@ msgstr "" #: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:51 #: src/octoprint/plugins/pluginmanager/templates/pluginmanager_settings.jinja2:143 +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:82 msgid "Close" msgstr "" @@ -465,77 +467,77 @@ msgid "" "\".tar.gz\", \".tgz\" or \".tar\"" msgstr "" -#: src/octoprint/server/__init__.py:224 +#: src/octoprint/server/views.py:123 msgid "Connection" msgstr "" -#: src/octoprint/server/__init__.py:225 +#: src/octoprint/server/views.py:124 msgid "State" msgstr "" -#: src/octoprint/server/__init__.py:226 +#: src/octoprint/server/views.py:125 msgid "Files" msgstr "" -#: src/octoprint/server/__init__.py:232 +#: src/octoprint/server/views.py:131 msgid "Temperature" msgstr "" -#: src/octoprint/server/__init__.py:233 +#: src/octoprint/server/views.py:132 msgid "Control" msgstr "" -#: src/octoprint/server/__init__.py:234 +#: src/octoprint/server/views.py:133 msgid "Terminal" msgstr "" -#: src/octoprint/server/__init__.py:237 +#: src/octoprint/server/views.py:136 msgid "GCode Viewer" msgstr "" -#: src/octoprint/server/__init__.py:239 +#: src/octoprint/server/views.py:138 #: src/octoprint/templates/sidebar/state.jinja2:3 msgid "Timelapse" msgstr "" -#: src/octoprint/server/__init__.py:244 +#: src/octoprint/server/views.py:143 msgid "Printer" msgstr "" -#: src/octoprint/server/__init__.py:246 +#: src/octoprint/server/views.py:145 msgid "Serial Connection" msgstr "" -#: src/octoprint/server/__init__.py:247 +#: src/octoprint/server/views.py:146 #: src/octoprint/templates/dialogs/settings/printerprofiles.jinja2:1 msgid "Printer Profiles" msgstr "" -#: src/octoprint/server/__init__.py:248 +#: src/octoprint/server/views.py:147 msgid "Temperatures" msgstr "" -#: src/octoprint/server/__init__.py:249 +#: src/octoprint/server/views.py:148 msgid "Terminal Filters" msgstr "" -#: src/octoprint/server/__init__.py:250 +#: src/octoprint/server/views.py:149 msgid "GCODE Scripts" msgstr "" -#: src/octoprint/server/__init__.py:252 src/octoprint/server/__init__.py:254 +#: src/octoprint/server/views.py:151 src/octoprint/server/views.py:153 msgid "Features" msgstr "" -#: src/octoprint/server/__init__.py:255 +#: src/octoprint/server/views.py:154 msgid "Webcam" msgstr "" -#: src/octoprint/server/__init__.py:256 +#: src/octoprint/server/views.py:155 msgid "API" msgstr "" -#: src/octoprint/server/__init__.py:258 +#: src/octoprint/server/views.py:157 #: src/octoprint/static/js/app/viewmodels/appearance.js:11 #: src/octoprint/static/js/app/viewmodels/appearance.js:13 #: src/octoprint/static/js/app/viewmodels/appearance.js:18 @@ -543,32 +545,32 @@ msgstr "" msgid "OctoPrint" msgstr "" -#: src/octoprint/server/__init__.py:260 +#: src/octoprint/server/views.py:159 msgid "Folders" msgstr "" -#: src/octoprint/server/__init__.py:261 +#: src/octoprint/server/views.py:160 msgid "Appearance" msgstr "" -#: src/octoprint/server/__init__.py:262 +#: src/octoprint/server/views.py:161 #: src/octoprint/templates/dialogs/settings/logs.jinja2:2 msgid "Logs" msgstr "" -#: src/octoprint/server/__init__.py:265 +#: src/octoprint/server/views.py:164 msgid "Access Control" msgstr "" -#: src/octoprint/server/__init__.py:271 +#: src/octoprint/server/views.py:170 msgid "Access" msgstr "" -#: src/octoprint/server/__init__.py:272 +#: src/octoprint/server/views.py:171 msgid "Interface" msgstr "" -#: src/octoprint/server/__init__.py:359 +#: src/octoprint/server/views.py:258 msgid "Plugins" msgstr "" @@ -890,44 +892,44 @@ msgid "Error" msgstr "" #: src/octoprint/static/js/app/viewmodels/printerprofiles.js:96 -#: src/octoprint/static/js/app/viewmodels/settings.js:21 -#: src/octoprint/static/js/app/viewmodels/settings.js:51 +#: src/octoprint/static/js/app/viewmodels/settings.js:52 +#: src/octoprint/static/js/app/viewmodels/settings.js:82 msgid "default" msgstr "" #: src/octoprint/static/js/app/viewmodels/printerprofiles.js:97 -#: src/octoprint/static/js/app/viewmodels/settings.js:22 -#: src/octoprint/static/js/app/viewmodels/settings.js:35 +#: src/octoprint/static/js/app/viewmodels/settings.js:53 +#: src/octoprint/static/js/app/viewmodels/settings.js:66 msgid "red" msgstr "" #: src/octoprint/static/js/app/viewmodels/printerprofiles.js:98 -#: src/octoprint/static/js/app/viewmodels/settings.js:23 -#: src/octoprint/static/js/app/viewmodels/settings.js:37 +#: src/octoprint/static/js/app/viewmodels/settings.js:54 +#: src/octoprint/static/js/app/viewmodels/settings.js:68 msgid "orange" msgstr "" #: src/octoprint/static/js/app/viewmodels/printerprofiles.js:99 -#: src/octoprint/static/js/app/viewmodels/settings.js:24 -#: src/octoprint/static/js/app/viewmodels/settings.js:39 +#: src/octoprint/static/js/app/viewmodels/settings.js:55 +#: src/octoprint/static/js/app/viewmodels/settings.js:70 msgid "yellow" msgstr "" #: src/octoprint/static/js/app/viewmodels/printerprofiles.js:100 -#: src/octoprint/static/js/app/viewmodels/settings.js:25 -#: src/octoprint/static/js/app/viewmodels/settings.js:41 +#: src/octoprint/static/js/app/viewmodels/settings.js:56 +#: src/octoprint/static/js/app/viewmodels/settings.js:72 msgid "green" msgstr "" #: src/octoprint/static/js/app/viewmodels/printerprofiles.js:101 -#: src/octoprint/static/js/app/viewmodels/settings.js:26 -#: src/octoprint/static/js/app/viewmodels/settings.js:43 +#: src/octoprint/static/js/app/viewmodels/settings.js:57 +#: src/octoprint/static/js/app/viewmodels/settings.js:74 msgid "blue" msgstr "" #: src/octoprint/static/js/app/viewmodels/printerprofiles.js:102 -#: src/octoprint/static/js/app/viewmodels/settings.js:28 -#: src/octoprint/static/js/app/viewmodels/settings.js:47 +#: src/octoprint/static/js/app/viewmodels/settings.js:59 +#: src/octoprint/static/js/app/viewmodels/settings.js:78 msgid "black" msgstr "" @@ -1033,17 +1035,17 @@ msgstr "" msgid "This will restart the print job from the beginning." msgstr "" -#: src/octoprint/static/js/app/viewmodels/settings.js:27 -#: src/octoprint/static/js/app/viewmodels/settings.js:45 +#: src/octoprint/static/js/app/viewmodels/settings.js:58 +#: src/octoprint/static/js/app/viewmodels/settings.js:76 msgid "violet" msgstr "" -#: src/octoprint/static/js/app/viewmodels/settings.js:29 -#: src/octoprint/static/js/app/viewmodels/settings.js:49 +#: src/octoprint/static/js/app/viewmodels/settings.js:60 +#: src/octoprint/static/js/app/viewmodels/settings.js:80 msgid "white" msgstr "" -#: src/octoprint/static/js/app/viewmodels/settings.js:57 +#: src/octoprint/static/js/app/viewmodels/settings.js:88 msgid "Autodetect from browser" msgstr "" @@ -1398,16 +1400,46 @@ msgid "Transparent Color" msgstr "" #: src/octoprint/templates/dialogs/settings/appearance.jinja2:23 +msgid "Language Packs" +msgstr "" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:25 +msgid "Manage..." +msgstr "" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:29 msgid "Default Language" msgstr "" -#: src/octoprint/templates/dialogs/settings/appearance.jinja2:30 +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:36 msgid "" "Changes to the default interface language will only become active after a" " reload of the page and only be active if not overridden by the users " "language settings." msgstr "" +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:44 +msgid "Manage Language Packs..." +msgstr "" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:58 +msgid "Delete" +msgstr "" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:76 +#: src/octoprint/templates/overlays/dragndrop.jinja2:10 +#: src/octoprint/templates/sidebar/files.jinja2:44 +#: src/octoprint/templates/sidebar/files.jinja2:55 +msgid "Upload" +msgstr "" + +#: src/octoprint/templates/dialogs/settings/appearance.jinja2:78 +msgid "" +"This does not look like a valid language pack. Valid language packs " +"should be either zip files or tarballs and have the extension \".zip\", " +"\".tar.gz\", \".tgz\" or \".tar\"" +msgstr "" + #: src/octoprint/templates/dialogs/settings/features.jinja2:5 msgid "Enable Temperature Graph" msgstr "" @@ -1836,12 +1868,6 @@ msgstr "" msgid "SD not initialized" msgstr "" -#: src/octoprint/templates/overlays/dragndrop.jinja2:10 -#: src/octoprint/templates/sidebar/files.jinja2:44 -#: src/octoprint/templates/sidebar/files.jinja2:55 -msgid "Upload" -msgstr "" - #: src/octoprint/templates/overlays/offline.jinja2:9 msgid "Attempt to reconnect" msgstr "" From 52dd2ad7acf0d6a9d82b22e2f3552b0e12405caa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Tue, 2 Jun 2015 13:39:10 +0200 Subject: [PATCH 4/4] Management dialog for language packs Allows managing language packs of core OctoPrint and plugins. --- src/octoprint/server/__init__.py | 3 +- src/octoprint/server/api/__init__.py | 1 + src/octoprint/server/api/languages.py | 147 ++++++++++++++++++ .../static/js/app/viewmodels/settings.js | 137 +++++++++++++++- .../dialogs/settings/appearance.jinja2 | 51 ++++++ 5 files changed, 336 insertions(+), 3 deletions(-) create mode 100644 src/octoprint/server/api/languages.py diff --git a/src/octoprint/server/__init__.py b/src/octoprint/server/__init__.py index 43fd5247..16e6971a 100644 --- a/src/octoprint/server/__init__.py +++ b/src/octoprint/server/__init__.py @@ -331,7 +331,8 @@ class Server(): self._tornado_app = Application(server_routes) max_body_sizes = [ - ("POST", r"/api/files/([^/]*)", s.getInt(["server", "uploads", "maxSize"])) + ("POST", r"/api/files/([^/]*)", s.getInt(["server", "uploads", "maxSize"])), + ("POST", r"/api/languages", 5 * 1024 * 1024) ] # allow plugins to extend allowed maximum body sizes diff --git a/src/octoprint/server/api/__init__.py b/src/octoprint/server/api/__init__.py index 056319bb..d50bb922 100644 --- a/src/octoprint/server/api/__init__.py +++ b/src/octoprint/server/api/__init__.py @@ -37,6 +37,7 @@ from . import users as api_users from . import log as api_logs from . import slicing as api_slicing from . import printer_profiles as api_printer_profiles +from . import languages as api_languages VERSION = "0.1" diff --git a/src/octoprint/server/api/languages.py b/src/octoprint/server/api/languages.py new file mode 100644 index 00000000..a3690f74 --- /dev/null +++ b/src/octoprint/server/api/languages.py @@ -0,0 +1,147 @@ +# coding=utf-8 +from __future__ import absolute_import + +__author__ = "Gina Häußge " +__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' +__copyright__ = "Copyright (C) 2015 The OctoPrint Project - Released under terms of the AGPLv3 License" + +import os +import tarfile +import zipfile + +from collections import defaultdict + +from flask import request, jsonify, make_response + +from octoprint.settings import settings + +from octoprint.server import admin_permission +from octoprint.server.api import api +from octoprint.server.util.flask import restricted_access + +from octoprint.plugin import plugin_manager + +from flask.ext.babel import Locale + +@api.route("/languages", methods=["GET"]) +@restricted_access +@admin_permission.require(403) +def getInstalledLanguagePacks(): + translation_folder = settings().getBaseFolder("translations") + if not os.path.exists(translation_folder): + return jsonify(language_packs=dict(_core=[])) + + core_packs = [] + plugin_packs = defaultdict(lambda: dict(identifier=None, display=None, languages=[])) + for folder in os.listdir(translation_folder): + path = os.path.join(translation_folder, folder) + + if not os.path.isdir(path): + continue + + def load_meta(path, locale): + meta = dict() + + meta_path = os.path.join(path, "meta.yaml") + if os.path.isfile(meta_path): + import yaml + try: + with open(meta_path) as f: + meta = yaml.safe_load(f) + except: + pass + else: + import datetime + if "last_update" in meta and isinstance(meta["last_update"], datetime.datetime): + meta["last_update"] = (meta["last_update"] - datetime.datetime(1970,1,1)).total_seconds() + + l = Locale.parse(locale) + meta["locale"] = locale + meta["locale_display"] = l.display_name + meta["locale_english"] = l.english_name + return meta + + if folder == "_plugins": + for plugin_folder in os.listdir(path): + plugin_path = os.path.join(path, plugin_folder) + if not os.path.isdir(plugin_path): + continue + + if not plugin_folder in plugin_manager().plugins: + continue + + plugin_info = plugin_manager().plugins[plugin_folder] + + plugin_packs[plugin_folder]["identifier"] = plugin_folder + plugin_packs[plugin_folder]["display"] = plugin_info.name + + for language_folder in os.listdir(plugin_path): + plugin_packs[plugin_folder]["languages"].append(load_meta(os.path.join(plugin_path, language_folder), language_folder)) + else: + core_packs.append(load_meta(os.path.join(translation_folder, folder), folder)) + + result = dict(_core=dict(identifier="_core", display="Core", languages=core_packs)) + result.update(plugin_packs) + return jsonify(language_packs=result) + +@api.route("/languages", methods=["POST"]) +@restricted_access +@admin_permission.require(403) +def uploadLanguagePack(): + input_name = "file" + input_upload_path = input_name + "." + settings().get(["server", "uploads", "pathSuffix"]) + if not input_upload_path in request.values: + return make_response("No file included", 400) + + upload_path = request.values[input_upload_path] + + target_path = settings().getBaseFolder("translations") + + if tarfile.is_tarfile(upload_path): + _unpack_uploaded_tarball(upload_path, target_path) + elif zipfile.is_zipfile(upload_path): + _unpack_uploaded_zipfile(upload_path, target_path) + else: + return make_response("Neither zip file nor tarball included", 400) + + return getInstalledLanguagePacks() + +@api.route("/languages//", methods=["DELETE"]) +@restricted_access +@admin_permission.require(403) +def deleteInstalledLanguagePack(locale, pack): + + if pack == "_core": + target_path = os.path.join(settings().getBaseFolder("translations"), locale) + else: + target_path = os.path.join(settings().getBaseFolder("translations"), "_plugins", pack, locale) + + if os.path.isdir(target_path): + import shutil + shutil.rmtree(target_path) + + return getInstalledLanguagePacks() + +def _unpack_uploaded_zipfile(path, target): + with zipfile.ZipFile(path, "r") as zip: + # sanity check + map(_validate_archive_name, zip.namelist()) + + # unpack everything + zip.extractall(target) + +def _unpack_uploaded_tarball(path, target): + with tarfile.open(path, "r") as tar: + # sanity check + map(_validate_archive_name, tar.getmembers()) + + # unpack everything + tar.extractall(target) + +def _validate_archive_name(name): + if name.startswith("/") or ".." in name: + raise InvalidLanguagePack("Provided language pack contains invalid name {name}".format(**locals())) + + +class InvalidLanguagePack(BaseException): + pass diff --git a/src/octoprint/static/js/app/viewmodels/settings.js b/src/octoprint/static/js/app/viewmodels/settings.js index 7ea41078..2c243653 100644 --- a/src/octoprint/static/js/app/viewmodels/settings.js +++ b/src/octoprint/static/js/app/viewmodels/settings.js @@ -16,6 +16,37 @@ $(function() { self.appearance_defaultLanguage = ko.observable(); self.settingsDialog = undefined; + self.translationManagerDialog = undefined; + self.translationUploadElement = $("#settings_appearance_managelanguagesdialog_upload"); + self.translationUploadButton = $("#settings_appearance_managelanguagesdialog_upload_start"); + + self.translationUploadFilename = ko.observable(); + self.invalidTranslationArchive = ko.computed(function() { + var name = self.translationUploadFilename(); + return name !== undefined && !(_.endsWith(name.toLocaleLowerCase(), ".zip") || _.endsWith(name.toLocaleLowerCase(), ".tar.gz") || _.endsWith(name.toLocaleLowerCase(), ".tgz") || _.endsWith(name.toLocaleLowerCase(), ".tar")); + }); + self.enableTranslationUpload = ko.computed(function() { + var name = self.translationUploadFilename(); + return name !== undefined && name.trim() != "" && !self.invalidTranslationArchive(); + }); + + self.translations = new ItemListHelper( + "settings.translations", + { + "locale": function (a, b) { + // sorts ascending + if (a["locale"].toLocaleLowerCase() < b["locale"].toLocaleLowerCase()) return -1; + if (a["locale"].toLocaleLowerCase() > b["locale"].toLocaleLowerCase()) return 1; + return 0; + } + }, + { + }, + "locale", + [], + [], + 0 + ); self.appearance_available_colors = ko.observable([ {key: "default", name: gettext("default")}, @@ -108,7 +139,7 @@ $(function() { self.scripts_gcode_afterPrintPaused = ko.observable(undefined); self.scripts_gcode_beforePrintResumed = ko.observable(undefined); self.scripts_gcode_afterPrinterConnected = ko.observable(undefined); - + self.temperature_profiles = ko.observableArray(undefined); self.temperature_cutoff = ko.observable(undefined); @@ -140,11 +171,43 @@ $(function() { self.onStartup = function() { self.settingsDialog = $('#settings_dialog'); + self.translationManagerDialog = $('#settings_appearance_managelanguagesdialog'); + self.translationUploadElement = $("#settings_appearance_managelanguagesdialog_upload"); + self.translationUploadButton = $("#settings_appearance_managelanguagesdialog_upload_start"); + + self.translationUploadElement.fileupload({ + dataType: "json", + maxNumberOfFiles: 1, + autoUpload: false, + add: function(e, data) { + if (data.files.length == 0) { + return false; + } + + self.translationUploadFilename(data.files[0].name); + + self.translationUploadButton.unbind("click"); + self.translationUploadButton.bind("click", function() { + data.submit(); + return false; + }); + }, + done: function(e, data) { + self.translationUploadButton.unbind("click"); + self.translationUploadFilename(undefined); + self.fromTranslationResponse(data.result); + }, + fail: function(e, data) { + self.translationUploadButton.unbind("click"); + self.translationUploadFilename(undefined); + } + }); }; self.onAllBound = function(allViewModels) { self.settingsDialog.on('show', function(event) { if (event.target.id == "settings_dialog") { + self.requestTranslationData(); _.each(allViewModels, function(viewModel) { if (viewModel.hasOwnProperty("onSettingsShown")) { viewModel.onSettingsShown(); @@ -182,6 +245,11 @@ $(function() { return false; }; + self.showTranslationManager = function() { + self.translationManagerDialog.modal(); + return false; + }; + self.requestData = function(callback) { $.ajax({ url: API_BASEURL + "settings", @@ -194,6 +262,71 @@ $(function() { }); }; + self.requestTranslationData = function(callback) { + $.ajax({ + url: API_BASEURL + "languages", + type: "GET", + dataType: "json", + success: function(response) { + self.fromTranslationResponse(response); + if (callback) callback(); + } + }) + }; + + self.fromTranslationResponse = function(response) { + var translationsByLocale = {}; + _.each(response.language_packs, function(item, key) { + _.each(item.languages, function(pack) { + var locale = pack.locale; + if (!_.has(translationsByLocale, locale)) { + translationsByLocale[locale] = { + locale: locale, + display: pack.locale_display, + english: pack.locale_english, + packs: [] + }; + } + + translationsByLocale[locale]["packs"].push({ + identifier: key, + display: item.display, + pack: pack + }); + }); + }); + + var translations = []; + _.each(translationsByLocale, function(item) { + item["packs"].sort(function(a, b) { + if (a.identifier == "_core") return -1; + if (b.identifier == "_core") return 1; + + if (a.display < b.display) return -1; + if (a.display > b.display) return 1; + return 0; + }); + translations.push(item); + }); + + self.translations.updateItems(translations); + }; + + self.languagePackDisplay = function(item) { + return item.display + ((item.english != undefined) ? ' (' + item.english + ')' : ''); + }; + + self.deleteLanguagePack = function(locale, pack) { + $.ajax({ + url: API_BASEURL + "languages/" + locale + "/" + pack, + type: "DELETE", + dataType: "json", + success: function(response) { + self.fromTranslationResponse(response); + } + }) + }; + self.fromResponse = function(response) { if (self.settings === undefined) { self.settings = ko.mapping.fromJS(response); @@ -263,7 +396,7 @@ $(function() { self.scripts_gcode_afterPrintPaused(response.scripts.gcode.afterPrintPaused); self.scripts_gcode_beforePrintResumed(response.scripts.gcode.beforePrintResumed); self.scripts_gcode_afterPrinterConnected(response.scripts.gcode.afterPrinterConnected); - + self.temperature_profiles(response.temperature.profiles); self.temperature_cutoff(response.temperature.cutoff); diff --git a/src/octoprint/templates/dialogs/settings/appearance.jinja2 b/src/octoprint/templates/dialogs/settings/appearance.jinja2 index 5744d729..7975a4e4 100644 --- a/src/octoprint/templates/dialogs/settings/appearance.jinja2 +++ b/src/octoprint/templates/dialogs/settings/appearance.jinja2 @@ -19,6 +19,12 @@ +
+ +
+ +
+
@@ -31,3 +37,48 @@
+ +