├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── question.md ├── settings.yml ├── stale.yml └── workflows │ └── github-release-actions.yml ├── .gitignore ├── .travis.yml.notusedanymore ├── DEVELOPMENT.md ├── LICENSE ├── MANIFEST.in ├── README.md ├── RELEASE_TEMPLATE.md ├── TODOs.md ├── babel.cfg ├── docker-compose.yml ├── gulpfile.js ├── octoprint_filamentmanager ├── __init__.py ├── api │ ├── __init__.py │ └── util.py ├── data │ ├── __init__.py │ └── listen.py ├── newodometer.py ├── odometer.py ├── static │ ├── README.md │ ├── css │ │ └── filamentmanager.min.css │ ├── fonts │ │ ├── icomoon.eot │ │ ├── icomoon.svg │ │ ├── icomoon.ttf │ │ └── icomoon.woff │ └── js │ │ └── filamentmanager.bundled.js ├── templates │ ├── settings.jinja2 │ ├── settings_configdialog.jinja2 │ ├── settings_profiledialog.jinja2 │ ├── settings_spooldialog.jinja2 │ ├── sidebar.jinja2 │ ├── sidebar_header.jinja2 │ └── spool_confirmation.jinja2 └── translations │ ├── de │ └── LC_MESSAGES │ │ ├── messages.mo │ │ └── messages.po │ ├── es │ └── LC_MESSAGES │ │ ├── messages.mo │ │ └── messages.po │ └── fr │ └── LC_MESSAGES │ ├── messages.mo │ └── messages.po ├── package.json ├── requirements.txt ├── screenshots ├── filamentmanager_settings.png ├── filamentmanager_settings_profile.png ├── filamentmanager_settings_spool.png └── filamentmanager_sidebar.png ├── setup.py ├── static ├── css │ ├── font.css │ └── style.css └── js │ ├── bootstrap.js │ ├── constructor.js │ ├── core │ ├── bridge.js │ ├── callbacks.js │ └── client.js │ ├── utils.js │ └── viewmodels │ ├── config.js │ ├── confirmation.js │ ├── import.js │ ├── profiles.js │ ├── selection.js │ ├── spools.js │ └── warning.js └── translations ├── de └── LC_MESSAGES │ ├── messages.mo │ └── messages.po ├── es └── LC_MESSAGES │ ├── messages.mo │ └── messages.po ├── fr └── LC_MESSAGES │ ├── messages.mo │ └── messages.po └── messages.pot /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | end_of_line = lf 8 | charset = utf-8 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [**.py] 13 | indent_style = space 14 | indent_size = 4 15 | 16 | [**.js] 17 | indent_style = space 18 | indent_size = 4 19 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | gulpfile.js 2 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | --- 2 | "extends": 3 | - "airbnb" 4 | "rules": 5 | "indent": ["error", 4] 6 | "max-len": ["error", 120, { 7 | ignoreUrls: true, 8 | ignoreComments: false, 9 | ignoreRegExpLiterals: true, 10 | ignoreStrings: true, 11 | ignoreTemplateLiterals: true, 12 | }] 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **Steps to reproduce** 14 | 1. Go to '...' 15 | 2. Click on '....' 16 | 3. Scroll down to '....' 17 | 4. See error 18 | 19 | **Expected behavior** 20 | A clear and concise description of what you expected to happen. 21 | 22 | **Did the same happen when all other 3rd party plugins are disabled?** 23 | If not which plugin is causing the issue? 24 | 25 | **Log file** 26 | Drag and drop the octoprint.log here. 27 | 28 | **Screenshots** 29 | If applicable, add screenshots to help explain your problem. 30 | 31 | **Additional context** 32 | Add any other context about the problem here. 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | about: Please use the OctoPrint Forum - https://community.octoprint.org 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | Please use the OctoPrint Forum - https://community.octoprint.org 11 | -------------------------------------------------------------------------------- /.github/settings.yml: -------------------------------------------------------------------------------- 1 | repository: 2 | # See https://developer.github.com/v3/repos/#edit for all available settings. 3 | 4 | # The name of the repository. Changing this will rename the repository 5 | # name: repo-name 6 | 7 | # A short description of the repository that will show up on GitHub 8 | # description: description of repo 9 | 10 | # A URL with more information about the repository 11 | # homepage: https://example.github.io/ 12 | 13 | # Either `true` to make the repository private, or `false` to make it public. 14 | # private: false 15 | 16 | # Either `true` to enable issues for this repository, `false` to disable them. 17 | has_issues: true 18 | 19 | # Either `true` to enable the wiki for this repository, `false` to disable it. 20 | has_wiki: true 21 | 22 | # Either `true` to enable downloads for this repository, `false` to disable them. 23 | # has_downloads: true 24 | 25 | # Updates the default branch for this repository. 26 | # default_branch: master 27 | 28 | # Either `true` to allow squash-merging pull requests, or `false` to prevent 29 | # squash-merging. 30 | # allow_squash_merge: true 31 | 32 | # Either `true` to allow merging pull requests with a merge commit, or `false` 33 | # to prevent merging pull requests with merge commits. 34 | # allow_merge_commit: true 35 | 36 | # Either `true` to allow rebase-merging pull requests, or `false` to prevent 37 | # rebase-merging. 38 | # allow_rebase_merge: true 39 | 40 | # Labels: define labels for Issues and Pull Requests 41 | labels: 42 | - name: "type: bug" 43 | description: "Something isn't working" 44 | color: d73a4a 45 | - name: "type: enhancement" 46 | description: "New feature or request" 47 | color: a2eeef 48 | - name: "type: question" 49 | description: "Further information is requested" 50 | color: d876e3 51 | - name: "status: analysing" 52 | color: d3d847 53 | - name: "status: inProgress" 54 | description: "I am working on it" 55 | color: 5319e7 56 | - name: "status: inNextRelease" 57 | description: "Will be implemented/fixed in next release" 58 | color: 4ae857 59 | - name: "status: waitingForFeedback" 60 | description: "Wating for Customers feedback" 61 | color: bfdadc 62 | - name: "status: waitingForTestFeedback" 63 | color: 006b75 64 | - name: "status: wontfix" 65 | description: "I don't wont to fix this" 66 | color: fbca04 67 | - name: "status: markedForAutoClose" 68 | description: "Issue will be closed automatically" 69 | color: ed6d75 70 | 71 | 72 | # Collaborators: give specific users access to this repository. 73 | #collaborators: 74 | # - username: bkeepers 75 | # Note: Only valid on organization-owned repositories. 76 | # The permission to grant the collaborator. Can be one of: 77 | # * `pull` - can pull, but not push to or administer this repository. 78 | # * `push` - can pull and push, but not administer this repository. 79 | # * `admin` - can pull, push and administer this repository. 80 | # permission: push 81 | 82 | # - username: hubot 83 | # permission: pull 84 | 85 | # - username: 86 | # permission: pull 87 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 30 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 10 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - "status: analysing" 8 | - "status: inNextRelease" 9 | - "status: inProgress" 10 | - "status: wontfix" 11 | # Label to use when marking an issue as stale 12 | staleLabel: "status: markedForAutoClose" 13 | # Comment to post when marking an issue as stale. Set to `false` to disable 14 | markComment: > 15 | This issue has been automatically marked for closing, because it has not had 16 | activity in 30 days. It will be closed if no further activity occurs in 10 days. 17 | # Comment to post when closing a stale issue. Set to `false` to disable 18 | closeComment: false 19 | -------------------------------------------------------------------------------- /.github/workflows/github-release-actions.yml: -------------------------------------------------------------------------------- 1 | ### 2 | ### Simple script to build a zip file of the whole repository 3 | ### 4 | # 5 | #script: 6 | ## debug - echo 'Hello World' 7 | # - export PLUGIN_VERSION=$(cat setup.py | grep 'plugin_version = "*"' | cut -d '"' -f2) 8 | # - zip -r master.zip * -i '\octoprint_*' 'translations' 'README.md' 'requirements.txt' 'setup.py' 9 | ## debug - ls -al 10 | # 11 | ### see "Fix travis automatic build and deploy" 12 | ### https://github.com/oliexdev/openScale/pull/121 13 | ### https://github.com/oliexdev/openScale/pull/121/files 14 | #before_deploy: 15 | # - git tag -f travis-build 16 | # - git remote add gh https://${TRAVIS_REPO_SLUG%/*}:${GITHUB_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git 17 | # - git push -f gh travis-build 18 | # - git remote remove gh 19 | # 20 | #deploy: 21 | # name: "V${PLUGIN_VERSION}-draft" 22 | # #prerelease: true 23 | # draft: true 24 | # provider: releases 25 | # api_key: "${GITHUB_TOKEN}" 26 | # file: "master.zip" 27 | # overwrite: true 28 | # skip_cleanup: true 29 | # target_commitish: $TRAVIS_COMMIT 30 | 31 | 32 | 33 | name: Build Plugin Release - Action 34 | on: [push] 35 | jobs: 36 | Build-Release-ZIP-Action: 37 | runs-on: ubuntu-latest 38 | steps: 39 | - name: Check out repository code 40 | uses: actions/checkout@v2 41 | 42 | - run: echo "Read current plugin version..." 43 | - run: export PLUGIN_VERSION=$(cat setup.py | grep 'plugin_version = "*"' | cut -d '"' -f2) 44 | - run: echo "Plugin Version $PLUGIN_VERSION ${PLUGIN_VERSION}" 45 | 46 | - run: echo "Build ZIP" 47 | - run: zip -r master.zip * -i '\octoprint_*' 'translations' 'README.md' 'requirements.txt' 'setup.py' 48 | - name: List files in the repository 49 | run: | 50 | ls ${{ github.workspace }} 51 | 52 | - name: version 53 | run: echo "::set-output name=version::$(cat setup.py | grep 'plugin_version = "*"' | cut -d '"' -f2)" 54 | id: version 55 | 56 | - name: release 57 | uses: actions/create-release@v1 58 | id: create_release 59 | env: 60 | GITHUB_TOKEN: ${{ github.token }} 61 | with: 62 | draft: true 63 | prerelease: false 64 | release_name: V${{ steps.version.outputs.version }}-draft 65 | tag_name: ${{ steps.version.outputs.version }}-draft 66 | body_path: RELEASE_TEMPLATE.md 67 | 68 | - name: upload master.zip to release 69 | uses: actions/upload-release-asset@v1 70 | env: 71 | GITHUB_TOKEN: ${{ github.token }} 72 | with: 73 | upload_url: ${{ steps.create_release.outputs.upload_url }} 74 | asset_path: master.zip 75 | asset_name: master.zip 76 | asset_content_type: application/gzip 77 | 78 | - run: echo "🍏 This job's status is ${{ job.status }}." -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.swp 3 | .idea 4 | *.iml 5 | build 6 | dist 7 | *.egg* 8 | .DS_Store 9 | *.zip 10 | .atom 11 | node_modules 12 | package-lock.json 13 | -------------------------------------------------------------------------------- /.travis.yml.notusedanymore: -------------------------------------------------------------------------------- 1 | ## 2 | ## Simple script to build a zip file of the whole repository 3 | ## 4 | 5 | script: 6 | # debug - echo 'Hello World' 7 | - export PLUGIN_VERSION=$(cat setup.py | grep 'plugin_version = "*"' | cut -d '"' -f2) 8 | - zip -r master.zip * -i '\octoprint_*' 'translations' 'README.md' 'requirements.txt' 'setup.py' 9 | # debug - ls -al 10 | 11 | ## see "Fix travis automatic build and deploy" 12 | ## https://github.com/oliexdev/openScale/pull/121 13 | ## https://github.com/oliexdev/openScale/pull/121/files 14 | before_deploy: 15 | - git tag -f travis-build 16 | - git remote add gh https://${TRAVIS_REPO_SLUG%/*}:${GITHUB_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git 17 | - git push -f gh travis-build 18 | - git remote remove gh 19 | 20 | deploy: 21 | name: "V${PLUGIN_VERSION}-draft" 22 | #prerelease: true 23 | draft: true 24 | provider: releases 25 | api_key: "${GITHUB_TOKEN}" 26 | file: "master.zip" 27 | overwrite: true 28 | skip_cleanup: true 29 | target_commitish: $TRAVIS_COMMIT 30 | -------------------------------------------------------------------------------- /DEVELOPMENT.md: -------------------------------------------------------------------------------- 1 | # Development environment 2 | All files in the `octoprint_filamentmanager/static/{css,js}` directory will be build with [Gulp](https://gulpjs.com/), from the source in `static/{css,js}`, and not modified directly. The build process includes: 3 | - Static code analysis with [ESLint](https://eslint.org/) 4 | - Transcompiling to ES5 with [Babel](https://babeljs.io/) 5 | - Concatinating all JS files into one file `filamentmanager.bundled.js` 6 | - Concatinating and minifying all CSS file into one file `filamentmanager.min.css` 7 | 8 | 9 | ## Prerequisites 10 | 1. Install [NodeJS](http://www.nodejs.org/) and [NPM](https://www.npmjs.com/) with your package manager 11 | 12 | 1. Install development dependencies with `npm install` 13 | 14 | 15 | ## Build 16 | 1. Check the source code with `npx gulp lint` 17 | 18 | 1. Start the build process with `npx gulp build` 19 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE 2 | include README.md 3 | recursive-include octoprint_filamentmanager/templates * 4 | recursive-include octoprint_filamentmanager/translations * 5 | recursive-include octoprint_filamentmanager/static * 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OctoPrint-FilamentManager 2 | 3 | ## UNDER NEW MANAGEMENT 4 | 5 | Hi everybody, 6 | because there was no activtiy in the last month on the origial GitHub-Repository from @malnvenshorn, 7 | the community decided to find a new home of this OctoPrint-Plugin and here it is ;-) 8 | See https://github.com/OctoPrint/plugins.octoprint.org/issues/471 for more details 9 | 10 | What is my roadmap/stratagy of "hosting" this plugin? 11 | - First: Plugin should run under the latest versions of python and OctoPrint 12 | - Analysing/fixing issues that prevent using the plugin 13 | - An open mind for new ideas.... 14 | - ...but if the effort to implement new features is to height, then it will probably be implemented in my SpoolManager-Plugin 15 | (https://github.com/OllisGit/OctoPrint-SpoolManager) 16 | - ...also I will move more and more features from FilamentManager to SpoolManager (e.g. external Database, MultiTool, ...) 17 | 18 | # Overview 19 | 20 | [![Version](https://img.shields.io/badge/dynamic/json.svg?color=brightgreen&label=version&url=https://api.github.com/repos/OllisGit/OctoPrint-FilamentManager/releases&query=$[0].name)]() 21 | [![Released](https://img.shields.io/badge/dynamic/json.svg?color=brightgreen&label=released&url=https://api.github.com/repos/OllisGit/OctoPrint-FilamentManager/releases&query=$[0].published_at)]() 22 | ![GitHub Releases (by Release)](https://img.shields.io/github/downloads/OllisGit/OctoPrint-FilamentManager/latest/total.svg) 23 | 24 | This OctoPrint plugin makes it easy to manage your inventory of filament spools. You can add all your spools and assign them to print jobs. The Filament Manager will automatically track the amount of extruded filament so you can always see how much is left on your spools. 25 | 26 | If you have questions or encounter issues please take a look at the [Frequently Asked Questions](https://github.com/OllisGit/OctoPrint-FilamentManager/wiki#faq) first. There might be already an answer. 27 | In case you haven't found what you are looking for, feel free to open a [ticket](https://github.com/OllisGit/OctoPrint-FilamentManager/issues/new/choose) and I'll try to help. 28 | Or ask questions and requests for help in the community forum [community forum](https://community.octoprint.org/). 29 | 30 | #### Support my Efforts 31 | 32 | This plugin, as well as my [other plugins](https://github.com/OllisGit/) were developed in my spare time. 33 | If you like it, I would be thankful about a cup of coffee :) 34 | 35 | [![More coffee, more code](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6SW5R6ZUKLB5E&source=url) 36 | 37 | 38 | ## Features 39 | 40 | * Software odometer to track amount of extruded filament 41 | * Warns you if the selected spool has not enugh filament left for the print job 42 | * Automatically pause print if filament runs out 43 | * Apply temperature offsets assigned to spools 44 | * Import & export of your spool inventory 45 | * Support for PostgreSQL (>=9.5) as common database for multiple OctoPrint instances 46 | 47 | ## Setup 48 | 49 | 1. Install this plugin via the bundled [Plugin Manager](https://github.com/foosel/OctoPrint/wiki/Plugin:-Plugin-Manager) 50 | or manually using this URL: 51 | 52 | `https://github.com/OllisGit/OctoPrint-FilamentManager/releases/latest/download/master.zip` 53 | 54 | 1. For PostgreSQL support you need to install an additional dependency. Take a look into the [wiki](https://github.com/OllisGit/OctoPrint-FilamentManager/wiki) for more details. 55 | 56 | `pip install psycopg2` 57 | 58 | 59 | ### Using PostgreSQL with Docker 60 | You need to make sure that you setup a docker runtime on your system. After that you can "manage" a PostgreSQL with the following commands: 61 | 62 | docker-compose up 63 | _ 64 | 65 | docker-compose down --volumes 66 | _ 67 | 68 | docker-compose run postgres bash 69 | 70 | ## Screenshots 71 | 72 | ![FilamentManager Sidebar](screenshots/filamentmanager_sidebar.png?raw=true) 73 | 74 | ![FilamentManager Settings Profile](screenshots/filamentmanager_settings_profile.png?raw=true) 75 | 76 | ![FilamentManager Settings Spool](screenshots/filamentmanager_settings_spool.png?raw=true) 77 | 78 | ![FilamentManager Settings](screenshots/filamentmanager_settings.png?raw=true) 79 | 80 | # Developer section 81 | 82 | ## API - Calls 83 | 84 | E.g. 85 | ``` 86 | url = 'http://localhost/plugin/filamentmanager/selections/0' 87 | headers = {'X-Api-Key': config.API_KEY} 88 | payload = { 89 | "selection": { 90 | "tool": 0, 91 | "spool": { 92 | "id": id 93 | } 94 | }, 95 | "updateui": True 96 | } 97 | ``` 98 | -------------------------------------------------------------------------------- /RELEASE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## [BugFix] 2 | - #xxx 3 | 4 | ## [Enhancement] 5 | - #xxx 6 | 7 | ## Counter 8 | ![downloaded](https://img.shields.io/github/downloads/OllisGit/OctoPrint-FilamentManager/xxx/total) 9 | 10 | ## Support my Efforts 11 | 12 | This plugin, as well as my [other plugins](https://github.com/OllisGit/) were developed in my spare time. 13 | If you like it, I would be thankful about a cup of coffee :) 14 | 15 | [![More coffee, more code](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6SW5R6ZUKLB5E&source=url) 16 | -------------------------------------------------------------------------------- /TODOs.md: -------------------------------------------------------------------------------- 1 | What are the next steps? 2 | ======================== 3 | 4 | - handling release channel 5 | - issue 23: update to SQLAlchemy 1.3.23 (precondition: release-channel) 6 | -------------------------------------------------------------------------------- /babel.cfg: -------------------------------------------------------------------------------- 1 | [python: octoprint_filamentmanager/**.py] 2 | [jinja2: octoprint_filamentmanager/**.jinja2] 3 | extensions=jinja2.ext.autoescape, jinja2.ext.with_ 4 | 5 | [javascript: octoprint_filamentmanager/**.js] 6 | extract_messages = gettext, ngettext 7 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | postgres: 4 | image: "postgres" # use latest official postgres version 5 | # env_file: 6 | # - database.env # configure postgres 7 | volumes: 8 | - postgres-data:/var/lib/postgresql/data/ # persist data even if container shuts down 9 | ports: 10 | - 5432:5432 11 | environment: 12 | - POSTGRES_DB=spoolmanagerdb 13 | - POSTGRES_USER=Olli 14 | - POSTGRES_PASSWORD=illO 15 | 16 | volumes: 17 | postgres-data: # named volumes can be managed easier using docker-compose 18 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | var concat = require('gulp-concat'); 3 | var eslint = require('gulp-eslint'); 4 | var babel = require('gulp-babel'); 5 | let cleanCSS = require('gulp-clean-css'); 6 | 7 | gulp.task('lint', () => { 8 | return gulp.src(['static/js/**/*.js']) 9 | .pipe(eslint()) 10 | .pipe(eslint.format()); 11 | }); 12 | 13 | gulp.task('build', ['js', 'css']) 14 | 15 | gulp.task('js', () => { 16 | return gulp.src([ 17 | 'static/js/constructor.js', 18 | 'static/js/**/!(bootstrap)*.js', 19 | 'static/js/bootstrap.js', 20 | ]) 21 | .pipe(babel({ 22 | presets: ['env'], 23 | plugins: ['transform-remove-strict-mode'] 24 | })) 25 | .pipe(concat('filamentmanager.bundled.js')) 26 | .pipe(gulp.dest('octoprint_filamentmanager/static/js/')); 27 | }); 28 | 29 | gulp.task('css', () => { 30 | return gulp.src([ 31 | 'static/css/*.css', 32 | ]) 33 | .pipe(concat('filamentmanager.min.css')) 34 | .pipe(cleanCSS()) 35 | .pipe(gulp.dest('octoprint_filamentmanager/static/css/')); 36 | }); 37 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/api/util.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | 4 | __author__ = "Sven Lohrmann " 5 | __license__ = "GNU Affero General Public License http://www.gnu.org/licenses/agpl.html" 6 | __copyright__ = "Copyright (C) 2017 Sven Lohrmann - Released under terms of the AGPLv3 License" 7 | 8 | import hashlib 9 | from werkzeug.http import http_date 10 | 11 | 12 | def add_revalidation_header_with_no_max_age(response, lm, etag): 13 | response.set_etag(etag) 14 | response.headers["Last-Modified"] = http_date(lm) 15 | response.headers["Cache-Control"] = "max-age=0" 16 | return response 17 | 18 | 19 | def entity_tag(lm): 20 | return (hashlib.sha1(str(lm).encode(encoding='UTF-8')).hexdigest()) 21 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/data/listen.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | __author__ = "Sven Lohrmann " 4 | __license__ = "GNU Affero General Public License http://www.gnu.org/licenses/agpl.html" 5 | __copyright__ = "Copyright (C) 2017 Sven Lohrmann - Released under terms of the AGPLv3 License" 6 | 7 | from threading import Thread 8 | from select import select as wait_ready 9 | from sqlalchemy import create_engine, text 10 | 11 | 12 | class PGNotify(object): 13 | 14 | def __init__(self, uri): 15 | self.subscriber = list() 16 | 17 | engine = create_engine(uri) 18 | conn = engine.connect() 19 | conn.execute(text("LISTEN profiles; LISTEN spools;").execution_options(autocommit=True)) 20 | 21 | notify_thread = Thread(target=self.notify, args=(conn,)) 22 | notify_thread.daemon = True 23 | notify_thread.start() 24 | 25 | def notify(self, conn): 26 | while True: 27 | if wait_ready([conn.connection], [], [], 5) != ([], [], []): 28 | conn.connection.poll() 29 | while conn.connection.notifies: 30 | notify = conn.connection.notifies.pop() 31 | for func in self.subscriber: 32 | func(pid=notify.pid, channel=notify.channel, payload=notify.payload) 33 | 34 | def subscribe(self, func): 35 | self.subscriber.append(func) 36 | 37 | def unsubscribe(self, func): 38 | self.subscriber.remove(func) 39 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/newodometer.py: -------------------------------------------------------------------------------- 1 | 2 | # coding=utf-8 3 | from __future__ import absolute_import 4 | 5 | import math 6 | # import logging 7 | # copied from gcodeinterpreter.py Version OP 1.5.2 8 | class NewFilamentOdometer(object): 9 | 10 | def __init__(self): 11 | # self._logger = logging.getLogger(__name__) 12 | self.max_extruders = 10 13 | self.g90_extruder = False 14 | self.reset() 15 | 16 | 17 | def set_g90_extruder(self, flag=False): 18 | self.g90_extruder = flag 19 | 20 | def reset(self): 21 | self.currentE = [0.0] 22 | self.totalExtrusion = [0.0] 23 | self.maxExtrusion = [0.0] 24 | self.currentExtruder = 0 # Tool Id 25 | self.relativeE = False 26 | self.relativeMode = False 27 | self.duplicationMode = False 28 | 29 | 30 | def processGCodeLine(self, line): 31 | 32 | # origLine = line 33 | # comment should not be during "hook-processing" 34 | if ";" in line: 35 | # comment = line[line.find(";") + 1:].strip() 36 | line = line[0: line.find(";")] 37 | pass 38 | 39 | if (len(line) == 0): 40 | return 41 | G = self._getCodeInt(line, "G") 42 | M = self._getCodeInt(line, "M") 43 | T = self._getCodeInt(line, "T") 44 | 45 | if G is not None: 46 | if G >= 0 and G <= 3: # Move G0/G1/G2/G3 47 | x = self._getCodeFloat(line, "X") 48 | y = self._getCodeFloat(line, "Y") 49 | z = self._getCodeFloat(line, "Z") 50 | e = self._getCodeFloat(line, "E") 51 | f = self._getCodeFloat(line, "F") 52 | 53 | if x is not None or y is not None or z is not None: 54 | # this is a move 55 | move = True 56 | else: 57 | # print head stays on position 58 | move = False 59 | 60 | if e is not None: 61 | if self.relativeMode or self.relativeE: 62 | # e is already relative, nothing to do 63 | pass 64 | else: 65 | e -= self.currentE[self.currentExtruder] 66 | 67 | # # If move with extrusion, calculate new min/max coordinates of model 68 | # if e > 0.0 and move: 69 | # # extrusion and move -> oldPos & pos relevant for print area & dimensions 70 | # self._minMax.record(oldPos) 71 | # self._minMax.record(pos) 72 | 73 | self.totalExtrusion[self.currentExtruder] += e 74 | self.currentE[self.currentExtruder] += e 75 | self.maxExtrusion[self.currentExtruder] = max( 76 | self.maxExtrusion[self.currentExtruder], self.totalExtrusion[self.currentExtruder] 77 | ) 78 | 79 | if self.currentExtruder == 0 and len(self.currentE) > 1 and self.duplicationMode: 80 | # Copy first extruder length to other extruders 81 | for i in range(1, len(self.currentE)): 82 | self.totalExtrusion[i] += e 83 | self.currentE[i] += e 84 | self.maxExtrusion[i] = max(self.maxExtrusion[i], self.totalExtrusion[i]) 85 | else: 86 | e = 0.0 87 | 88 | elif G == 90: # Absolute position 89 | self.relativeMode = False 90 | if self.g90_extruder: 91 | self.relativeE = False 92 | 93 | elif G == 91: # Relative position 94 | self.relativeMode = True 95 | if self.g90_extruder: 96 | self.relativeE = True 97 | 98 | elif G == 92: 99 | x = self._getCodeFloat(line, "X") 100 | y = self._getCodeFloat(line, "Y") 101 | z = self._getCodeFloat(line, "Z") 102 | e = self._getCodeFloat(line, "E") 103 | 104 | if e is None and x is None and y is None and z is None: 105 | # no parameters, set all axis to 0 106 | self.currentE[self.currentExtruder] = 0.0 107 | # pos.x = 0.0 108 | # pos.y = 0.0 109 | # pos.z = 0.0 110 | else: 111 | # some parameters set, only set provided axes 112 | if e is not None: 113 | self.currentE[self.currentExtruder] = e 114 | # if x is not None: 115 | # pos.x = x 116 | # if y is not None: 117 | # pos.y = y 118 | # if z is not None: 119 | # pos.z = z 120 | 121 | elif M is not None: 122 | if M == 82: # Absolute E 123 | self.relativeE = False 124 | elif M == 83: # Relative E 125 | self.relativeE = True 126 | # elif M == 207 or M == 208: # Firmware retract settings 127 | # s = self._getCodeFloat(line, "S") 128 | # f = self._getCodeFloat(line, "F") 129 | # if s is not None and f is not None: 130 | # if M == 207: 131 | # fwretractTime = s / f 132 | # fwretractDist = s 133 | # else: 134 | # fwrecoverTime = (fwretractDist + s) / f 135 | elif M == 605: # Duplication/Mirroring mode 136 | s = self._getCodeInt(line, "S") 137 | if s in [2, 4, 5, 6]: 138 | # Duplication / Mirroring mode selected. Printer firmware copies extrusion commands 139 | # from first extruder to all other extruders 140 | self.duplicationMode = True 141 | else: 142 | self.duplicationMode = False 143 | 144 | elif T is not None: 145 | if T > self.max_extruders: 146 | # self._logger.warning( 147 | # "GCODE tried to select tool %d, that looks wrong, ignoring for GCODE analysis" 148 | # % T 149 | # ) 150 | print("GCODE tried to select tool %d, that looks wrong, ignoring for GCODE analysis" % T) 151 | pass 152 | elif T == self.currentExtruder: 153 | pass 154 | else: 155 | # pos.x -= ( 156 | # offsets[currentExtruder][0] 157 | # if currentExtruder < len(offsets) 158 | # else 0 159 | # ) 160 | # pos.y -= ( 161 | # offsets[currentExtruder][1] 162 | # if currentExtruder < len(offsets) 163 | # else 0 164 | # ) 165 | 166 | self.currentExtruder = T 167 | 168 | # pos.x += ( 169 | # offsets[currentExtruder][0] 170 | # if currentExtruder < len(offsets) 171 | # else 0 172 | # ) 173 | # pos.y += ( 174 | # offsets[currentExtruder][1] 175 | # if currentExtruder < len(offsets) 176 | # else 0 177 | # ) 178 | 179 | if len(self.currentE) <= self.currentExtruder: 180 | for _ in range(len(self.currentE), self.currentExtruder + 1): 181 | self.currentE.append(0.0) 182 | if len(self.maxExtrusion) <= self.currentExtruder: 183 | for _ in range(len(self.maxExtrusion), self.currentExtruder + 1): 184 | self.maxExtrusion.append(0.0) 185 | if len(self.totalExtrusion) <= self.currentExtruder: 186 | for _ in range(len(self.totalExtrusion), self.currentExtruder + 1): 187 | self.totalExtrusion.append(0.0) 188 | 189 | def getCurrentTool(self): 190 | return self.currentExtruder 191 | 192 | def getExtrusionAmount(self): 193 | return self.maxExtrusion 194 | 195 | def _getCodeInt(self, line, code): 196 | return self._getCode(line, code, int) 197 | 198 | 199 | def _getCodeFloat(self, line, code): 200 | return self._getCode(line, code, float) 201 | 202 | 203 | def _getCode(self, line, code, c): 204 | n = line.find(code) + 1 205 | if n < 1: 206 | return None 207 | m = line.find(" ", n) 208 | try: 209 | if m < 0: 210 | result = c(line[n:]) 211 | else: 212 | result = c(line[n:m]) 213 | except ValueError: 214 | return None 215 | 216 | if math.isnan(result) or math.isinf(result): 217 | return None 218 | 219 | return result 220 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/odometer.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | 4 | __author__ = "Sven Lohrmann based on work by Gina Häußge " 5 | __license__ = "GNU Affero General Public License http://www.gnu.org/licenses/agpl.html" 6 | __copyright__ = "Copyright (C) 2017 Sven Lohrmann - Released under terms of the AGPLv3 License" 7 | 8 | import re 9 | 10 | 11 | class FilamentOdometer(object): 12 | 13 | regexE = re.compile(r'.*E(-?\d+(\.\d+)?)') 14 | regexT = re.compile(r'^T(\d+)') 15 | 16 | def __init__(self): 17 | self.g90_extruder = True 18 | self.reset() 19 | 20 | def reset(self): 21 | self.relativeMode = False 22 | self.relativeExtrusion = False 23 | self.lastExtrusion = [0.0] 24 | self.totalExtrusion = [0.0] 25 | self.maxExtrusion = [0.0] 26 | self.currentTool = 0 27 | self.parseCount = 0 28 | 29 | def reset_extruded_length(self): 30 | tools = len(self.maxExtrusion) 31 | self.maxExtrusion = [0.0] * tools 32 | self.totalExtrusion = [0.0] * tools 33 | 34 | def parse(self, gcode, cmd): 35 | self.parseCount = self.parseCount + 1 36 | if gcode is None: 37 | return 38 | 39 | if gcode in ("G0", "G1", "G2", "G3"): # move 40 | e = self._get_float(cmd, self.regexE) 41 | if e is not None: 42 | if self.relativeMode or self.relativeExtrusion: 43 | # e is already relative, nothing to do 44 | pass 45 | else: 46 | e -= self.lastExtrusion[self.currentTool] 47 | self.totalExtrusion[self.currentTool] += e 48 | self.lastExtrusion[self.currentTool] += e 49 | self.maxExtrusion[self.currentTool] = max(self.maxExtrusion[self.currentTool], 50 | self.totalExtrusion[self.currentTool]) 51 | elif gcode == "G90": # set to absolute positioning 52 | self.relativeMode = False 53 | if self.g90_extruder: 54 | self.relativeExtrusion = False 55 | elif gcode == "G91": # set to relative positioning 56 | self.relativeMode = True 57 | if self.g90_extruder: 58 | self.relativeExtrusion = True 59 | elif gcode == "G92": # set position 60 | e = self._get_float(cmd, self.regexE) 61 | if e is not None: 62 | 63 | print("*****") 64 | print(str(self.parseCount)) 65 | print(cmd) 66 | print("*****") 67 | 68 | self.lastExtrusion[self.currentTool] = e 69 | elif gcode == "M82": # set extruder to absolute mode 70 | self.relativeExtrusion = False 71 | elif gcode == "M83": # set extruder to relative mode 72 | self.relativeExtrusion = True 73 | elif gcode.startswith("T"): # select tool 74 | t = self._get_int(cmd, self.regexT) 75 | if t is not None: 76 | self.currentTool = t 77 | if len(self.lastExtrusion) <= self.currentTool: 78 | for i in xrange(len(self.lastExtrusion), self.currentTool + 1): 79 | self.lastExtrusion.append(0.0) 80 | self.totalExtrusion.append(0.0) 81 | self.maxExtrusion.append(0.0) 82 | 83 | def set_g90_extruder(self, flag=True): 84 | self.g90_extruder = flag 85 | 86 | def get_extrusion(self): 87 | return self.maxExtrusion 88 | 89 | def get_current_tool(self): 90 | return self.currentTool 91 | 92 | def _get_int(self, cmd, regex): 93 | result = regex.match(cmd) 94 | if result is not None: 95 | return int(result.group(1)) 96 | else: 97 | return None 98 | 99 | def _get_float(self, cmd, regex): 100 | result = regex.match(cmd) 101 | if result is not None: 102 | return float(result.group(1)) 103 | else: 104 | return None 105 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/static/README.md: -------------------------------------------------------------------------------- 1 | # All JS and CSS files are generated! 2 | 3 | Read the [DEVELOPMENT.md](../../DEVELOPMENT.md) for more details about building these files. 4 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/static/css/filamentmanager.min.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:icomoon;src:url(../fonts/icomoon.eot?2tngg);src:url(../fonts/icomoon.eot?2tngg#iefix) format('embedded-opentype'),url(../fonts/icomoon.ttf?2tngg) format('truetype'),url(../fonts/icomoon.woff?2tngg) format('woff'),url(../fonts/icomoon.svg?2tngg#icomoon) format('svg');font-weight:400;font-style:normal}.fa-reel{font-family:icomoon!important}.fa-reel:before{content:"\e900"}.settings_plugin_filamentmanager_spools_header{margin-bottom:10px}.settings_plugin_filamentmanager_spools_header input[type=number]{width:14px;height:11px;font-size:12px;text-align:center}table td.settings_plugin_filamentmanager_spools_name,table th.settings_plugin_filamentmanager_spools_name{width:20%;text-align:left}table td.settings_plugin_filamentmanager_spools_material,table th.settings_plugin_filamentmanager_spools_material{width:15%;text-align:left}table td.settings_plugin_filamentmanager_spools_vendor,table th.settings_plugin_filamentmanager_spools_vendor{width:20%;text-align:left}table td.settings_plugin_filamentmanager_spools_weight,table th.settings_plugin_filamentmanager_spools_weight{width:15%;text-align:right}table td.settings_plugin_filamentmanager_spools_remaining,table th.settings_plugin_filamentmanager_spools_remaining{width:15%;text-align:right}table td.settings_plugin_filamentmanager_spools_used,table th.settings_plugin_filamentmanager_spools_used{width:15%;text-align:right}table td.settings_plugin_filamentmanager_spools_action,table th.settings_plugin_filamentmanager_spools_action{width:70px;text-align:center}table td.settings_plugin_filamentmanager_spools_action a{color:#000;text-decoration:none}.settings_plugin_filamentmanager_profiledialog_select{margin-bottom:6px}.settings_plugin_filamentmanager_profiledialog_select button.btn-small{margin-bottom:10px}#sidebar_plugin_filamentmanager_wrapper .accordion-heading i.fa-spinner{float:right;margin:10px 15px}#sidebar_plugin_filamentmanager .accordion-inner{padding-bottom:0} -------------------------------------------------------------------------------- /octoprint_filamentmanager/static/fonts/icomoon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/octoprint_filamentmanager/static/fonts/icomoon.eot -------------------------------------------------------------------------------- /octoprint_filamentmanager/static/fonts/icomoon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/static/fonts/icomoon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/octoprint_filamentmanager/static/fonts/icomoon.ttf -------------------------------------------------------------------------------- /octoprint_filamentmanager/static/fonts/icomoon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/octoprint_filamentmanager/static/fonts/icomoon.woff -------------------------------------------------------------------------------- /octoprint_filamentmanager/templates/settings.jinja2: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 |
6 | 7 |

{{ _("Filament Spools") }}

8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | {{ _("Sort by") }}: 23 | {{ _("Name (ascending)") }} | 24 | {{ _("Material (ascending)") }} | 25 | {{ _("Vendor (ascending)") }} | 26 | {{ _("Remaining (descending)") }} 27 | 28 | 29 |
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 60 |
{{ _('Name') }}{{ _('Material') }}{{ _('Vendor') }}{{ _('Weight') }}{{ _('Remaining') }}{{ _('Used') }}{{ _('Action') }}
gg% 54 | | 55 | | 56 | 57 |
61 | 62 | 63 | 64 | 75 | 76 | 77 | 78 |
79 | 80 | 81 |
82 | 83 |
84 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/templates/settings_configdialog.jinja2: -------------------------------------------------------------------------------- 1 | 161 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/templates/settings_profiledialog.jinja2: -------------------------------------------------------------------------------- 1 | 79 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/templates/settings_spooldialog.jinja2: -------------------------------------------------------------------------------- 1 | 92 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/templates/sidebar.jinja2: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 |
8 | 9 |
10 |   11 | 14 | 15 | 22 |
23 |
24 | 25 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/templates/sidebar_header.jinja2: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/templates/spool_confirmation.jinja2: -------------------------------------------------------------------------------- 1 | 32 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/translations/de/LC_MESSAGES/messages.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/octoprint_filamentmanager/translations/de/LC_MESSAGES/messages.mo -------------------------------------------------------------------------------- /octoprint_filamentmanager/translations/de/LC_MESSAGES/messages.po: -------------------------------------------------------------------------------- 1 | # German translations for OctoPrint-FilamentManager. 2 | # Copyright (C) 2017 ORGANIZATION 3 | # This file is distributed under the same license as the 4 | # OctoPrint-FilamentManager project. 5 | # FIRST AUTHOR , 2017. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: OctoPrint-FilamentManager 0.1.0\n" 10 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 11 | "POT-Creation-Date: 2021-10-17 11:30+0200\n" 12 | "PO-Revision-Date: 2018-02-04 15:24+0100\n" 13 | "Last-Translator: Sven Lohrmann \n" 14 | "Language: de\n" 15 | "Language-Team: de \n" 16 | "Plural-Forms: nplurals=2; plural=(n != 1)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=utf-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Generated-By: Babel 2.9.0\n" 21 | 22 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:357 23 | msgid "Start Print" 24 | msgstr "Druck starten" 25 | 26 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:372 27 | msgid "Resume Print" 28 | msgstr "Druck fortsetzen" 29 | 30 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:447 31 | msgid "Data import failed" 32 | msgstr "Daten-Import fehlgeschlagen" 33 | 34 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:448 35 | msgid "Something went wrong, please consult the logs." 36 | msgstr "Etwas ist schief gelaufen, bitte konsultiere das Log." 37 | 38 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:580 39 | msgid "Could not add profile" 40 | msgstr "Konnte Profil nicht hinzufügen" 41 | 42 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:581 43 | msgid "" 44 | "There was an unexpected error while saving the filament profile, please " 45 | "consult the logs." 46 | msgstr "" 47 | "Unerwarteter Fehler beim Speichern des Filamentprofils, bitte konsultiere" 48 | " das Log." 49 | 50 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:602 51 | msgid "Could not update profile" 52 | msgstr "Konnte Profil nicht aktualisieren" 53 | 54 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:603 55 | msgid "" 56 | "There was an unexpected error while updating the filament profile, please" 57 | " consult the logs." 58 | msgstr "" 59 | "Unerwarteter Fehler beim Aktualisieren des Filamentprofils, bitte " 60 | "konsultiere das Log." 61 | 62 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:617 63 | msgid "Could not delete profile" 64 | msgstr "Konnte Profil nicht löschen" 65 | 66 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:618 67 | msgid "" 68 | "There was an unexpected error while removing the filament profile, please" 69 | " consult the logs." 70 | msgstr "" 71 | "Unerwarteter Fehler beim Löschen des Filamentprofils, bitte konsultiere " 72 | "das Log." 73 | 74 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:627 75 | msgid "Delete profile?" 76 | msgstr "Profil löschen?" 77 | 78 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:628 79 | msgid "" 80 | "You are about to delete the filament profile (). Please" 81 | " note that it is not possible to delete profiles with associated spools." 82 | msgstr "" 83 | "Du bist im Begriff das Filament-Profil () zu löschen. " 84 | "Bitte beachte, dass es nicht möglich ist Profile zu löschen die Spulen " 85 | "zugewiesen wurden." 86 | 87 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:629 88 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:949 89 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:15 90 | msgid "Delete" 91 | msgstr "Löschen" 92 | 93 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:709 94 | msgid "Could not select spool" 95 | msgstr "Konnte Spule nicht auswählen" 96 | 97 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:710 98 | msgid "" 99 | "There was an unexpected error while selecting the spool, please consult " 100 | "the logs." 101 | msgstr "Unerwarteter Fehler beim auswählen der Spule, bitte konsultiere das Log." 102 | 103 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:898 104 | msgid "Could not add spool" 105 | msgstr "Konnte Spule nicht hinzufügen" 106 | 107 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:899 108 | msgid "" 109 | "There was an unexpected error while saving the filament spool, please " 110 | "consult the logs." 111 | msgstr "" 112 | "Unerwarteter Fehler beim speichern der Filamentspule, bitte konsultiere " 113 | "das Log." 114 | 115 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:921 116 | msgid "Could not update spool" 117 | msgstr "Konnte Spule nicht aktualisieren" 118 | 119 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:922 120 | msgid "" 121 | "There was an unexpected error while updating the filament spool, please " 122 | "consult the logs." 123 | msgstr "" 124 | "Unerwarteter Fehler beim Aktualisieren der Filamentspule, bitte " 125 | "konsultiere das Log." 126 | 127 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:937 128 | msgid "Could not delete spool" 129 | msgstr "Konnte Spule nicht löschen" 130 | 131 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:938 132 | msgid "" 133 | "There was an unexpected error while removing the filament spool, please " 134 | "consult the logs." 135 | msgstr "" 136 | "Unerwarteter Fehler beim Löschen der Filamentspule, bitte konsultiere das" 137 | " Log." 138 | 139 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:947 140 | msgid "Delete spool?" 141 | msgstr "Spule löschen?" 142 | 143 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:948 144 | msgid "You are about to delete the filament spool - ()." 145 | msgstr "Du bist im Begriff die Filament-Spule - () zu löschen." 146 | 147 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:1020 148 | msgid "Insufficient filament" 149 | msgstr "Filament nicht ausreichend" 150 | 151 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:1021 152 | msgid "" 153 | "The current print job needs more material than what's left on the " 154 | "selected spool." 155 | msgstr "" 156 | "Der aktuelle Druckauftrag benötigt mehr Material als auf der ausgewählten" 157 | " Spule vorhanden ist." 158 | 159 | #: octoprint_filamentmanager/templates/settings.jinja2:4 160 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:5 161 | msgid "Plugin Configuration" 162 | msgstr "Pluginkonfiguration" 163 | 164 | #: octoprint_filamentmanager/templates/settings.jinja2:7 165 | msgid "Filament Spools" 166 | msgstr "Filamentspulen" 167 | 168 | #: octoprint_filamentmanager/templates/settings.jinja2:13 169 | msgid "Items per page" 170 | msgstr "Einträge pro Seite" 171 | 172 | #: octoprint_filamentmanager/templates/settings.jinja2:22 173 | msgid "Sort by" 174 | msgstr "Sortieren nach" 175 | 176 | #: octoprint_filamentmanager/templates/settings.jinja2:23 177 | msgid "Name (ascending)" 178 | msgstr "Name (aufsteigend)" 179 | 180 | #: octoprint_filamentmanager/templates/settings.jinja2:24 181 | msgid "Material (ascending)" 182 | msgstr "Material (aufsteigend)" 183 | 184 | #: octoprint_filamentmanager/templates/settings.jinja2:25 185 | msgid "Vendor (ascending)" 186 | msgstr "Lieferant (aufsteigend)" 187 | 188 | #: octoprint_filamentmanager/templates/settings.jinja2:26 189 | msgid "Remaining (descending)" 190 | msgstr "Verbleibend (absteigend)" 191 | 192 | #: octoprint_filamentmanager/templates/settings.jinja2:36 193 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:15 194 | msgid "Name" 195 | msgstr "Name" 196 | 197 | #: octoprint_filamentmanager/templates/settings.jinja2:37 198 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:38 199 | msgid "Material" 200 | msgstr "Material" 201 | 202 | #: octoprint_filamentmanager/templates/settings.jinja2:38 203 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:26 204 | msgid "Vendor" 205 | msgstr "Lieferant" 206 | 207 | #: octoprint_filamentmanager/templates/settings.jinja2:39 208 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:50 209 | msgid "Weight" 210 | msgstr "Gewicht" 211 | 212 | #: octoprint_filamentmanager/templates/settings.jinja2:40 213 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:62 214 | msgid "Remaining" 215 | msgstr "Verbleibend" 216 | 217 | #: octoprint_filamentmanager/templates/settings.jinja2:41 218 | msgid "Used" 219 | msgstr "Verbraucht" 220 | 221 | #: octoprint_filamentmanager/templates/settings.jinja2:42 222 | msgid "Action" 223 | msgstr "Aktion" 224 | 225 | #: octoprint_filamentmanager/templates/settings.jinja2:54 226 | msgid "Edit Spool" 227 | msgstr "Spule bearbeiten" 228 | 229 | #: octoprint_filamentmanager/templates/settings.jinja2:55 230 | msgid "Duplicate Spool" 231 | msgstr "Spule duplizieren" 232 | 233 | #: octoprint_filamentmanager/templates/settings.jinja2:56 234 | msgid "Delete Spool" 235 | msgstr "Spule löschen" 236 | 237 | #: octoprint_filamentmanager/templates/settings.jinja2:79 238 | msgid "Manage Profiles" 239 | msgstr "Profile verwalten" 240 | 241 | #: octoprint_filamentmanager/templates/settings.jinja2:80 242 | msgid "Add Spool" 243 | msgstr "Spule hinzufügen" 244 | 245 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:12 246 | msgid "Features" 247 | msgstr "Funktionen" 248 | 249 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:13 250 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:91 251 | msgid "Database" 252 | msgstr "Datenbank" 253 | 254 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:14 255 | msgid "Appearance" 256 | msgstr "Aussehen" 257 | 258 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:26 259 | msgid "" 260 | "Show dialog to confirm selected spools before starting/resuming the print" 261 | " job" 262 | msgstr "" 263 | "Vor dem starten/fortsetzen eines Druckauftrags einen Dialog zur " 264 | "Bestätigung der ausgewählten Spulen anzeigen" 265 | 266 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:34 267 | msgid "Warn if print job exceeds remaining filament" 268 | msgstr "Warne, wenn der Druckauftrag die verbleibende Menge an Filament übersteigt" 269 | 270 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:42 271 | msgid "Enable software odometer to measure used filament" 272 | msgstr "Software-Hodometer aktivieren, um den Filamentverbrauch zu messen" 273 | 274 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:50 275 | msgid "Pause print if filament runs out" 276 | msgstr "Druck pausieren, wenn Filament zur Neige geht" 277 | 278 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:56 279 | msgid "Pause threshold" 280 | msgstr "Schwellwert für Pause" 281 | 282 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:74 283 | msgid "Use external database" 284 | msgstr "Verwende externe Datenbank" 285 | 286 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:78 287 | msgid "" 288 | "If you want to use an external database, please take a look into my wiki how to " 291 | "install the drivers and setup the database." 292 | msgstr "" 293 | 294 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:84 295 | msgid "URI" 296 | msgstr "URI" 297 | 298 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:98 299 | msgid "Username" 300 | msgstr "Benutzername" 301 | 302 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:105 303 | msgid "Password" 304 | msgstr "Passwort" 305 | 306 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:113 307 | msgid "Test connection" 308 | msgstr "Verbindungstest" 309 | 310 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:118 311 | msgid "" 312 | "Note: If you change these settings you must restart your OctoPrint " 313 | "instance for the changes to take affect." 314 | msgstr "" 315 | "Beachte: Wenn du diese Einstellungen änderst musst du OctoPrint neu " 316 | "starten, damit diese wirksam werden." 317 | 318 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:122 319 | msgid "Import & Export" 320 | msgstr "Import & Export" 321 | 322 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:127 323 | msgid "Browse..." 324 | msgstr "Durchsuchen..." 325 | 326 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:131 327 | msgid "Import" 328 | msgstr "Import" 329 | 330 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:133 331 | msgid "Export" 332 | msgstr "Export" 333 | 334 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:135 335 | msgid "" 336 | "This does not look like a valid import archive. Only zip files are " 337 | "supported." 338 | msgstr "" 339 | "Dies sieht nicht wie ein gültiges Archiv zum importieren aus. Es werden " 340 | "nur Zip-Dateien unterstützt." 341 | 342 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:144 343 | msgid "Currency symbol" 344 | msgstr "Währungssymbol" 345 | 346 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:156 347 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:87 348 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:27 349 | msgid "Cancel" 350 | msgstr "Abbrechen" 351 | 352 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:157 353 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:16 354 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:88 355 | msgid "Save" 356 | msgstr "Speichern" 357 | 358 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:5 359 | msgid "Filament Profiles" 360 | msgstr "Filamentprofile" 361 | 362 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:13 363 | msgid "--- New Profile ---" 364 | msgstr "--- Neues Profil ---" 365 | 366 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:14 367 | msgid "New" 368 | msgstr "Neu" 369 | 370 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:16 371 | msgid "Save profile" 372 | msgstr "Profil speichern" 373 | 374 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:30 375 | msgid "Vendor must be set" 376 | msgstr "Lieferant muss gesetzt sein" 377 | 378 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:42 379 | msgid "Material must be set" 380 | msgstr "Matarial muss gesetzt sein" 381 | 382 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:50 383 | msgid "Density" 384 | msgstr "Dichte" 385 | 386 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:62 387 | msgid "Diameter" 388 | msgstr "Durchmesser" 389 | 390 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:75 391 | msgid "Close" 392 | msgstr "Schließen" 393 | 394 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:5 395 | msgid "Filament Spool" 396 | msgstr "Filamentspule" 397 | 398 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:19 399 | msgid "Name must be set" 400 | msgstr "Name muss gesetzt sein" 401 | 402 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:27 403 | msgid "Profile" 404 | msgstr "Profil" 405 | 406 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:38 407 | msgid "Price" 408 | msgstr "Preis" 409 | 410 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:74 411 | msgid "Temperature offset" 412 | msgstr "Temperaturoffset" 413 | 414 | #: octoprint_filamentmanager/templates/sidebar.jinja2:3 415 | msgid "hide overused usage" 416 | msgstr "" 417 | 418 | #: octoprint_filamentmanager/templates/sidebar.jinja2:10 419 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:18 420 | msgid "Tool" 421 | msgstr "Tool" 422 | 423 | #: octoprint_filamentmanager/templates/sidebar.jinja2:19 424 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:19 425 | msgid "--- Select Spool ---" 426 | msgstr "--- Spule auswählen ---" 427 | 428 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:5 429 | msgid "Confirm your selected spools" 430 | msgstr "Bestätige deine Spulauswahl" 431 | 432 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:10 433 | msgid "" 434 | "There are no information available about the active tools for the print " 435 | "job. Make sure the analysing process of the file has finished and that " 436 | "it's loaded correctly." 437 | msgstr "" 438 | "Es sind keine Informationen über die aktiven Tools für den Druckauftrag " 439 | "vorhanden. Überprüfe ob die Datei bereits analysiert und korrekt geladen " 440 | "wurde." 441 | 442 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:14 443 | msgid "" 444 | "Please confirm your selected spools for all active tools. This dialog is " 445 | "meant to protect you from accidentically selecting wrong spools for the " 446 | "print." 447 | msgstr "" 448 | "Bitte bestätige deine Spulenauswahl für alle aktiven Tools. Dieser Dialog" 449 | " soll verhindern, dass du aus Versehen falsche Spulen für deinen Druck " 450 | "auswählst." 451 | 452 | #~ msgid "Profile (ascending)" 453 | #~ msgstr "Profil (aufsteigend)" 454 | 455 | #~ msgid "Selected Spools" 456 | #~ msgstr "Ausgewählte Spulen" 457 | 458 | #~ msgid "Filament warning" 459 | #~ msgstr "Filament-Warnung" 460 | 461 | #~ msgid "Saving failed" 462 | #~ msgstr "Speichern fehlgeschlagen" 463 | 464 | #~ msgid "Failed to query spools" 465 | #~ msgstr "Abfrage der Spulen fehlgeschlagen" 466 | 467 | #~ msgid "" 468 | #~ "There was an unexpected database error" 469 | #~ " while saving the filament profile, " 470 | #~ "please consult the logs." 471 | #~ msgstr "" 472 | #~ "Unerwarteter Fehler beim Speichern des " 473 | #~ "Filamentprofils, bitte konsultiere das Log." 474 | 475 | #~ msgid "" 476 | #~ "There was an unexpected database error" 477 | #~ " while updating the filament profile, " 478 | #~ "please consult the logs." 479 | #~ msgstr "" 480 | #~ "Ein unerwarteter Datenbankfehler ist " 481 | #~ "aufgetreten, bitte konsultiere die Logs." 482 | 483 | #~ msgid "" 484 | #~ "There was an unexpected error while removing the filament spool,\n" 485 | #~ " please consult the logs." 486 | #~ msgstr "" 487 | #~ "Ein unerwarteter Datenbankfehler ist " 488 | #~ "aufgetreten, bitte konsultiere die Logs." 489 | 490 | #~ msgid "Spool selection failed" 491 | #~ msgstr "Konnte Spule nicht auswählen" 492 | 493 | #~ msgid "Cannot delete profiles with associated spools." 494 | #~ msgstr "Es können keine Profile mit verknüpften Spulen gelöscht werden." 495 | 496 | #~ msgid "Data import successfull" 497 | #~ msgstr "Daten-Import erfolgreich" 498 | 499 | #~ msgid "Enable filament odometer" 500 | #~ msgstr "Filament-Hodometer aktivieren" 501 | 502 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/translations/es/LC_MESSAGES/messages.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/octoprint_filamentmanager/translations/es/LC_MESSAGES/messages.mo -------------------------------------------------------------------------------- /octoprint_filamentmanager/translations/es/LC_MESSAGES/messages.po: -------------------------------------------------------------------------------- 1 | # Spanish translations for OctoPrint-FilamentManager. 2 | # Copyright (C) 2019 The OctoPrint Project 3 | # This file is distributed under the same license as the 4 | # OctoPrint-FilamentManager project. 5 | # Ivan Garcia , 2019. 6 | # Carlos Romero , 2021. 7 | # 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: OctoPrint-FilamentManager 0.5.2\n" 11 | "Report-Msgid-Bugs-To: i18n@octoprint.org\n" 12 | "POT-Creation-Date: 2021-10-17 11:30+0200\n" 13 | "PO-Revision-Date: 2021-10-18 12:35+0100\n" 14 | "Last-Translator: Carlos Romero \n" 15 | "Language: es\n" 16 | "Language-Team: es \n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1)\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=utf-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Generated-By: Babel 2.9.0\n" 22 | 23 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:357 24 | msgid "Start Print" 25 | msgstr "Comenzar Impresión" 26 | 27 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:372 28 | msgid "Resume Print" 29 | msgstr "Continuar Impresión" 30 | 31 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:447 32 | msgid "Data import failed" 33 | msgstr "Error al importar los datos" 34 | 35 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:448 36 | msgid "Something went wrong, please consult the logs." 37 | msgstr "Algo ha ido mal, revisa el log para más información." 38 | 39 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:580 40 | msgid "Could not add profile" 41 | msgstr "No se puede añadir el perfil" 42 | 43 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:581 44 | msgid "" 45 | "There was an unexpected error while saving the filament profile, please " 46 | "consult the logs." 47 | msgstr "" 48 | "Ha ocurrido un error al intentar guardar el perfil del filamento, por " 49 | "favor revisa el log para más información." 50 | 51 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:602 52 | msgid "Could not update profile" 53 | msgstr "No se puede actualizar el perfil" 54 | 55 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:603 56 | msgid "" 57 | "There was an unexpected error while updating the filament profile, please" 58 | " consult the logs." 59 | msgstr "Ha ocurrido un error mientras se actualizaba el perfil del filamento" 60 | 61 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:617 62 | msgid "Could not delete profile" 63 | msgstr "No se puede eliminar el perfil" 64 | 65 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:618 66 | msgid "" 67 | "There was an unexpected error while removing the filament profile, please" 68 | " consult the logs." 69 | msgstr "" 70 | "Ha ocurrido un error al intentar eliminar el perfil del filamento, por " 71 | "favor revisa el log para más información." 72 | 73 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:627 74 | msgid "Delete profile?" 75 | msgstr "¿Eliminar perfil?" 76 | 77 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:628 78 | msgid "" 79 | "You are about to delete the filament profile (). Please" 80 | " note that it is not possible to delete profiles with associated spools." 81 | msgstr "" 82 | "Estas apunto de borrar el perfil de filamento (). Ten " 83 | "en cuenta que no es posible borrar perfiles con bobinas asociadas." 84 | 85 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:629 86 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:949 87 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:15 88 | msgid "Delete" 89 | msgstr "Eliminar" 90 | 91 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:709 92 | msgid "Could not select spool" 93 | msgstr "No se puede elegir la bobina" 94 | 95 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:710 96 | msgid "" 97 | "There was an unexpected error while selecting the spool, please consult " 98 | "the logs." 99 | msgstr "" 100 | "Ha ocurrido un error al intentar seleccionar el perfil del filamento, por" 101 | " favor revisa el log para más información." 102 | 103 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:898 104 | msgid "Could not add spool" 105 | msgstr "No se puede añadir la bobina" 106 | 107 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:899 108 | msgid "" 109 | "There was an unexpected error while saving the filament spool, please " 110 | "consult the logs." 111 | msgstr "" 112 | "Ha ocurrido un error al intentar guardar la bobina de filamento, por " 113 | "favor revisa el log para más información." 114 | 115 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:921 116 | msgid "Could not update spool" 117 | msgstr "No se puede actualizar la bobina" 118 | 119 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:922 120 | msgid "" 121 | "There was an unexpected error while updating the filament spool, please " 122 | "consult the logs." 123 | msgstr "" 124 | "Ha ocurrido un error al intentar actualizar la bobina de filamento, por " 125 | "favor revisa el log para más información." 126 | 127 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:937 128 | msgid "Could not delete spool" 129 | msgstr "No se puede eliminar la bobina" 130 | 131 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:938 132 | msgid "" 133 | "There was an unexpected error while removing the filament spool, please " 134 | "consult the logs." 135 | msgstr "" 136 | "Ha ocurrido un error al intentar eliminar la bobina de filamento, por " 137 | "favor revisa el log para más información." 138 | 139 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:947 140 | msgid "Delete spool?" 141 | msgstr "¿Borrar bobina?" 142 | 143 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:948 144 | msgid "You are about to delete the filament spool - ()." 145 | msgstr "Estás a punto de borrar la bobina de filamento - ()." 146 | 147 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:1020 148 | msgid "Insufficient filament" 149 | msgstr "Filamento insuficiente" 150 | 151 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:1021 152 | msgid "" 153 | "The current print job needs more material than what's left on the " 154 | "selected spool." 155 | msgstr "" 156 | "La impresión actual necesita más filamento del que hay en la bobina " 157 | "seleccionada." 158 | 159 | #: octoprint_filamentmanager/templates/settings.jinja2:4 160 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:5 161 | msgid "Plugin Configuration" 162 | msgstr "Configuración del plugin" 163 | 164 | #: octoprint_filamentmanager/templates/settings.jinja2:7 165 | msgid "Filament Spools" 166 | msgstr "Bobinas de filamento" 167 | 168 | #: octoprint_filamentmanager/templates/settings.jinja2:13 169 | msgid "Items per page" 170 | msgstr "Elementos por página" 171 | 172 | #: octoprint_filamentmanager/templates/settings.jinja2:22 173 | msgid "Sort by" 174 | msgstr "Ordenar por" 175 | 176 | #: octoprint_filamentmanager/templates/settings.jinja2:23 177 | msgid "Name (ascending)" 178 | msgstr "Nombre (Ascendente)" 179 | 180 | #: octoprint_filamentmanager/templates/settings.jinja2:24 181 | msgid "Material (ascending)" 182 | msgstr "Material (Ascendente)" 183 | 184 | #: octoprint_filamentmanager/templates/settings.jinja2:25 185 | msgid "Vendor (ascending)" 186 | msgstr "Fabricante (Ascendente)" 187 | 188 | #: octoprint_filamentmanager/templates/settings.jinja2:26 189 | msgid "Remaining (descending)" 190 | msgstr "Restante (Descendente)" 191 | 192 | #: octoprint_filamentmanager/templates/settings.jinja2:36 193 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:15 194 | msgid "Name" 195 | msgstr "Nombre" 196 | 197 | #: octoprint_filamentmanager/templates/settings.jinja2:37 198 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:38 199 | msgid "Material" 200 | msgstr "Material" 201 | 202 | #: octoprint_filamentmanager/templates/settings.jinja2:38 203 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:26 204 | msgid "Vendor" 205 | msgstr "Fabricante" 206 | 207 | #: octoprint_filamentmanager/templates/settings.jinja2:39 208 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:50 209 | msgid "Weight" 210 | msgstr "Peso" 211 | 212 | #: octoprint_filamentmanager/templates/settings.jinja2:40 213 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:62 214 | msgid "Remaining" 215 | msgstr "Restante" 216 | 217 | #: octoprint_filamentmanager/templates/settings.jinja2:41 218 | msgid "Used" 219 | msgstr "Usado" 220 | 221 | #: octoprint_filamentmanager/templates/settings.jinja2:42 222 | msgid "Action" 223 | msgstr "Acción" 224 | 225 | #: octoprint_filamentmanager/templates/settings.jinja2:54 226 | msgid "Edit Spool" 227 | msgstr "Editar bobina" 228 | 229 | #: octoprint_filamentmanager/templates/settings.jinja2:55 230 | msgid "Duplicate Spool" 231 | msgstr "Duplicar bobina" 232 | 233 | #: octoprint_filamentmanager/templates/settings.jinja2:56 234 | msgid "Delete Spool" 235 | msgstr "Borrar bobina" 236 | 237 | #: octoprint_filamentmanager/templates/settings.jinja2:79 238 | msgid "Manage Profiles" 239 | msgstr "Administrar perfiles" 240 | 241 | #: octoprint_filamentmanager/templates/settings.jinja2:80 242 | msgid "Add Spool" 243 | msgstr "Añadir bobina" 244 | 245 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:12 246 | msgid "Features" 247 | msgstr "Características" 248 | 249 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:13 250 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:91 251 | msgid "Database" 252 | msgstr "Base de datos" 253 | 254 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:14 255 | msgid "Appearance" 256 | msgstr "Apariencia" 257 | 258 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:26 259 | msgid "" 260 | "Show dialog to confirm selected spools before starting/resuming the print" 261 | " job" 262 | msgstr "" 263 | "Mostrar el diálogo para confirmar las bobinas antes de empezar/continuar " 264 | "una impresión" 265 | 266 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:34 267 | msgid "Warn if print job exceeds remaining filament" 268 | msgstr "Avisar si la impresión excede el filamento restante" 269 | 270 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:42 271 | msgid "Enable software odometer to measure used filament" 272 | msgstr "Habilitar medición mediante software \"odometer\"" 273 | 274 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:50 275 | msgid "Pause print if filament runs out" 276 | msgstr "Pausar la impresión si el filamento se agota" 277 | 278 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:56 279 | msgid "Pause threshold" 280 | msgstr "Margen de pausa" 281 | 282 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:74 283 | msgid "Use external database" 284 | msgstr "Usar base de datos externa" 285 | 286 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:78 287 | msgid "" 288 | "If you want to use an external database, please take a look into my wiki how to " 291 | "install the drivers and setup the database." 292 | msgstr "" 293 | "Si quieres usar una base de datos externa, por favor, mira mi wiki sobre como " 296 | "instalar los drivers y configurar la base de datos." 297 | 298 | 299 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:84 300 | msgid "URI" 301 | msgstr "URI" 302 | 303 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:98 304 | msgid "Username" 305 | msgstr "Usuario" 306 | 307 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:105 308 | msgid "Password" 309 | msgstr "Contraseña" 310 | 311 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:113 312 | msgid "Test connection" 313 | msgstr "Comprobar conexión" 314 | 315 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:118 316 | msgid "" 317 | "Note: If you change these settings you must restart your OctoPrint " 318 | "instance for the changes to take affect." 319 | msgstr "" 320 | "Nota: Si cambias esta configuración deberás reiniciar la instancia de " 321 | "OctoPrint para que los cambios tengan efecto." 322 | 323 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:122 324 | msgid "Import & Export" 325 | msgstr "Importar y exportar" 326 | 327 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:127 328 | msgid "Browse..." 329 | msgstr "Examinar..." 330 | 331 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:131 332 | msgid "Import" 333 | msgstr "Importar" 334 | 335 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:133 336 | msgid "Export" 337 | msgstr "Exportar" 338 | 339 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:135 340 | msgid "" 341 | "This does not look like a valid import archive. Only zip files are " 342 | "supported." 343 | msgstr "No parece un fichero de importación válido. Sólo se permiten archivos zip." 344 | 345 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:144 346 | msgid "Currency symbol" 347 | msgstr "Símbolo de moneda" 348 | 349 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:156 350 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:87 351 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:27 352 | msgid "Cancel" 353 | msgstr "Cancelar" 354 | 355 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:157 356 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:16 357 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:88 358 | msgid "Save" 359 | msgstr "Guardar" 360 | 361 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:5 362 | msgid "Filament Profiles" 363 | msgstr "Perfiles de filamento" 364 | 365 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:13 366 | msgid "--- New Profile ---" 367 | msgstr "--- Nuevo perfil ---" 368 | 369 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:14 370 | msgid "New" 371 | msgstr "Nuevo" 372 | 373 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:16 374 | msgid "Save profile" 375 | msgstr "Guardar perfil" 376 | 377 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:30 378 | msgid "Vendor must be set" 379 | msgstr "Debes escribir el fabricante" 380 | 381 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:42 382 | msgid "Material must be set" 383 | msgstr "Debes escribir el material" 384 | 385 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:50 386 | msgid "Density" 387 | msgstr "Densidad" 388 | 389 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:62 390 | msgid "Diameter" 391 | msgstr "Diámetro" 392 | 393 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:75 394 | msgid "Close" 395 | msgstr "Cerrar" 396 | 397 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:5 398 | msgid "Filament Spool" 399 | msgstr "Bobina de Filamento" 400 | 401 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:19 402 | msgid "Name must be set" 403 | msgstr "Debes escribir un nombre" 404 | 405 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:27 406 | msgid "Profile" 407 | msgstr "Perfil" 408 | 409 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:38 410 | msgid "Price" 411 | msgstr "Precio" 412 | 413 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:74 414 | msgid "Temperature offset" 415 | msgstr "Compensación de temperatura" 416 | 417 | #: octoprint_filamentmanager/templates/sidebar.jinja2:3 418 | msgid "hide overused usage" 419 | msgstr "Ocultar bobinas agotadas" 420 | 421 | #: octoprint_filamentmanager/templates/sidebar.jinja2:10 422 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:18 423 | msgid "Tool" 424 | msgstr "Extrusor" 425 | 426 | #: octoprint_filamentmanager/templates/sidebar.jinja2:19 427 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:19 428 | msgid "--- Select Spool ---" 429 | msgstr "--- Seleccionar bobina ---" 430 | 431 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:5 432 | msgid "Confirm your selected spools" 433 | msgstr "Confirma las bobinas seleccionadas" 434 | 435 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:10 436 | msgid "" 437 | "There are no information available about the active tools for the print " 438 | "job. Make sure the analysing process of the file has finished and that " 439 | "it's loaded correctly." 440 | msgstr "" 441 | "No hay información disponible sobre el extrusor de la impresión actual. " 442 | "Asegúrate de que el proceso de análisis esté finalizado y haya cargado" 443 | " correctamente." 444 | 445 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:14 446 | msgid "" 447 | "Please confirm your selected spools for all active tools. This dialog is " 448 | "meant to protect you from accidentically selecting wrong spools for the " 449 | "print." 450 | msgstr "" 451 | "Por favor, confirma las bobinas seleccionadas para todos los extrusores activos. Este diálogo está " 452 | "pensado para evitar que elijas bobinas incorrectas para esta impresión." 453 | 454 | -------------------------------------------------------------------------------- /octoprint_filamentmanager/translations/fr/LC_MESSAGES/messages.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/octoprint_filamentmanager/translations/fr/LC_MESSAGES/messages.mo -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Sven Lohrmann ", 3 | "name": "OctoPrint-FilamentManager", 4 | "version": "0.0.0", 5 | "license": "AGPL-3.0", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/malnvenshorn/OctoPrint-FilamentManager.git" 9 | }, 10 | "devDependencies": { 11 | "babel-core": "^6.26.0", 12 | "babel-plugin-transform-remove-strict-mode": "^0.0.2", 13 | "babel-preset-env": "^1.6.1", 14 | "eslint": "^4.11.0", 15 | "eslint-config-airbnb": "^16.1.0", 16 | "eslint-plugin-import": "^2.8.0", 17 | "eslint-plugin-jsx-a11y": "^6.0.2", 18 | "eslint-plugin-react": "^7.5.1", 19 | "gulp": "^3.9.1", 20 | "gulp-babel": "^7.0.0", 21 | "gulp-clean-css": "^3.9.0", 22 | "gulp-concat": "^2.6.1", 23 | "gulp-eslint": "^4.0.0" 24 | }, 25 | "dependencies": { 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | ### 2 | # This file is only here to make sure that something like 3 | # 4 | # pip install -e . 5 | # 6 | # works as expected. Requirements can be found in setup.py. 7 | ### 8 | 9 | . 10 | -------------------------------------------------------------------------------- /screenshots/filamentmanager_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/screenshots/filamentmanager_settings.png -------------------------------------------------------------------------------- /screenshots/filamentmanager_settings_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/screenshots/filamentmanager_settings_profile.png -------------------------------------------------------------------------------- /screenshots/filamentmanager_settings_spool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/screenshots/filamentmanager_settings_spool.png -------------------------------------------------------------------------------- /screenshots/filamentmanager_sidebar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/screenshots/filamentmanager_sidebar.png -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from setuptools import setup 3 | 4 | ######################################################################################################################## 5 | 6 | plugin_identifier = "filamentmanager" 7 | plugin_package = "octoprint_filamentmanager" 8 | plugin_name = "OctoPrint-FilamentManager" 9 | plugin_version = "1.9.1" 10 | plugin_description = "Manage your spools and keep track of remaining filament on them" 11 | plugin_author = "Sven Lohrmann, Olli" 12 | plugin_author_email = "ollisgit@gmail.com, malnvenshorn@gmail.com" 13 | plugin_url = "https://github.com/OllisGit/OctoPrint-FilamentManager" 14 | plugin_license = "AGPLv3" 15 | plugin_requires = ["backports.csv>=1.0.5,<1.1", 16 | "uritools>=2.1,<2.2", 17 | "SQLAlchemy>=1.1.15,<1.2"] 18 | plugin_additional_data = [] 19 | plugin_additional_packages = [] 20 | plugin_ignored_packages = [] 21 | additional_setup_parameters = {} 22 | 23 | ######################################################################################################################## 24 | 25 | try: 26 | import octoprint_setuptools 27 | except ImportError: 28 | print("Could not import OctoPrint's setuptools, are you sure you are running that under " 29 | "the same python installation that OctoPrint is installed under?") 30 | import sys 31 | sys.exit(-1) 32 | 33 | setup_parameters = octoprint_setuptools.create_plugin_setup_parameters( 34 | identifier=plugin_identifier, 35 | package=plugin_package, 36 | name=plugin_name, 37 | version=plugin_version, 38 | description=plugin_description, 39 | author=plugin_author, 40 | mail=plugin_author_email, 41 | url=plugin_url, 42 | license=plugin_license, 43 | requires=plugin_requires, 44 | additional_packages=plugin_additional_packages, 45 | ignored_packages=plugin_ignored_packages, 46 | additional_data=plugin_additional_data 47 | ) 48 | 49 | if len(additional_setup_parameters): 50 | from octoprint.util import dict_merge 51 | setup_parameters = dict_merge(setup_parameters, additional_setup_parameters) 52 | 53 | setup(**setup_parameters) 54 | -------------------------------------------------------------------------------- /static/css/font.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'icomoon'; 3 | src: url('../fonts/icomoon.eot?2tngg'); 4 | src: url('../fonts/icomoon.eot?2tngg#iefix') format('embedded-opentype'), 5 | url('../fonts/icomoon.ttf?2tngg') format('truetype'), 6 | url('../fonts/icomoon.woff?2tngg') format('woff'), 7 | url('../fonts/icomoon.svg?2tngg#icomoon') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | 12 | .fa-reel { 13 | font-family: icomoon !important; 14 | } 15 | 16 | .fa-reel:before { 17 | content: "\e900"; 18 | } 19 | -------------------------------------------------------------------------------- /static/css/style.css: -------------------------------------------------------------------------------- 1 | .settings_plugin_filamentmanager_spools_header { 2 | margin-bottom: 10px; 3 | } 4 | 5 | .settings_plugin_filamentmanager_spools_header input[type=number] { 6 | width: 14px; 7 | height: 11px; 8 | font-size: 12px; 9 | text-align: center; 10 | } 11 | 12 | table td.settings_plugin_filamentmanager_spools_name, 13 | table th.settings_plugin_filamentmanager_spools_name { 14 | width: 20%; 15 | text-align: left; 16 | } 17 | 18 | table td.settings_plugin_filamentmanager_spools_material, 19 | table th.settings_plugin_filamentmanager_spools_material { 20 | width: 15%; 21 | text-align: left; 22 | } 23 | 24 | table td.settings_plugin_filamentmanager_spools_vendor, 25 | table th.settings_plugin_filamentmanager_spools_vendor { 26 | width: 20%; 27 | text-align: left; 28 | } 29 | 30 | table td.settings_plugin_filamentmanager_spools_weight, 31 | table th.settings_plugin_filamentmanager_spools_weight { 32 | width: 15%; 33 | text-align: right; 34 | } 35 | 36 | table td.settings_plugin_filamentmanager_spools_remaining, 37 | table th.settings_plugin_filamentmanager_spools_remaining { 38 | width: 15%; 39 | text-align: right; 40 | } 41 | 42 | table td.settings_plugin_filamentmanager_spools_used, 43 | table th.settings_plugin_filamentmanager_spools_used { 44 | width: 15%; 45 | text-align: right; 46 | } 47 | 48 | table td.settings_plugin_filamentmanager_spools_action, 49 | table th.settings_plugin_filamentmanager_spools_action { 50 | width: 70px; 51 | text-align: center; 52 | } 53 | 54 | table td.settings_plugin_filamentmanager_spools_action a { 55 | color: #000; 56 | text-decoration: none; 57 | } 58 | 59 | .settings_plugin_filamentmanager_profiledialog_select { 60 | margin-bottom: 6px; 61 | } 62 | 63 | .settings_plugin_filamentmanager_profiledialog_select button.btn-small { 64 | margin-bottom: 10px; 65 | } 66 | 67 | #sidebar_plugin_filamentmanager_wrapper .accordion-heading i.fa-spinner { 68 | float: right; 69 | margin: 10px 15px; 70 | } 71 | 72 | #sidebar_plugin_filamentmanager .accordion-inner { 73 | padding-bottom: 0px; 74 | } 75 | -------------------------------------------------------------------------------- /static/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | /* global FilamentManager OCTOPRINT_VIEWMODELS */ 2 | 3 | (function registerViewModel() { 4 | const Plugin = new FilamentManager(); 5 | 6 | OCTOPRINT_VIEWMODELS.push({ 7 | construct: Plugin.viewModel, 8 | dependencies: Plugin.REQUIRED_VIEWMODELS, 9 | elements: Plugin.BINDINGS, 10 | }); 11 | }()); 12 | -------------------------------------------------------------------------------- /static/js/constructor.js: -------------------------------------------------------------------------------- 1 | /* 2 | * View model for OctoPrint-FilamentManager 3 | * 4 | * Author: Sven Lohrmann 5 | * License: AGPLv3 6 | */ 7 | 8 | const FilamentManager = function FilamentManager() { 9 | this.core.client.call(this); 10 | return this.core.bridge.call(this); 11 | }; 12 | 13 | FilamentManager.prototype = { 14 | constructor: FilamentManager, 15 | core: {}, 16 | viewModels: {}, 17 | selectedSpools: undefined, 18 | }; 19 | -------------------------------------------------------------------------------- /static/js/core/bridge.js: -------------------------------------------------------------------------------- 1 | /* global FilamentManager _ */ 2 | 3 | FilamentManager.prototype.core.bridge = function pluginBridge() { 4 | const self = this; 5 | 6 | self.core.bridge = { 7 | allViewModels: {}, 8 | 9 | REQUIRED_VIEWMODELS: [ 10 | 'settingsViewModel', 11 | 'printerStateViewModel', 12 | 'loginStateViewModel', 13 | 'temperatureViewModel', 14 | 'filesViewModel', 15 | ], 16 | 17 | BINDINGS: [ 18 | '#settings_plugin_filamentmanager', 19 | '#settings_plugin_filamentmanager_profiledialog', 20 | '#settings_plugin_filamentmanager_spooldialog', 21 | '#settings_plugin_filamentmanager_configurationdialog', 22 | '#sidebar_plugin_filamentmanager_wrapper', 23 | '#plugin_filamentmanager_confirmationdialog', 24 | ], 25 | 26 | viewModel: function FilamentManagerViewModel(viewModels) { 27 | self.core.bridge.allViewModels = _.object(self.core.bridge.REQUIRED_VIEWMODELS, viewModels); 28 | self.core.callbacks.call(self); 29 | 30 | Object.values(self.viewModels).forEach(viewModel => viewModel.call(self)); 31 | 32 | self.viewModels.profiles.updateCallbacks.push(self.viewModels.spools.requestSpools); 33 | self.viewModels.profiles.updateCallbacks.push(self.viewModels.selections.requestSelectedSpools); 34 | self.viewModels.spools.updateCallbacks.push(self.viewModels.selections.requestSelectedSpools); 35 | self.viewModels.import.afterImportCallbacks.push(self.viewModels.profiles.requestProfiles); 36 | self.viewModels.import.afterImportCallbacks.push(self.viewModels.spools.requestSpools); 37 | self.viewModels.import.afterImportCallbacks.push(self.viewModels.selections.requestSelectedSpools); 38 | 39 | self.selectedSpools = self.viewModels.selections.selectedSpools; // for backwards compatibility 40 | return self; 41 | }, 42 | }; 43 | 44 | return self.core.bridge; 45 | }; 46 | -------------------------------------------------------------------------------- /static/js/core/callbacks.js: -------------------------------------------------------------------------------- 1 | /* global FilamentManager Utils */ 2 | 3 | FilamentManager.prototype.core.callbacks = function octoprintCallbacks() { 4 | const self = this; 5 | 6 | self.onStartup = function onStartupCallback() { 7 | self.viewModels.warning.replaceFilamentView(); 8 | }; 9 | 10 | self.onBeforeBinding = function onBeforeBindingCallback() { 11 | self.viewModels.config.loadData(); 12 | self.viewModels.selections.setArraySize(); 13 | self.viewModels.selections.setSubscriptions(); 14 | self.viewModels.warning.setSubscriptions(); 15 | }; 16 | 17 | self.onStartupComplete = function onStartupCompleteCallback() { 18 | const requests = [ 19 | self.viewModels.profiles.requestProfiles, 20 | self.viewModels.spools.requestSpools, 21 | self.viewModels.selections.requestSelectedSpools, 22 | ]; 23 | 24 | // We chain them because, e.g. selections depends on spools 25 | Utils.runRequestChain(requests); 26 | }; 27 | 28 | self.onDataUpdaterPluginMessage = function onDataUpdaterPluginMessageCallback(plugin, data) { 29 | if (plugin !== 'filamentmanager') return; 30 | 31 | const messageType = data.type; 32 | // const messageData = data.data; 33 | // TODO needs improvement 34 | if (messageType === 'data_changed') { 35 | self.viewModels.profiles.requestProfiles(); 36 | self.viewModels.spools.requestSpools(); 37 | self.viewModels.selections.requestSelectedSpools(); 38 | } 39 | }; 40 | }; 41 | -------------------------------------------------------------------------------- /static/js/core/client.js: -------------------------------------------------------------------------------- 1 | /* global FilamentManager OctoPrint */ 2 | 3 | FilamentManager.prototype.core.client = function apiClient() { 4 | const self = this.core.client; 5 | 6 | const pluginUrl = 'plugin/filamentmanager'; 7 | 8 | const profileUrl = function apiProfileNamespace(profile) { 9 | const url = `${pluginUrl}/profiles`; 10 | return (profile === undefined) ? url : `${url}/${profile}`; 11 | }; 12 | 13 | const spoolUrl = function apiSpoolNamespace(spool) { 14 | const url = `${pluginUrl}/spools`; 15 | return (spool === undefined) ? url : `${url}/${spool}`; 16 | }; 17 | 18 | const selectionUrl = function apiSelectionNamespace(selection) { 19 | const url = `${pluginUrl}/selections`; 20 | return (selection === undefined) ? url : `${url}/${selection}`; 21 | }; 22 | 23 | self.profile = { 24 | list(force = false, opts) { 25 | const query = force ? { force } : {}; 26 | return OctoPrint.getWithQuery(profileUrl(), query, opts); 27 | }, 28 | 29 | get(id, opts) { 30 | return OctoPrint.get(profileUrl(id), opts); 31 | }, 32 | 33 | add(profile, opts) { 34 | const data = { profile }; 35 | return OctoPrint.postJson(profileUrl(), data, opts); 36 | }, 37 | 38 | update(id, profile, opts) { 39 | const data = { profile }; 40 | return OctoPrint.patchJson(profileUrl(id), data, opts); 41 | }, 42 | 43 | delete(id, opts) { 44 | return OctoPrint.delete(profileUrl(id), opts); 45 | }, 46 | }; 47 | 48 | self.spool = { 49 | list(force = false, opts) { 50 | const query = force ? { force } : {}; 51 | return OctoPrint.getWithQuery(spoolUrl(), query, opts); 52 | }, 53 | 54 | get(id, opts) { 55 | return OctoPrint.get(spoolUrl(id), opts); 56 | }, 57 | 58 | add(spool, opts) { 59 | const data = { spool }; 60 | return OctoPrint.postJson(spoolUrl(), data, opts); 61 | }, 62 | 63 | update(id, spool, opts) { 64 | const data = { spool }; 65 | return OctoPrint.patchJson(spoolUrl(id), data, opts); 66 | }, 67 | 68 | delete(id, opts) { 69 | return OctoPrint.delete(spoolUrl(id), opts); 70 | }, 71 | }; 72 | 73 | self.selection = { 74 | list(opts) { 75 | return OctoPrint.get(selectionUrl(), opts); 76 | }, 77 | 78 | update(id, selection, opts) { 79 | const data = { selection }; 80 | return OctoPrint.patchJson(selectionUrl(id), data, opts); 81 | }, 82 | }; 83 | 84 | self.database = { 85 | test(config, opts) { 86 | const url = `${pluginUrl}/database/test`; 87 | const data = { config }; 88 | return OctoPrint.postJson(url, data, opts); 89 | }, 90 | }; 91 | }; 92 | -------------------------------------------------------------------------------- /static/js/utils.js: -------------------------------------------------------------------------------- 1 | class Utils { // eslint-disable-line no-unused-vars 2 | static validInt(value, def) { 3 | const v = Number.parseInt(value, 10); 4 | return Number.isNaN(v) ? def : v; 5 | } 6 | 7 | static validFloat(value, def) { 8 | const v = Number.parseFloat(value); 9 | return Number.isNaN(v) ? def : v; 10 | } 11 | 12 | static runRequestChain(requests) { 13 | let index = 0; 14 | 15 | const next = function callNextRequest() { 16 | if (index < requests.length) { 17 | // Do the next, increment the call index 18 | requests[index]().done(() => { 19 | index += 1; 20 | next(); 21 | }); 22 | } 23 | }; 24 | 25 | next(); // Start chain 26 | } 27 | 28 | static extractToolIDFromName(name) { 29 | const result = /(\d+)/.exec(name); 30 | return result === null ? 0 : result[1]; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /static/js/viewmodels/config.js: -------------------------------------------------------------------------------- 1 | /* global FilamentManager ko $ */ 2 | 3 | FilamentManager.prototype.viewModels.config = function configurationViewModel() { 4 | const self = this.viewModels.config; 5 | const api = this.core.client; 6 | const { settingsViewModel } = this.core.bridge.allViewModels; 7 | 8 | const dialog = $('#settings_plugin_filamentmanager_configurationdialog'); 9 | 10 | self.showDialog = function showConfigurationDialog() { 11 | self.loadData(); 12 | dialog.modal('show'); 13 | }; 14 | 15 | self.hideDialog = function hideConfigurationDialog() { 16 | dialog.modal('hide'); 17 | }; 18 | 19 | self.config = ko.mapping.fromJS({}); 20 | 21 | self.saveData = function savePluginConfiguration(viewModel, event) { 22 | const target = $(event.target); 23 | target.prepend(' '); 24 | 25 | const data = { 26 | plugins: { 27 | filamentmanager: ko.mapping.toJS(self.config), 28 | }, 29 | }; 30 | 31 | settingsViewModel.saveData(data, { 32 | success() { 33 | self.hideDialog(); 34 | }, 35 | complete() { 36 | $('i.fa-spinner', target).remove(); 37 | }, 38 | sending: true, 39 | }); 40 | }; 41 | 42 | self.loadData = function mapPluginConfigurationToObservables() { 43 | const pluginSettings = settingsViewModel.settings.plugins.filamentmanager; 44 | ko.mapping.fromJS(ko.toJS(pluginSettings), self.config); 45 | }; 46 | 47 | self.connectionTest = function runExternalDatabaseConnectionTest(viewModel, event) { 48 | const target = $(event.target); 49 | target.removeClass('btn-success btn-danger'); 50 | target.prepend(' '); 51 | target.prop('disabled', true); 52 | 53 | const data = ko.mapping.toJS(self.config.database); 54 | 55 | api.database.test(data) 56 | .done(() => { 57 | target.addClass('btn-success'); 58 | }) 59 | .fail(() => { 60 | target.addClass('btn-danger'); 61 | }) 62 | .always(() => { 63 | $('i.fa-spinner', target).remove(); 64 | target.prop('disabled', false); 65 | }); 66 | }; 67 | }; 68 | -------------------------------------------------------------------------------- /static/js/viewmodels/confirmation.js: -------------------------------------------------------------------------------- 1 | /* global FilamentManager gettext $ ko Utils OctoPrint */ 2 | 3 | FilamentManager.prototype.viewModels.confirmation = function spoolSelectionConfirmationViewModel() { 4 | const self = this.viewModels.confirmation; 5 | const { printerStateViewModel, settingsViewModel, filesViewModel } = this.core.bridge.allViewModels; 6 | const { selections } = this.viewModels; 7 | 8 | const dialog = $('#plugin_filamentmanager_confirmationdialog'); 9 | const button = $('#plugin_filamentmanager_confirmationdialog_print'); 10 | 11 | self.selections = ko.observableArray([]); 12 | 13 | self.print = function startResumePrintDummy() {}; 14 | 15 | self.checkSelection = function checkIfSpoolSelectionsMatchesSelectedSpoolsInSidebar() { 16 | let match = true; 17 | self.selections().forEach((value) => { 18 | if (selections.tools()[value.tool]() !== value.spool) match = false; 19 | }); 20 | button.attr('disabled', !match); 21 | }; 22 | 23 | const showDialog = function showSpoolConfirmationDialog() { 24 | const s = []; 25 | printerStateViewModel.filament().forEach((value) => { 26 | const toolID = Utils.extractToolIDFromName(value.name()); 27 | s.push({ spool: undefined, tool: toolID }); 28 | }); 29 | self.selections(s); 30 | button.attr('disabled', true); 31 | dialog.modal('show'); 32 | }; 33 | 34 | const startPrint = printerStateViewModel.print; 35 | 36 | printerStateViewModel.print = function confirmSpoolSelectionBeforeStartPrint() { 37 | if (settingsViewModel.settings.plugins.filamentmanager.confirmSpoolSelection()) { 38 | showDialog(); 39 | button.html(gettext('Start Print')); 40 | self.print = function continueToStartPrint() { 41 | dialog.modal('hide'); 42 | startPrint(); 43 | }; 44 | } else { 45 | startPrint(); 46 | } 47 | }; 48 | 49 | const resumePrint = printerStateViewModel.resume; 50 | 51 | printerStateViewModel.resume = function confirmSpoolSelectionBeforeResumePrint() { 52 | if (settingsViewModel.settings.plugins.filamentmanager.confirmSpoolSelection()) { 53 | showDialog(); 54 | button.html(gettext('Resume Print')); 55 | self.print = function continueToResumePrint() { 56 | dialog.modal('hide'); 57 | resumePrint(); 58 | }; 59 | } else { 60 | resumePrint(); 61 | } 62 | }; 63 | 64 | filesViewModel.loadFile = function confirmSpoolSelectionOnLoadAndPrint(data, printAfterLoad) { 65 | if (!data) { 66 | return; 67 | } 68 | 69 | if (printAfterLoad && filesViewModel.listHelper.isSelected(data) && filesViewModel.enablePrint(data)) { 70 | // file was already selected, just start the print job 71 | printerStateViewModel.print(); 72 | } else { 73 | // select file, start print job (if requested and within dimensions) 74 | const withinPrintDimensions = filesViewModel.evaluatePrintDimensions(data, true); 75 | const print = printAfterLoad && withinPrintDimensions; 76 | 77 | OctoPrint.files.select(data.origin, data.path, false) 78 | .done(() => { 79 | if (print) printerStateViewModel.print(); 80 | }); 81 | } 82 | }; 83 | }; 84 | -------------------------------------------------------------------------------- /static/js/viewmodels/import.js: -------------------------------------------------------------------------------- 1 | /* global FilamentManager ko $ PNotify gettext */ 2 | 3 | FilamentManager.prototype.viewModels.import = function importDataViewModel() { 4 | const self = this.viewModels.import; 5 | 6 | const importButton = $('#settings_plugin_filamentmanager_import_button'); 7 | const importElement = $('#settings_plugin_filamentmanager_import'); 8 | 9 | self.importFilename = ko.observable(); 10 | self.importInProgress = ko.observable(false); 11 | 12 | self.afterImportCallbacks = []; 13 | 14 | self.invalidArchive = ko.pureComputed(() => { 15 | const name = self.importFilename(); 16 | return name !== undefined && !name.toLocaleLowerCase().endsWith('.zip'); 17 | }); 18 | 19 | self.enableImport = ko.pureComputed(() => { 20 | const name = self.importFilename(); 21 | return name !== undefined && name.trim() !== '' && !self.invalidArchive(); 22 | }); 23 | 24 | importElement.fileupload({ 25 | dataType: 'json', 26 | maxNumberOfFiles: 1, 27 | autoUpload: false, 28 | add(e, data) { 29 | if (data.files.length === 0) return; 30 | 31 | self.importFilename(data.files[0].name); 32 | 33 | importButton.unbind('click'); 34 | importButton.bind('click', (event) => { 35 | self.importInProgress(true); 36 | event.preventDefault(); 37 | data.submit(); 38 | }); 39 | }, 40 | done() { 41 | self.afterImportCallbacks.forEach((callback) => { callback(); }); 42 | }, 43 | fail() { 44 | new PNotify({ // eslint-disable-line no-new 45 | title: gettext('Data import failed'), 46 | text: gettext('Something went wrong, please consult the logs.'), 47 | type: 'error', 48 | hide: false, 49 | }); 50 | }, 51 | always() { 52 | importButton.unbind('click'); 53 | self.importFilename(undefined); 54 | self.importInProgress(false); 55 | }, 56 | }); 57 | }; 58 | -------------------------------------------------------------------------------- /static/js/viewmodels/profiles.js: -------------------------------------------------------------------------------- 1 | /* global FilamentManager ko gettext showConfirmationDialog PNotify $ Utils */ 2 | 3 | FilamentManager.prototype.viewModels.profiles = function profilesViewModel() { 4 | const self = this.viewModels.profiles; 5 | const api = this.core.client; 6 | 7 | self.allProfiles = ko.observableArray([]); 8 | 9 | self.cleanProfile = function getDefaultValuesForNewProfile() { 10 | return { 11 | id: undefined, 12 | material: '', 13 | vendor: '', 14 | density: 1.25, 15 | diameter: 1.75, 16 | }; 17 | }; 18 | 19 | self.loadedProfile = { 20 | id: ko.observable(), 21 | vendor: ko.observable(), 22 | material: ko.observable(), 23 | density: ko.observable(), 24 | diameter: ko.observable(), 25 | isNew: ko.observable(true), 26 | }; 27 | 28 | self.vendorInvalid = ko.pureComputed(() => !self.loadedProfile.vendor()); 29 | self.materialInvalid = ko.pureComputed(() => !self.loadedProfile.material()); 30 | 31 | const loadProfile = function loadSelectedProfile() { 32 | if (self.loadedProfile.id() === undefined) { 33 | if (!self.loadedProfile.isNew()) { 34 | // selected 'new profile' in options menu, but no profile created yet 35 | self.fromProfileData(); 36 | } 37 | } else { 38 | // find profile data 39 | let data = ko.utils.arrayFirst(self.allProfiles(), item => item.id === self.loadedProfile.id()); 40 | 41 | if (!data) data = self.cleanProfile(); 42 | 43 | // populate data 44 | self.fromProfileData(data); 45 | } 46 | }; 47 | 48 | self.loadedProfile.id.subscribe(loadProfile); 49 | 50 | self.fromProfileData = function setLoadedProfileFromJSObject(data = self.cleanProfile()) { 51 | self.loadedProfile.isNew(data.id === undefined); 52 | self.loadedProfile.id(data.id); 53 | self.loadedProfile.vendor(data.vendor); 54 | self.loadedProfile.material(data.material); 55 | self.loadedProfile.density(data.density); 56 | self.loadedProfile.diameter(data.diameter); 57 | }; 58 | 59 | self.toProfileData = function getLoadedProfileAsJSObject() { 60 | const defaultProfile = self.cleanProfile(); 61 | 62 | return { 63 | id: self.loadedProfile.id(), 64 | vendor: self.loadedProfile.vendor(), 65 | material: self.loadedProfile.material(), 66 | density: Utils.validFloat(self.loadedProfile.density(), defaultProfile.density), 67 | diameter: Utils.validFloat(self.loadedProfile.diameter(), defaultProfile.diameter), 68 | }; 69 | }; 70 | 71 | const dialog = $('#settings_plugin_filamentmanager_profiledialog'); 72 | 73 | self.showProfileDialog = function showProfileDialog() { 74 | self.fromProfileData(); 75 | dialog.modal('show'); 76 | }; 77 | 78 | self.requestInProgress = ko.observable(false); 79 | 80 | self.processProfiles = function processRequestedProfiles(data) { 81 | self.allProfiles(data.profiles); 82 | }; 83 | 84 | self.requestProfiles = function requestAllProfilesFromBackend(force = false) { 85 | self.requestInProgress(true); 86 | return api.profile.list(force) 87 | .done((response) => { self.processProfiles(response); }) 88 | .always(() => { self.requestInProgress(false); }); 89 | }; 90 | 91 | self.saveProfile = function saveProfileToBackend(data = self.toProfileData()) { 92 | return self.loadedProfile.isNew() ? self.addProfile(data) : self.updateProfile(data); 93 | }; 94 | 95 | self.addProfile = function addProfileToBackend(data = self.toProfileData()) { 96 | self.requestInProgress(true); 97 | api.profile.add(data) 98 | .done((response) => { 99 | const { id } = response.profile; 100 | self.requestProfiles().done(() => { self.loadedProfile.id(id); }); 101 | }) 102 | .fail(() => { 103 | new PNotify({ // eslint-disable-line no-new 104 | title: gettext('Could not add profile'), 105 | text: gettext('There was an unexpected error while saving the filament profile, please consult the logs.'), 106 | type: 'error', 107 | hide: false, 108 | }); 109 | self.requestInProgress(false); 110 | }); 111 | }; 112 | 113 | self.updateCallbacks = []; 114 | 115 | self.updateProfile = function updateProfileInBackend(data = self.toProfileData()) { 116 | self.requestInProgress(true); 117 | api.profile.update(data.id, data) 118 | .done(() => { 119 | self.requestProfiles(); 120 | self.updateCallbacks.forEach((callback) => { callback(); }); 121 | }) 122 | .fail(() => { 123 | new PNotify({ // eslint-disable-line no-new 124 | title: gettext('Could not update profile'), 125 | text: gettext('There was an unexpected error while updating the filament profile, please consult the logs.'), 126 | type: 'error', 127 | hide: false, 128 | }); 129 | self.requestInProgress(false); 130 | }); 131 | }; 132 | 133 | self.removeProfile = function removeProfileFromBackend(data) { 134 | const perform = function performProfileRemoval() { 135 | api.profile.delete(data.id) 136 | .done(() => { 137 | self.requestProfiles(); 138 | }) 139 | .fail(() => { 140 | new PNotify({ // eslint-disable-line no-new 141 | title: gettext('Could not delete profile'), 142 | text: gettext('There was an unexpected error while removing the filament profile, please consult the logs.'), 143 | type: 'error', 144 | hide: false, 145 | }); 146 | self.requestInProgress(false); 147 | }); 148 | }; 149 | 150 | showConfirmationDialog({ 151 | title: gettext('Delete profile?'), 152 | message: gettext(`You are about to delete the filament profile ${data.material} (${data.vendor}). Please note that it is not possible to delete profiles with associated spools.`), 153 | proceed: gettext('Delete'), 154 | onproceed: perform, 155 | }); 156 | }; 157 | }; 158 | -------------------------------------------------------------------------------- /static/js/viewmodels/selection.js: -------------------------------------------------------------------------------- 1 | /* global FilamentManager ko gettext PNotify */ 2 | 3 | FilamentManager.prototype.viewModels.selections = function selectedSpoolsViewModel() { 4 | const self = this.viewModels.selections; 5 | const api = this.core.client; 6 | const { settingsViewModel } = this.core.bridge.allViewModels; 7 | 8 | self.selectedSpools = ko.observableArray([]); 9 | 10 | // selected spool id for each tool 11 | self.tools = ko.observableArray([]); 12 | // set to false if querying selections to prevent triggering the change event again when setting selected spools 13 | self.enableSpoolUpdate = false; 14 | 15 | self.setArraySize = function setArraySizeToNumberOfTools() { 16 | const currentProfileData = settingsViewModel.printerProfiles.currentProfileData(); 17 | const numExtruders = (currentProfileData ? currentProfileData.extruder.count() : 0); 18 | 19 | if (self.tools().length === numExtruders) return; 20 | 21 | if (self.tools().length < numExtruders) { 22 | // number of extruders has increased 23 | for (let i = self.tools().length; i < numExtruders; i += 1) { 24 | self.selectedSpools().push(undefined); 25 | self.tools().push(ko.observable(undefined)); 26 | } 27 | } else { 28 | // number of extruders has decreased 29 | for (let i = numExtruders; i < self.tools().length; i += 1) { 30 | self.tools().pop(); 31 | self.selectedSpools().pop(); 32 | } 33 | } 34 | 35 | // notify observers 36 | self.tools.valueHasMutated(); 37 | self.selectedSpools.valueHasMutated(); 38 | }; 39 | 40 | self.setSubscriptions = function subscribeToProfileDataObservable() { 41 | settingsViewModel.printerProfiles.currentProfileData.subscribe(self.setArraySize); 42 | }; 43 | 44 | self.requestInProgress = ko.observable(false); 45 | 46 | self.setSelectedSpools = function setSelectedSpoolsReceivedFromBackend(data) { 47 | self.enableSpoolUpdate = false; 48 | data.selections.forEach((selection) => { 49 | self.updateSelectedSpoolData(selection); 50 | }); 51 | self.enableSpoolUpdate = true; 52 | }; 53 | 54 | self.requestSelectedSpools = function requestSelectedSpoolsFromBackend() { 55 | self.requestInProgress(true); 56 | return api.selection.list() 57 | .done((data) => { self.setSelectedSpools(data); }) 58 | .always(() => { self.requestInProgress(false); }); 59 | }; 60 | 61 | self.updateSelectedSpool = function updateSelectedSpoolInBackend(tool, id = null) { 62 | if (!self.enableSpoolUpdate) return; 63 | 64 | const data = { tool, spool: { id } }; 65 | 66 | self.requestInProgress(true); 67 | api.selection.update(tool, data) 68 | .done((response) => { 69 | self.updateSelectedSpoolData(response.selection); 70 | }) 71 | .fail(() => { 72 | new PNotify({ // eslint-disable-line no-new 73 | title: gettext('Could not select spool'), 74 | text: gettext('There was an unexpected error while selecting the spool, please consult the logs.'), 75 | type: 'error', 76 | hide: false, 77 | }); 78 | }) 79 | .always(() => { 80 | self.requestInProgress(false); 81 | }); 82 | }; 83 | 84 | self.updateSelectedSpoolData = function updateSelectedSpoolData(data) { 85 | if (data.tool < self.tools().length) { 86 | self.tools()[data.tool](data.spool !== null ? data.spool.id : undefined); 87 | self.selectedSpools()[data.tool] = (data.spool !== null ? data.spool : undefined); 88 | self.selectedSpools.valueHasMutated(); // notifies observers 89 | } 90 | }; 91 | }; 92 | -------------------------------------------------------------------------------- /static/js/viewmodels/spools.js: -------------------------------------------------------------------------------- 1 | /* global FilamentManager ItemListHelper ko Utils $ PNotify gettext showConfirmationDialog */ 2 | 3 | FilamentManager.prototype.viewModels.spools = function spoolsViewModel() { 4 | const self = this.viewModels.spools; 5 | const api = this.core.client; 6 | 7 | const profilesViewModel = this.viewModels.profiles; 8 | 9 | self.allSpools = new ItemListHelper( 10 | 'filamentSpools', 11 | { 12 | name(a, b) { 13 | // sorts ascending 14 | if (a.name.toLocaleLowerCase() < b.name.toLocaleLowerCase()) return -1; 15 | if (a.name.toLocaleLowerCase() > b.name.toLocaleLowerCase()) return 1; 16 | return 0; 17 | }, 18 | material(a, b) { 19 | // sorts ascending 20 | if (a.profile.material.toLocaleLowerCase() < b.profile.material.toLocaleLowerCase()) return -1; 21 | if (a.profile.material.toLocaleLowerCase() > b.profile.material.toLocaleLowerCase()) return 1; 22 | return 0; 23 | }, 24 | vendor(a, b) { 25 | // sorts ascending 26 | if (a.profile.vendor.toLocaleLowerCase() < b.profile.vendor.toLocaleLowerCase()) return -1; 27 | if (a.profile.vendor.toLocaleLowerCase() > b.profile.vendor.toLocaleLowerCase()) return 1; 28 | return 0; 29 | }, 30 | remaining(a, b) { 31 | // sorts descending 32 | const ra = parseFloat(a.weight) - parseFloat(a.used); 33 | const rb = parseFloat(b.weight) - parseFloat(b.used); 34 | if (ra > rb) return -1; 35 | if (ra < rb) return 1; 36 | return 0; 37 | }, 38 | }, 39 | {}, 'name', [], [], 10, 40 | ); 41 | 42 | self.pageSize = ko.pureComputed({ 43 | read() { 44 | return self.allSpools.pageSize(); 45 | }, 46 | write(value) { 47 | self.allSpools.pageSize(Utils.validInt(value, self.allSpools.pageSize())); 48 | }, 49 | }); 50 | 51 | self.cleanSpool = function getDefaultValuesForNewSpool() { 52 | return { 53 | id: undefined, 54 | name: '', 55 | cost: 20, 56 | weight: 1000, 57 | used: 0, 58 | temp_offset: 0, 59 | profile: { 60 | id: profilesViewModel.allProfiles().length > 0 ? profilesViewModel.allProfiles()[0].id : undefined, 61 | }, 62 | }; 63 | }; 64 | 65 | self.loadedSpool = { 66 | id: ko.observable(), 67 | name: ko.observable(), 68 | profile: ko.observable(), 69 | cost: ko.observable(), 70 | totalWeight: ko.observable(), 71 | remaining: ko.observable(), 72 | temp_offset: ko.observable(), 73 | isNew: ko.observable(true), 74 | }; 75 | 76 | self.nameInvalid = ko.pureComputed(() => !self.loadedSpool.name()); 77 | 78 | self.fromSpoolData = function setLoadedSpoolsFromJSObject(data = self.cleanSpool()) { 79 | self.loadedSpool.isNew(data.id === undefined); 80 | self.loadedSpool.id(data.id); 81 | self.loadedSpool.name(data.name); 82 | self.loadedSpool.profile(data.profile.id); 83 | self.loadedSpool.totalWeight(data.weight); 84 | self.loadedSpool.cost(data.cost); 85 | self.loadedSpool.remaining(data.weight - data.used); 86 | self.loadedSpool.temp_offset(data.temp_offset); 87 | }; 88 | 89 | self.toSpoolData = function getLoadedProfileAsJSObject() { 90 | const defaultSpool = self.cleanSpool(); 91 | const totalWeight = Utils.validFloat(self.loadedSpool.totalWeight(), defaultSpool.weight); 92 | const remaining = Math.min(Utils.validFloat(self.loadedSpool.remaining(), defaultSpool.weight), totalWeight); 93 | 94 | return { 95 | id: self.loadedSpool.id(), 96 | name: self.loadedSpool.name(), 97 | cost: Utils.validFloat(self.loadedSpool.cost(), defaultSpool.cost), 98 | weight: totalWeight, 99 | used: totalWeight - remaining, 100 | temp_offset: self.loadedSpool.temp_offset(), 101 | profile: { 102 | id: self.loadedSpool.profile(), 103 | }, 104 | }; 105 | }; 106 | 107 | const dialog = $('#settings_plugin_filamentmanager_spooldialog'); 108 | 109 | self.showSpoolDialog = function showSpoolDialog(data) { 110 | self.fromSpoolData(data); 111 | dialog.modal('show'); 112 | }; 113 | 114 | self.hideSpoolDialog = function hideSpoolDialog() { 115 | dialog.modal('hide'); 116 | }; 117 | 118 | self.requestInProgress = ko.observable(false); 119 | 120 | self.processSpools = function processRequestedSpools(data) { 121 | self.allSpools.updateItems(data.spools); 122 | }; 123 | 124 | self.requestSpools = function requestAllSpoolsFromBackend(force) { 125 | self.requestInProgress(true); 126 | return api.spool.list(force) 127 | .done((response) => { self.processSpools(response); }) 128 | .always(() => { self.requestInProgress(false); }); 129 | }; 130 | 131 | self.saveSpool = function saveSpoolToBackend(data = self.toSpoolData()) { 132 | return self.loadedSpool.isNew() ? self.addSpool(data) : self.updateSpool(data); 133 | }; 134 | 135 | self.addSpool = function addSpoolToBackend(data = self.toSpoolData()) { 136 | self.requestInProgress(true); 137 | api.spool.add(data) 138 | .done(() => { 139 | self.hideSpoolDialog(); 140 | self.requestSpools(); 141 | }) 142 | .fail(() => { 143 | new PNotify({ // eslint-disable-line no-new 144 | title: gettext('Could not add spool'), 145 | text: gettext('There was an unexpected error while saving the filament spool, please consult the logs.'), 146 | type: 'error', 147 | hide: false, 148 | }); 149 | self.requestInProgress(false); 150 | }); 151 | }; 152 | 153 | self.updateCallbacks = []; 154 | 155 | self.updateSpool = function updateSpoolInBackend(data = self.toSpoolData()) { 156 | self.requestInProgress(true); 157 | api.spool.update(data.id, data) 158 | .done(() => { 159 | self.hideSpoolDialog(); 160 | self.requestSpools(); 161 | self.updateCallbacks.forEach((callback) => { callback(); }); 162 | }) 163 | .fail(() => { 164 | new PNotify({ // eslint-disable-line no-new 165 | title: gettext('Could not update spool'), 166 | text: gettext('There was an unexpected error while updating the filament spool, please consult the logs.'), 167 | type: 'error', 168 | hide: false, 169 | }); 170 | self.requestInProgress(false); 171 | }); 172 | }; 173 | 174 | self.removeSpool = function removeSpoolFromBackend(data) { 175 | const perform = function performSpoolRemoval() { 176 | self.requestInProgress(true); 177 | api.spool.delete(data.id) 178 | .done(() => { 179 | self.requestSpools(); 180 | }) 181 | .fail(() => { 182 | new PNotify({ // eslint-disable-line no-new 183 | title: gettext('Could not delete spool'), 184 | text: gettext('There was an unexpected error while removing the filament spool, please consult the logs.'), 185 | type: 'error', 186 | hide: false, 187 | }); 188 | self.requestInProgress(false); 189 | }); 190 | }; 191 | 192 | showConfirmationDialog({ 193 | title: gettext('Delete spool?'), 194 | message: gettext(`You are about to delete the filament spool ${data.name} - ${data.profile.material} (${data.profile.vendor}).`), 195 | proceed: gettext('Delete'), 196 | onproceed: perform, 197 | }); 198 | }; 199 | 200 | self.duplicateSpool = function duplicateAndAddSpoolToBackend(data) { 201 | const newData = data; 202 | newData.used = 0; 203 | self.addSpool(newData); 204 | }; 205 | }; 206 | -------------------------------------------------------------------------------- /static/js/viewmodels/warning.js: -------------------------------------------------------------------------------- 1 | /* global FilamentManager ko Node $ gettext PNotify Utils */ 2 | 3 | FilamentManager.prototype.viewModels.warning = function insufficientFilamentWarningViewModel() { 4 | const self = this.viewModels.warning; 5 | const { printerStateViewModel, settingsViewModel } = this.core.bridge.allViewModels; 6 | const { selections } = this.viewModels; 7 | 8 | printerStateViewModel.filamentWithWeight = ko.observableArray([]); 9 | 10 | printerStateViewModel.formatFilamentWithWeight = function formatFilamentWithWeightInSidebar(filament) { 11 | if (!filament || !filament.length) return '-'; 12 | 13 | let result = `${(filament.length / 1000).toFixed(2)}m`; 14 | 15 | if (Object.prototype.hasOwnProperty.call(filament, 'weight') && filament.weight) { 16 | result += ` / ${filament.weight.toFixed(2)}g`; 17 | } 18 | 19 | return result; 20 | }; 21 | 22 | self.replaceFilamentView = function replaceFilamentViewInSidebar() { 23 | $('#state').find('.accordion-inner').contents().each((index, item) => { 24 | if (item.nodeType === Node.COMMENT_NODE) { 25 | if (item.nodeValue === ' ko foreach: filament ') { 26 | item.nodeValue = ' ko foreach: [] '; // eslint-disable-line no-param-reassign 27 | const element = '
'; 28 | $(element).insertBefore(item); 29 | return false; // exit loop 30 | } 31 | } 32 | return true; 33 | }); 34 | }; 35 | 36 | let filename; 37 | let waitForFilamentData = false; 38 | 39 | let warning = null; 40 | 41 | const updateFilament = function updateFilamentWeightAndCheckRemainingFilament() { 42 | const calculateWeight = function calculateFilamentWeight(length, diameter, density) { 43 | const radius = diameter / 2; 44 | const volume = (length * Math.PI * radius * radius) / 1000; 45 | return volume * density; 46 | }; 47 | 48 | const showWarning = function showWarningIfRequiredFilamentExceedsRemaining(required, remaining) { 49 | if (required < remaining) return false; 50 | 51 | if (warning) { 52 | // fade out notification if one is still shown 53 | warning.options.delay = 1000; 54 | warning.queueRemove(); 55 | } 56 | 57 | warning = new PNotify({ 58 | title: gettext('Insufficient filament'), 59 | text: gettext("The current print job needs more material than what's left on the selected spool."), 60 | type: 'warning', 61 | hide: false, 62 | }); 63 | 64 | return true; 65 | }; 66 | 67 | const filament = printerStateViewModel.filament(); 68 | const spoolData = selections.selectedSpools(); 69 | 70 | let warningIsShown = false; // used to prevent a separate warning message for each tool 71 | 72 | for (let i = 0; i < filament.length; i += 1) { 73 | const toolID = Utils.extractToolIDFromName(filament[i].name()); 74 | 75 | if (!spoolData[toolID]) { 76 | filament[i].data().weight = 0; 77 | } else { 78 | const { length } = filament[i].data(); 79 | const { diameter, density } = spoolData[toolID].profile; 80 | 81 | const requiredFilament = calculateWeight(length, diameter, density); 82 | const remainingFilament = spoolData[toolID].weight - spoolData[toolID].used; 83 | 84 | filament[i].data().weight = requiredFilament; 85 | 86 | if (!warningIsShown && settingsViewModel.settings.plugins.filamentmanager.enableWarning()) { 87 | warningIsShown = showWarning(requiredFilament, remainingFilament); 88 | } 89 | } 90 | } 91 | 92 | filename = printerStateViewModel.filename(); 93 | printerStateViewModel.filamentWithWeight(filament); 94 | }; 95 | 96 | self.setSubscriptions = function subscribeToObservablesWhichTriggerAnUpdate() { 97 | selections.selectedSpools.subscribe(updateFilament); 98 | 99 | printerStateViewModel.filament.subscribe(() => { 100 | // OctoPrint constantly updates the filament observable, to prevent invocing the warning message 101 | // on every update we only call the updateFilament() method if the selected file has changed 102 | if (filename !== printerStateViewModel.filename()) { 103 | if (printerStateViewModel.filename() !== undefined && printerStateViewModel.filament().length < 1) { 104 | // file selected, but no filament data found, probably because it's still in analysis queue 105 | waitForFilamentData = true; 106 | } else { 107 | waitForFilamentData = false; 108 | updateFilament(); 109 | } 110 | } else if (waitForFilamentData && printerStateViewModel.filament().length > 0) { 111 | waitForFilamentData = false; 112 | updateFilament(); 113 | } 114 | }); 115 | }; 116 | }; 117 | -------------------------------------------------------------------------------- /translations/de/LC_MESSAGES/messages.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/translations/de/LC_MESSAGES/messages.mo -------------------------------------------------------------------------------- /translations/de/LC_MESSAGES/messages.po: -------------------------------------------------------------------------------- 1 | # German translations for OctoPrint-FilamentManager. 2 | # Copyright (C) 2017 ORGANIZATION 3 | # This file is distributed under the same license as the 4 | # OctoPrint-FilamentManager project. 5 | # FIRST AUTHOR , 2017. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: OctoPrint-FilamentManager 0.1.0\n" 10 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 11 | "POT-Creation-Date: 2021-10-17 11:30+0200\n" 12 | "PO-Revision-Date: 2018-02-04 15:24+0100\n" 13 | "Last-Translator: Sven Lohrmann \n" 14 | "Language: de\n" 15 | "Language-Team: de \n" 16 | "Plural-Forms: nplurals=2; plural=(n != 1)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=utf-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Generated-By: Babel 2.9.0\n" 21 | 22 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:357 23 | msgid "Start Print" 24 | msgstr "Druck starten" 25 | 26 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:372 27 | msgid "Resume Print" 28 | msgstr "Druck fortsetzen" 29 | 30 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:447 31 | msgid "Data import failed" 32 | msgstr "Daten-Import fehlgeschlagen" 33 | 34 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:448 35 | msgid "Something went wrong, please consult the logs." 36 | msgstr "Etwas ist schief gelaufen, bitte konsultiere das Log." 37 | 38 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:580 39 | msgid "Could not add profile" 40 | msgstr "Konnte Profil nicht hinzufügen" 41 | 42 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:581 43 | msgid "" 44 | "There was an unexpected error while saving the filament profile, please " 45 | "consult the logs." 46 | msgstr "" 47 | "Unerwarteter Fehler beim Speichern des Filamentprofils, bitte konsultiere" 48 | " das Log." 49 | 50 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:602 51 | msgid "Could not update profile" 52 | msgstr "Konnte Profil nicht aktualisieren" 53 | 54 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:603 55 | msgid "" 56 | "There was an unexpected error while updating the filament profile, please" 57 | " consult the logs." 58 | msgstr "" 59 | "Unerwarteter Fehler beim Aktualisieren des Filamentprofils, bitte " 60 | "konsultiere das Log." 61 | 62 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:617 63 | msgid "Could not delete profile" 64 | msgstr "Konnte Profil nicht löschen" 65 | 66 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:618 67 | msgid "" 68 | "There was an unexpected error while removing the filament profile, please" 69 | " consult the logs." 70 | msgstr "" 71 | "Unerwarteter Fehler beim Löschen des Filamentprofils, bitte konsultiere " 72 | "das Log." 73 | 74 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:627 75 | msgid "Delete profile?" 76 | msgstr "Profil löschen?" 77 | 78 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:628 79 | msgid "" 80 | "You are about to delete the filament profile (). Please" 81 | " note that it is not possible to delete profiles with associated spools." 82 | msgstr "" 83 | "Du bist im Begriff das Filament-Profil () zu löschen. " 84 | "Bitte beachte, dass es nicht möglich ist Profile zu löschen die Spulen " 85 | "zugewiesen wurden." 86 | 87 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:629 88 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:949 89 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:15 90 | msgid "Delete" 91 | msgstr "Löschen" 92 | 93 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:709 94 | msgid "Could not select spool" 95 | msgstr "Konnte Spule nicht auswählen" 96 | 97 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:710 98 | msgid "" 99 | "There was an unexpected error while selecting the spool, please consult " 100 | "the logs." 101 | msgstr "Unerwarteter Fehler beim auswählen der Spule, bitte konsultiere das Log." 102 | 103 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:898 104 | msgid "Could not add spool" 105 | msgstr "Konnte Spule nicht hinzufügen" 106 | 107 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:899 108 | msgid "" 109 | "There was an unexpected error while saving the filament spool, please " 110 | "consult the logs." 111 | msgstr "" 112 | "Unerwarteter Fehler beim speichern der Filamentspule, bitte konsultiere " 113 | "das Log." 114 | 115 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:921 116 | msgid "Could not update spool" 117 | msgstr "Konnte Spule nicht aktualisieren" 118 | 119 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:922 120 | msgid "" 121 | "There was an unexpected error while updating the filament spool, please " 122 | "consult the logs." 123 | msgstr "" 124 | "Unerwarteter Fehler beim Aktualisieren der Filamentspule, bitte " 125 | "konsultiere das Log." 126 | 127 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:937 128 | msgid "Could not delete spool" 129 | msgstr "Konnte Spule nicht löschen" 130 | 131 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:938 132 | msgid "" 133 | "There was an unexpected error while removing the filament spool, please " 134 | "consult the logs." 135 | msgstr "" 136 | "Unerwarteter Fehler beim Löschen der Filamentspule, bitte konsultiere das" 137 | " Log." 138 | 139 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:947 140 | msgid "Delete spool?" 141 | msgstr "Spule löschen?" 142 | 143 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:948 144 | msgid "You are about to delete the filament spool - ()." 145 | msgstr "Du bist im Begriff die Filament-Spule - () zu löschen." 146 | 147 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:1020 148 | msgid "Insufficient filament" 149 | msgstr "Filament nicht ausreichend" 150 | 151 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:1021 152 | msgid "" 153 | "The current print job needs more material than what's left on the " 154 | "selected spool." 155 | msgstr "" 156 | "Der aktuelle Druckauftrag benötigt mehr Material als auf der ausgewählten" 157 | " Spule vorhanden ist." 158 | 159 | #: octoprint_filamentmanager/templates/settings.jinja2:4 160 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:5 161 | msgid "Plugin Configuration" 162 | msgstr "Pluginkonfiguration" 163 | 164 | #: octoprint_filamentmanager/templates/settings.jinja2:7 165 | msgid "Filament Spools" 166 | msgstr "Filamentspulen" 167 | 168 | #: octoprint_filamentmanager/templates/settings.jinja2:13 169 | msgid "Items per page" 170 | msgstr "Einträge pro Seite" 171 | 172 | #: octoprint_filamentmanager/templates/settings.jinja2:22 173 | msgid "Sort by" 174 | msgstr "Sortieren nach" 175 | 176 | #: octoprint_filamentmanager/templates/settings.jinja2:23 177 | msgid "Name (ascending)" 178 | msgstr "Name (aufsteigend)" 179 | 180 | #: octoprint_filamentmanager/templates/settings.jinja2:24 181 | msgid "Material (ascending)" 182 | msgstr "Material (aufsteigend)" 183 | 184 | #: octoprint_filamentmanager/templates/settings.jinja2:25 185 | msgid "Vendor (ascending)" 186 | msgstr "Lieferant (aufsteigend)" 187 | 188 | #: octoprint_filamentmanager/templates/settings.jinja2:26 189 | msgid "Remaining (descending)" 190 | msgstr "Verbleibend (absteigend)" 191 | 192 | #: octoprint_filamentmanager/templates/settings.jinja2:36 193 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:15 194 | msgid "Name" 195 | msgstr "Name" 196 | 197 | #: octoprint_filamentmanager/templates/settings.jinja2:37 198 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:38 199 | msgid "Material" 200 | msgstr "Material" 201 | 202 | #: octoprint_filamentmanager/templates/settings.jinja2:38 203 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:26 204 | msgid "Vendor" 205 | msgstr "Lieferant" 206 | 207 | #: octoprint_filamentmanager/templates/settings.jinja2:39 208 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:50 209 | msgid "Weight" 210 | msgstr "Gewicht" 211 | 212 | #: octoprint_filamentmanager/templates/settings.jinja2:40 213 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:62 214 | msgid "Remaining" 215 | msgstr "Verbleibend" 216 | 217 | #: octoprint_filamentmanager/templates/settings.jinja2:41 218 | msgid "Used" 219 | msgstr "Verbraucht" 220 | 221 | #: octoprint_filamentmanager/templates/settings.jinja2:42 222 | msgid "Action" 223 | msgstr "Aktion" 224 | 225 | #: octoprint_filamentmanager/templates/settings.jinja2:54 226 | msgid "Edit Spool" 227 | msgstr "Spule bearbeiten" 228 | 229 | #: octoprint_filamentmanager/templates/settings.jinja2:55 230 | msgid "Duplicate Spool" 231 | msgstr "Spule duplizieren" 232 | 233 | #: octoprint_filamentmanager/templates/settings.jinja2:56 234 | msgid "Delete Spool" 235 | msgstr "Spule löschen" 236 | 237 | #: octoprint_filamentmanager/templates/settings.jinja2:79 238 | msgid "Manage Profiles" 239 | msgstr "Profile verwalten" 240 | 241 | #: octoprint_filamentmanager/templates/settings.jinja2:80 242 | msgid "Add Spool" 243 | msgstr "Spule hinzufügen" 244 | 245 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:12 246 | msgid "Features" 247 | msgstr "Funktionen" 248 | 249 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:13 250 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:91 251 | msgid "Database" 252 | msgstr "Datenbank" 253 | 254 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:14 255 | msgid "Appearance" 256 | msgstr "Aussehen" 257 | 258 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:26 259 | msgid "" 260 | "Show dialog to confirm selected spools before starting/resuming the print" 261 | " job" 262 | msgstr "" 263 | "Vor dem starten/fortsetzen eines Druckauftrags einen Dialog zur " 264 | "Bestätigung der ausgewählten Spulen anzeigen" 265 | 266 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:34 267 | msgid "Warn if print job exceeds remaining filament" 268 | msgstr "Warne, wenn der Druckauftrag die verbleibende Menge an Filament übersteigt" 269 | 270 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:42 271 | msgid "Enable software odometer to measure used filament" 272 | msgstr "Software-Hodometer aktivieren, um den Filamentverbrauch zu messen" 273 | 274 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:50 275 | msgid "Pause print if filament runs out" 276 | msgstr "Druck pausieren, wenn Filament zur Neige geht" 277 | 278 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:56 279 | msgid "Pause threshold" 280 | msgstr "Schwellwert für Pause" 281 | 282 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:74 283 | msgid "Use external database" 284 | msgstr "Verwende externe Datenbank" 285 | 286 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:78 287 | msgid "" 288 | "If you want to use an external database, please take a look into my wiki how to " 291 | "install the drivers and setup the database." 292 | msgstr "" 293 | 294 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:84 295 | msgid "URI" 296 | msgstr "URI" 297 | 298 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:98 299 | msgid "Username" 300 | msgstr "Benutzername" 301 | 302 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:105 303 | msgid "Password" 304 | msgstr "Passwort" 305 | 306 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:113 307 | msgid "Test connection" 308 | msgstr "Verbindungstest" 309 | 310 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:118 311 | msgid "" 312 | "Note: If you change these settings you must restart your OctoPrint " 313 | "instance for the changes to take affect." 314 | msgstr "" 315 | "Beachte: Wenn du diese Einstellungen änderst musst du OctoPrint neu " 316 | "starten, damit diese wirksam werden." 317 | 318 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:122 319 | msgid "Import & Export" 320 | msgstr "Import & Export" 321 | 322 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:127 323 | msgid "Browse..." 324 | msgstr "Durchsuchen..." 325 | 326 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:131 327 | msgid "Import" 328 | msgstr "Import" 329 | 330 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:133 331 | msgid "Export" 332 | msgstr "Export" 333 | 334 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:135 335 | msgid "" 336 | "This does not look like a valid import archive. Only zip files are " 337 | "supported." 338 | msgstr "" 339 | "Dies sieht nicht wie ein gültiges Archiv zum importieren aus. Es werden " 340 | "nur Zip-Dateien unterstützt." 341 | 342 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:144 343 | msgid "Currency symbol" 344 | msgstr "Währungssymbol" 345 | 346 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:156 347 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:87 348 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:27 349 | msgid "Cancel" 350 | msgstr "Abbrechen" 351 | 352 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:157 353 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:16 354 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:88 355 | msgid "Save" 356 | msgstr "Speichern" 357 | 358 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:5 359 | msgid "Filament Profiles" 360 | msgstr "Filamentprofile" 361 | 362 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:13 363 | msgid "--- New Profile ---" 364 | msgstr "--- Neues Profil ---" 365 | 366 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:14 367 | msgid "New" 368 | msgstr "Neu" 369 | 370 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:16 371 | msgid "Save profile" 372 | msgstr "Profil speichern" 373 | 374 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:30 375 | msgid "Vendor must be set" 376 | msgstr "Lieferant muss gesetzt sein" 377 | 378 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:42 379 | msgid "Material must be set" 380 | msgstr "Matarial muss gesetzt sein" 381 | 382 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:50 383 | msgid "Density" 384 | msgstr "Dichte" 385 | 386 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:62 387 | msgid "Diameter" 388 | msgstr "Durchmesser" 389 | 390 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:75 391 | msgid "Close" 392 | msgstr "Schließen" 393 | 394 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:5 395 | msgid "Filament Spool" 396 | msgstr "Filamentspule" 397 | 398 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:19 399 | msgid "Name must be set" 400 | msgstr "Name muss gesetzt sein" 401 | 402 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:27 403 | msgid "Profile" 404 | msgstr "Profil" 405 | 406 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:38 407 | msgid "Price" 408 | msgstr "Preis" 409 | 410 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:74 411 | msgid "Temperature offset" 412 | msgstr "Temperaturoffset" 413 | 414 | #: octoprint_filamentmanager/templates/sidebar.jinja2:3 415 | msgid "hide overused usage" 416 | msgstr "" 417 | 418 | #: octoprint_filamentmanager/templates/sidebar.jinja2:10 419 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:18 420 | msgid "Tool" 421 | msgstr "Tool" 422 | 423 | #: octoprint_filamentmanager/templates/sidebar.jinja2:19 424 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:19 425 | msgid "--- Select Spool ---" 426 | msgstr "--- Spule auswählen ---" 427 | 428 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:5 429 | msgid "Confirm your selected spools" 430 | msgstr "Bestätige deine Spulauswahl" 431 | 432 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:10 433 | msgid "" 434 | "There are no information available about the active tools for the print " 435 | "job. Make sure the analysing process of the file has finished and that " 436 | "it's loaded correctly." 437 | msgstr "" 438 | "Es sind keine Informationen über die aktiven Tools für den Druckauftrag " 439 | "vorhanden. Überprüfe ob die Datei bereits analysiert und korrekt geladen " 440 | "wurde." 441 | 442 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:14 443 | msgid "" 444 | "Please confirm your selected spools for all active tools. This dialog is " 445 | "meant to protect you from accidentically selecting wrong spools for the " 446 | "print." 447 | msgstr "" 448 | "Bitte bestätige deine Spulenauswahl für alle aktiven Tools. Dieser Dialog" 449 | " soll verhindern, dass du aus Versehen falsche Spulen für deinen Druck " 450 | "auswählst." 451 | 452 | #~ msgid "Profile (ascending)" 453 | #~ msgstr "Profil (aufsteigend)" 454 | 455 | #~ msgid "Selected Spools" 456 | #~ msgstr "Ausgewählte Spulen" 457 | 458 | #~ msgid "Filament warning" 459 | #~ msgstr "Filament-Warnung" 460 | 461 | #~ msgid "Saving failed" 462 | #~ msgstr "Speichern fehlgeschlagen" 463 | 464 | #~ msgid "Failed to query spools" 465 | #~ msgstr "Abfrage der Spulen fehlgeschlagen" 466 | 467 | #~ msgid "" 468 | #~ "There was an unexpected database error" 469 | #~ " while saving the filament profile, " 470 | #~ "please consult the logs." 471 | #~ msgstr "" 472 | #~ "Unerwarteter Fehler beim Speichern des " 473 | #~ "Filamentprofils, bitte konsultiere das Log." 474 | 475 | #~ msgid "" 476 | #~ "There was an unexpected database error" 477 | #~ " while updating the filament profile, " 478 | #~ "please consult the logs." 479 | #~ msgstr "" 480 | #~ "Ein unerwarteter Datenbankfehler ist " 481 | #~ "aufgetreten, bitte konsultiere die Logs." 482 | 483 | #~ msgid "" 484 | #~ "There was an unexpected error while removing the filament spool,\n" 485 | #~ " please consult the logs." 486 | #~ msgstr "" 487 | #~ "Ein unerwarteter Datenbankfehler ist " 488 | #~ "aufgetreten, bitte konsultiere die Logs." 489 | 490 | #~ msgid "Spool selection failed" 491 | #~ msgstr "Konnte Spule nicht auswählen" 492 | 493 | #~ msgid "Cannot delete profiles with associated spools." 494 | #~ msgstr "Es können keine Profile mit verknüpften Spulen gelöscht werden." 495 | 496 | #~ msgid "Data import successfull" 497 | #~ msgstr "Daten-Import erfolgreich" 498 | 499 | #~ msgid "Enable filament odometer" 500 | #~ msgstr "Filament-Hodometer aktivieren" 501 | 502 | -------------------------------------------------------------------------------- /translations/es/LC_MESSAGES/messages.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/translations/es/LC_MESSAGES/messages.mo -------------------------------------------------------------------------------- /translations/es/LC_MESSAGES/messages.po: -------------------------------------------------------------------------------- 1 | # Spanish translations for OctoPrint-FilamentManager. 2 | # Copyright (C) 2019 The OctoPrint Project 3 | # This file is distributed under the same license as the 4 | # OctoPrint-FilamentManager project. 5 | # Ivan Garcia , 2019. 6 | # Carlos Romero , 2021. 7 | # 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: OctoPrint-FilamentManager 0.5.2\n" 11 | "Report-Msgid-Bugs-To: i18n@octoprint.org\n" 12 | "POT-Creation-Date: 2021-10-17 11:30+0200\n" 13 | "PO-Revision-Date: 2021-10-18 12:35+0100\n" 14 | "Last-Translator: Carlos Romero \n" 15 | "Language: es\n" 16 | "Language-Team: es \n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1)\n" 18 | "MIME-Version: 1.0\n" 19 | "Content-Type: text/plain; charset=utf-8\n" 20 | "Content-Transfer-Encoding: 8bit\n" 21 | "Generated-By: Babel 2.9.0\n" 22 | 23 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:357 24 | msgid "Start Print" 25 | msgstr "Comenzar Impresión" 26 | 27 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:372 28 | msgid "Resume Print" 29 | msgstr "Continuar Impresión" 30 | 31 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:447 32 | msgid "Data import failed" 33 | msgstr "Error al importar los datos" 34 | 35 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:448 36 | msgid "Something went wrong, please consult the logs." 37 | msgstr "Algo ha ido mal, revisa el log para más información." 38 | 39 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:580 40 | msgid "Could not add profile" 41 | msgstr "No se puede añadir el perfil" 42 | 43 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:581 44 | msgid "" 45 | "There was an unexpected error while saving the filament profile, please " 46 | "consult the logs." 47 | msgstr "" 48 | "Ha ocurrido un error al intentar guardar el perfil del filamento, por " 49 | "favor revisa el log para más información." 50 | 51 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:602 52 | msgid "Could not update profile" 53 | msgstr "No se puede actualizar el perfil" 54 | 55 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:603 56 | msgid "" 57 | "There was an unexpected error while updating the filament profile, please" 58 | " consult the logs." 59 | msgstr "Ha ocurrido un error mientras se actualizaba el perfil del filamento" 60 | 61 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:617 62 | msgid "Could not delete profile" 63 | msgstr "No se puede eliminar el perfil" 64 | 65 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:618 66 | msgid "" 67 | "There was an unexpected error while removing the filament profile, please" 68 | " consult the logs." 69 | msgstr "" 70 | "Ha ocurrido un error al intentar eliminar el perfil del filamento, por " 71 | "favor revisa el log para más información." 72 | 73 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:627 74 | msgid "Delete profile?" 75 | msgstr "¿Eliminar perfil?" 76 | 77 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:628 78 | msgid "" 79 | "You are about to delete the filament profile (). Please" 80 | " note that it is not possible to delete profiles with associated spools." 81 | msgstr "" 82 | "Estas apunto de borrar el perfil de filamento (). Ten " 83 | "en cuenta que no es posible borrar perfiles con bobinas asociadas." 84 | 85 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:629 86 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:949 87 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:15 88 | msgid "Delete" 89 | msgstr "Eliminar" 90 | 91 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:709 92 | msgid "Could not select spool" 93 | msgstr "No se puede elegir la bobina" 94 | 95 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:710 96 | msgid "" 97 | "There was an unexpected error while selecting the spool, please consult " 98 | "the logs." 99 | msgstr "" 100 | "Ha ocurrido un error al intentar seleccionar el perfil del filamento, por" 101 | " favor revisa el log para más información." 102 | 103 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:898 104 | msgid "Could not add spool" 105 | msgstr "No se puede añadir la bobina" 106 | 107 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:899 108 | msgid "" 109 | "There was an unexpected error while saving the filament spool, please " 110 | "consult the logs." 111 | msgstr "" 112 | "Ha ocurrido un error al intentar guardar la bobina de filamento, por " 113 | "favor revisa el log para más información." 114 | 115 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:921 116 | msgid "Could not update spool" 117 | msgstr "No se puede actualizar la bobina" 118 | 119 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:922 120 | msgid "" 121 | "There was an unexpected error while updating the filament spool, please " 122 | "consult the logs." 123 | msgstr "" 124 | "Ha ocurrido un error al intentar actualizar la bobina de filamento, por " 125 | "favor revisa el log para más información." 126 | 127 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:937 128 | msgid "Could not delete spool" 129 | msgstr "No se puede eliminar la bobina" 130 | 131 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:938 132 | msgid "" 133 | "There was an unexpected error while removing the filament spool, please " 134 | "consult the logs." 135 | msgstr "" 136 | "Ha ocurrido un error al intentar eliminar la bobina de filamento, por " 137 | "favor revisa el log para más información." 138 | 139 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:947 140 | msgid "Delete spool?" 141 | msgstr "¿Borrar bobina?" 142 | 143 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:948 144 | msgid "You are about to delete the filament spool - ()." 145 | msgstr "Estás a punto de borrar la bobina de filamento - ()." 146 | 147 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:1020 148 | msgid "Insufficient filament" 149 | msgstr "Filamento insuficiente" 150 | 151 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:1021 152 | msgid "" 153 | "The current print job needs more material than what's left on the " 154 | "selected spool." 155 | msgstr "" 156 | "La impresión actual necesita más filamento del que hay en la bobina " 157 | "seleccionada." 158 | 159 | #: octoprint_filamentmanager/templates/settings.jinja2:4 160 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:5 161 | msgid "Plugin Configuration" 162 | msgstr "Configuración del plugin" 163 | 164 | #: octoprint_filamentmanager/templates/settings.jinja2:7 165 | msgid "Filament Spools" 166 | msgstr "Bobinas de filamento" 167 | 168 | #: octoprint_filamentmanager/templates/settings.jinja2:13 169 | msgid "Items per page" 170 | msgstr "Elementos por página" 171 | 172 | #: octoprint_filamentmanager/templates/settings.jinja2:22 173 | msgid "Sort by" 174 | msgstr "Ordenar por" 175 | 176 | #: octoprint_filamentmanager/templates/settings.jinja2:23 177 | msgid "Name (ascending)" 178 | msgstr "Nombre (Ascendente)" 179 | 180 | #: octoprint_filamentmanager/templates/settings.jinja2:24 181 | msgid "Material (ascending)" 182 | msgstr "Material (Ascendente)" 183 | 184 | #: octoprint_filamentmanager/templates/settings.jinja2:25 185 | msgid "Vendor (ascending)" 186 | msgstr "Fabricante (Ascendente)" 187 | 188 | #: octoprint_filamentmanager/templates/settings.jinja2:26 189 | msgid "Remaining (descending)" 190 | msgstr "Restante (Descendente)" 191 | 192 | #: octoprint_filamentmanager/templates/settings.jinja2:36 193 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:15 194 | msgid "Name" 195 | msgstr "Nombre" 196 | 197 | #: octoprint_filamentmanager/templates/settings.jinja2:37 198 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:38 199 | msgid "Material" 200 | msgstr "Material" 201 | 202 | #: octoprint_filamentmanager/templates/settings.jinja2:38 203 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:26 204 | msgid "Vendor" 205 | msgstr "Fabricante" 206 | 207 | #: octoprint_filamentmanager/templates/settings.jinja2:39 208 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:50 209 | msgid "Weight" 210 | msgstr "Peso" 211 | 212 | #: octoprint_filamentmanager/templates/settings.jinja2:40 213 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:62 214 | msgid "Remaining" 215 | msgstr "Restante" 216 | 217 | #: octoprint_filamentmanager/templates/settings.jinja2:41 218 | msgid "Used" 219 | msgstr "Usado" 220 | 221 | #: octoprint_filamentmanager/templates/settings.jinja2:42 222 | msgid "Action" 223 | msgstr "Acción" 224 | 225 | #: octoprint_filamentmanager/templates/settings.jinja2:54 226 | msgid "Edit Spool" 227 | msgstr "Editar bobina" 228 | 229 | #: octoprint_filamentmanager/templates/settings.jinja2:55 230 | msgid "Duplicate Spool" 231 | msgstr "Duplicar bobina" 232 | 233 | #: octoprint_filamentmanager/templates/settings.jinja2:56 234 | msgid "Delete Spool" 235 | msgstr "Borrar bobina" 236 | 237 | #: octoprint_filamentmanager/templates/settings.jinja2:79 238 | msgid "Manage Profiles" 239 | msgstr "Administrar perfiles" 240 | 241 | #: octoprint_filamentmanager/templates/settings.jinja2:80 242 | msgid "Add Spool" 243 | msgstr "Añadir bobina" 244 | 245 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:12 246 | msgid "Features" 247 | msgstr "Características" 248 | 249 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:13 250 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:91 251 | msgid "Database" 252 | msgstr "Base de datos" 253 | 254 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:14 255 | msgid "Appearance" 256 | msgstr "Apariencia" 257 | 258 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:26 259 | msgid "" 260 | "Show dialog to confirm selected spools before starting/resuming the print" 261 | " job" 262 | msgstr "" 263 | "Mostrar el diálogo para confirmar las bobinas antes de empezar/continuar " 264 | "una impresión" 265 | 266 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:34 267 | msgid "Warn if print job exceeds remaining filament" 268 | msgstr "Avisar si la impresión excede el filamento restante" 269 | 270 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:42 271 | msgid "Enable software odometer to measure used filament" 272 | msgstr "Habilitar medición mediante software \"odometer\"" 273 | 274 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:50 275 | msgid "Pause print if filament runs out" 276 | msgstr "Pausar la impresión si el filamento se agota" 277 | 278 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:56 279 | msgid "Pause threshold" 280 | msgstr "Margen de pausa" 281 | 282 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:74 283 | msgid "Use external database" 284 | msgstr "Usar base de datos externa" 285 | 286 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:78 287 | msgid "" 288 | "If you want to use an external database, please take a look into my wiki how to " 291 | "install the drivers and setup the database." 292 | msgstr "" 293 | "Si quieres usar una base de datos externa, por favor, mira mi wiki sobre como " 296 | "instalar los drivers y configurar la base de datos." 297 | 298 | 299 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:84 300 | msgid "URI" 301 | msgstr "URI" 302 | 303 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:98 304 | msgid "Username" 305 | msgstr "Usuario" 306 | 307 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:105 308 | msgid "Password" 309 | msgstr "Contraseña" 310 | 311 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:113 312 | msgid "Test connection" 313 | msgstr "Comprobar conexión" 314 | 315 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:118 316 | msgid "" 317 | "Note: If you change these settings you must restart your OctoPrint " 318 | "instance for the changes to take affect." 319 | msgstr "" 320 | "Nota: Si cambias esta configuración deberás reiniciar la instancia de " 321 | "OctoPrint para que los cambios tengan efecto." 322 | 323 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:122 324 | msgid "Import & Export" 325 | msgstr "Importar y exportar" 326 | 327 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:127 328 | msgid "Browse..." 329 | msgstr "Examinar..." 330 | 331 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:131 332 | msgid "Import" 333 | msgstr "Importar" 334 | 335 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:133 336 | msgid "Export" 337 | msgstr "Exportar" 338 | 339 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:135 340 | msgid "" 341 | "This does not look like a valid import archive. Only zip files are " 342 | "supported." 343 | msgstr "No parece un fichero de importación válido. Sólo se permiten archivos zip." 344 | 345 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:144 346 | msgid "Currency symbol" 347 | msgstr "Símbolo de moneda" 348 | 349 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:156 350 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:87 351 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:27 352 | msgid "Cancel" 353 | msgstr "Cancelar" 354 | 355 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:157 356 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:16 357 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:88 358 | msgid "Save" 359 | msgstr "Guardar" 360 | 361 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:5 362 | msgid "Filament Profiles" 363 | msgstr "Perfiles de filamento" 364 | 365 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:13 366 | msgid "--- New Profile ---" 367 | msgstr "--- Nuevo perfil ---" 368 | 369 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:14 370 | msgid "New" 371 | msgstr "Nuevo" 372 | 373 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:16 374 | msgid "Save profile" 375 | msgstr "Guardar perfil" 376 | 377 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:30 378 | msgid "Vendor must be set" 379 | msgstr "Debes escribir el fabricante" 380 | 381 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:42 382 | msgid "Material must be set" 383 | msgstr "Debes escribir el material" 384 | 385 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:50 386 | msgid "Density" 387 | msgstr "Densidad" 388 | 389 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:62 390 | msgid "Diameter" 391 | msgstr "Diámetro" 392 | 393 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:75 394 | msgid "Close" 395 | msgstr "Cerrar" 396 | 397 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:5 398 | msgid "Filament Spool" 399 | msgstr "Bobina de Filamento" 400 | 401 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:19 402 | msgid "Name must be set" 403 | msgstr "Debes escribir un nombre" 404 | 405 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:27 406 | msgid "Profile" 407 | msgstr "Perfil" 408 | 409 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:38 410 | msgid "Price" 411 | msgstr "Precio" 412 | 413 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:74 414 | msgid "Temperature offset" 415 | msgstr "Compensación de temperatura" 416 | 417 | #: octoprint_filamentmanager/templates/sidebar.jinja2:3 418 | msgid "hide overused usage" 419 | msgstr "Ocultar bobinas agotadas" 420 | 421 | #: octoprint_filamentmanager/templates/sidebar.jinja2:10 422 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:18 423 | msgid "Tool" 424 | msgstr "Extrusor" 425 | 426 | #: octoprint_filamentmanager/templates/sidebar.jinja2:19 427 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:19 428 | msgid "--- Select Spool ---" 429 | msgstr "--- Seleccionar bobina ---" 430 | 431 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:5 432 | msgid "Confirm your selected spools" 433 | msgstr "Confirma las bobinas seleccionadas" 434 | 435 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:10 436 | msgid "" 437 | "There are no information available about the active tools for the print " 438 | "job. Make sure the analysing process of the file has finished and that " 439 | "it's loaded correctly." 440 | msgstr "" 441 | "No hay información disponible sobre el extrusor de la impresión actual. " 442 | "Asegúrate de que el proceso de análisis esté finalizado y haya cargado" 443 | " correctamente." 444 | 445 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:14 446 | msgid "" 447 | "Please confirm your selected spools for all active tools. This dialog is " 448 | "meant to protect you from accidentically selecting wrong spools for the " 449 | "print." 450 | msgstr "" 451 | "Por favor, confirma las bobinas seleccionadas para todos los extrusores activos. Este diálogo está " 452 | "pensado para evitar que elijas bobinas incorrectas para esta impresión." 453 | 454 | -------------------------------------------------------------------------------- /translations/fr/LC_MESSAGES/messages.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OllisGit/OctoPrint-FilamentManager/39ca512f5b91b10ea033c5ad9a398d91fa896bea/translations/fr/LC_MESSAGES/messages.mo -------------------------------------------------------------------------------- /translations/fr/LC_MESSAGES/messages.po: -------------------------------------------------------------------------------- 1 | # French translations for OctoPrint-FilamentManager. 2 | # Copyright (C) 2017 ORGANIZATION 3 | # This file is distributed under the same license as the 4 | # OctoPrint-FilamentManager project. 5 | # FIRST AUTHOR , 2017. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: OctoPrint-FilamentManager 0.1.0\n" 10 | "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" 11 | "POT-Creation-Date: 2021-10-17 11:30+0200\n" 12 | "PO-Revision-Date: 2021-07-14 21:16+0200\n" 13 | "Last-Translator: Sven Lohrmann \n" 14 | "Language: fr\n" 15 | "Language-Team: de \n" 16 | "Plural-Forms: nplurals=2; plural=(n != 1)\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=utf-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Generated-By: Babel 2.9.0\n" 21 | 22 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:357 23 | msgid "Start Print" 24 | msgstr "Démarrer l'impression" 25 | 26 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:372 27 | msgid "Resume Print" 28 | msgstr "Reprendre l'impression" 29 | 30 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:447 31 | msgid "Data import failed" 32 | msgstr "Échec de l'importation des données" 33 | 34 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:448 35 | msgid "Something went wrong, please consult the logs." 36 | msgstr "Une erreur s'est produite, veuillez consulter les journaux." 37 | 38 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:580 39 | msgid "Could not add profile" 40 | msgstr "Impossible d'ajouter le profile" 41 | 42 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:581 43 | msgid "" 44 | "There was an unexpected error while saving the filament profile, please " 45 | "consult the logs." 46 | msgstr "" 47 | "Une erreur inattendue s'est produite lors de l'enregistrement du profile " 48 | "de filament, veuillez consulter les journaux." 49 | 50 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:602 51 | msgid "Could not update profile" 52 | msgstr "Impossible de mettre à jour le profile" 53 | 54 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:603 55 | msgid "" 56 | "There was an unexpected error while updating the filament profile, please" 57 | " consult the logs." 58 | msgstr "" 59 | "Une erreur inattendue s'est produite lors de la mise à jour du profile de" 60 | " filament, veuillez consulter les journaux." 61 | 62 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:617 63 | msgid "Could not delete profile" 64 | msgstr "Impossible de supprimer le profile" 65 | 66 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:618 67 | msgid "" 68 | "There was an unexpected error while removing the filament profile, please" 69 | " consult the logs." 70 | msgstr "" 71 | "Une erreur inattendue s'est produite lors de la suppression du profile de" 72 | " filament, veuillez consulter les journaux." 73 | 74 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:627 75 | msgid "Delete profile?" 76 | msgstr "Supprimer le profile ?" 77 | 78 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:628 79 | msgid "" 80 | "You are about to delete the filament profile (). Please" 81 | " note that it is not possible to delete profiles with associated spools." 82 | msgstr "" 83 | "Vous êtes sur le point de supprimer le profile de filament " 84 | "(). Veuillez noter qu'il n'est pas possible de supprimer des " 85 | "profils avec des bobines associés." 86 | 87 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:629 88 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:949 89 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:15 90 | msgid "Delete" 91 | msgstr "Effacer" 92 | 93 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:709 94 | msgid "Could not select spool" 95 | msgstr "Impossible de sélectionner la bobine" 96 | 97 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:710 98 | msgid "" 99 | "There was an unexpected error while selecting the spool, please consult " 100 | "the logs." 101 | msgstr "" 102 | "Une erreur inattendue s'est produite lors de la sélection du spool, " 103 | "veuillez consulter les journaux." 104 | 105 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:898 106 | msgid "Could not add spool" 107 | msgstr "Impossible d'ajouter la bobine" 108 | 109 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:899 110 | msgid "" 111 | "There was an unexpected error while saving the filament spool, please " 112 | "consult the logs." 113 | msgstr "" 114 | "Une erreur inattendue s'est produite lors de l'enregistrement de la " 115 | "bobine de filament, veuillez consulter les journaux." 116 | 117 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:921 118 | msgid "Could not update spool" 119 | msgstr "Impossible de mettre à jour la bobine" 120 | 121 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:922 122 | msgid "" 123 | "There was an unexpected error while updating the filament spool, please " 124 | "consult the logs." 125 | msgstr "" 126 | "Une erreur inattendue s'est produite lors de la mise à jour de la bobine " 127 | "de filament, veuillez consulter les journaux." 128 | 129 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:937 130 | msgid "Could not delete spool" 131 | msgstr "Impossible de supprimer la bobine" 132 | 133 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:938 134 | msgid "" 135 | "There was an unexpected error while removing the filament spool, please " 136 | "consult the logs." 137 | msgstr "" 138 | "Une erreur inattendue s'est produite lors du retrait de la bobine de " 139 | "filament, veuillez consulter les journaux." 140 | 141 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:947 142 | msgid "Delete spool?" 143 | msgstr "Supprimer la bobine ?" 144 | 145 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:948 146 | msgid "You are about to delete the filament spool - ()." 147 | msgstr "" 148 | "Vous êtes sur le point de supprimer la bobine de filament - " 149 | "()." 150 | 151 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:1020 152 | msgid "Insufficient filament" 153 | msgstr "Filament insuffisant" 154 | 155 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:1021 156 | msgid "" 157 | "The current print job needs more material than what's left on the " 158 | "selected spool." 159 | msgstr "" 160 | "Le travail d'impression en cours nécessite plus de matériel que ce qui " 161 | "reste sur la bobine sélectionnée." 162 | 163 | #: octoprint_filamentmanager/templates/settings.jinja2:4 164 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:5 165 | msgid "Plugin Configuration" 166 | msgstr "Configuration du plug-in" 167 | 168 | #: octoprint_filamentmanager/templates/settings.jinja2:7 169 | msgid "Filament Spools" 170 | msgstr "Bobines de filament" 171 | 172 | #: octoprint_filamentmanager/templates/settings.jinja2:13 173 | msgid "Items per page" 174 | msgstr "Objets par page" 175 | 176 | #: octoprint_filamentmanager/templates/settings.jinja2:22 177 | msgid "Sort by" 178 | msgstr "Trier par" 179 | 180 | #: octoprint_filamentmanager/templates/settings.jinja2:23 181 | msgid "Name (ascending)" 182 | msgstr "Nom (alphabétique)" 183 | 184 | #: octoprint_filamentmanager/templates/settings.jinja2:24 185 | msgid "Material (ascending)" 186 | msgstr "Matériel (alphabétique)" 187 | 188 | #: octoprint_filamentmanager/templates/settings.jinja2:25 189 | msgid "Vendor (ascending)" 190 | msgstr "Vendeur (alphabétique)" 191 | 192 | #: octoprint_filamentmanager/templates/settings.jinja2:26 193 | msgid "Remaining (descending)" 194 | msgstr "Restant (décroissant)" 195 | 196 | #: octoprint_filamentmanager/templates/settings.jinja2:36 197 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:15 198 | msgid "Name" 199 | msgstr "Nom" 200 | 201 | #: octoprint_filamentmanager/templates/settings.jinja2:37 202 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:38 203 | msgid "Material" 204 | msgstr "Matériel" 205 | 206 | #: octoprint_filamentmanager/templates/settings.jinja2:38 207 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:26 208 | msgid "Vendor" 209 | msgstr "Vendeur" 210 | 211 | #: octoprint_filamentmanager/templates/settings.jinja2:39 212 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:50 213 | msgid "Weight" 214 | msgstr "Poids" 215 | 216 | #: octoprint_filamentmanager/templates/settings.jinja2:40 217 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:62 218 | msgid "Remaining" 219 | msgstr "Restant" 220 | 221 | #: octoprint_filamentmanager/templates/settings.jinja2:41 222 | msgid "Used" 223 | msgstr "Utilisé" 224 | 225 | #: octoprint_filamentmanager/templates/settings.jinja2:42 226 | msgid "Action" 227 | msgstr "Action" 228 | 229 | #: octoprint_filamentmanager/templates/settings.jinja2:54 230 | msgid "Edit Spool" 231 | msgstr "Modifier la bobine" 232 | 233 | #: octoprint_filamentmanager/templates/settings.jinja2:55 234 | msgid "Duplicate Spool" 235 | msgstr "Dupliquer la bobine" 236 | 237 | #: octoprint_filamentmanager/templates/settings.jinja2:56 238 | msgid "Delete Spool" 239 | msgstr "Supprimer la bobine" 240 | 241 | #: octoprint_filamentmanager/templates/settings.jinja2:79 242 | msgid "Manage Profiles" 243 | msgstr "Gérer les profiles" 244 | 245 | #: octoprint_filamentmanager/templates/settings.jinja2:80 246 | msgid "Add Spool" 247 | msgstr "Ajouter une bobine" 248 | 249 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:12 250 | msgid "Features" 251 | msgstr "Caractéristiques" 252 | 253 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:13 254 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:91 255 | msgid "Database" 256 | msgstr "Base de données" 257 | 258 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:14 259 | msgid "Appearance" 260 | msgstr "Apparence" 261 | 262 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:26 263 | msgid "" 264 | "Show dialog to confirm selected spools before starting/resuming the print" 265 | " job" 266 | msgstr "" 267 | "Afficher la boîte de dialogue pour confirmer les bobines sélectionnées " 268 | "avant de démarrer/reprendre le travail d'impression" 269 | 270 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:34 271 | msgid "Warn if print job exceeds remaining filament" 272 | msgstr "Avertir si le travail d'impression dépasse le filament restant" 273 | 274 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:42 275 | msgid "Enable software odometer to measure used filament" 276 | msgstr "Activer l'odomètre logiciel pour mesurer le filament utilisé" 277 | 278 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:50 279 | msgid "Pause print if filament runs out" 280 | msgstr "Suspendre l'impression si le filament s'épuise" 281 | 282 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:56 283 | msgid "Pause threshold" 284 | msgstr "Seuil de pause" 285 | 286 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:74 287 | msgid "Use external database" 288 | msgstr "Utiliser une base de données externe" 289 | 290 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:78 291 | msgid "" 292 | "If you want to use an external database, please take a look into my wiki how to " 295 | "install the drivers and setup the database." 296 | msgstr "" 297 | 298 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:84 299 | msgid "URI" 300 | msgstr "URl" 301 | 302 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:98 303 | msgid "Username" 304 | msgstr "Nom d'utilisateur" 305 | 306 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:105 307 | msgid "Password" 308 | msgstr "Mot de passe" 309 | 310 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:113 311 | msgid "Test connection" 312 | msgstr "Tester la connexion" 313 | 314 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:118 315 | msgid "" 316 | "Note: If you change these settings you must restart your OctoPrint " 317 | "instance for the changes to take affect." 318 | msgstr "" 319 | "Remarque : si vous modifiez ces paramètres, vous devez redémarrer votre " 320 | "instance OctoPrint pour que les modifications prennent effet." 321 | 322 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:122 323 | msgid "Import & Export" 324 | msgstr "Importer / Exporter" 325 | 326 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:127 327 | msgid "Browse..." 328 | msgstr "Parcourir..." 329 | 330 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:131 331 | msgid "Import" 332 | msgstr "Importer" 333 | 334 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:133 335 | msgid "Export" 336 | msgstr "Exporter" 337 | 338 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:135 339 | msgid "" 340 | "This does not look like a valid import archive. Only zip files are " 341 | "supported." 342 | msgstr "" 343 | "Cela ne ressemble pas à une archive d'importation valide. Seuls les " 344 | "fichiers ZIP sont pris en charge." 345 | 346 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:144 347 | msgid "Currency symbol" 348 | msgstr "Symbole de la monnaie" 349 | 350 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:156 351 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:87 352 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:27 353 | msgid "Cancel" 354 | msgstr "Annuler" 355 | 356 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:157 357 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:16 358 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:88 359 | msgid "Save" 360 | msgstr "Sauvegarder" 361 | 362 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:5 363 | msgid "Filament Profiles" 364 | msgstr "Profiles de filaments" 365 | 366 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:13 367 | msgid "--- New Profile ---" 368 | msgstr "--- Nouveau profile ---" 369 | 370 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:14 371 | msgid "New" 372 | msgstr "Nouveau" 373 | 374 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:16 375 | msgid "Save profile" 376 | msgstr "Enregistrer le profile" 377 | 378 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:30 379 | msgid "Vendor must be set" 380 | msgstr "Le fournisseur doit être défini" 381 | 382 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:42 383 | msgid "Material must be set" 384 | msgstr "Le matériel doit être réglé" 385 | 386 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:50 387 | msgid "Density" 388 | msgstr "Densité" 389 | 390 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:62 391 | msgid "Diameter" 392 | msgstr "Diamètre" 393 | 394 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:75 395 | msgid "Close" 396 | msgstr "Fermer" 397 | 398 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:5 399 | msgid "Filament Spool" 400 | msgstr "Bobine de filament" 401 | 402 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:19 403 | msgid "Name must be set" 404 | msgstr "Le nom doit être défini" 405 | 406 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:27 407 | msgid "Profile" 408 | msgstr "Profile" 409 | 410 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:38 411 | msgid "Price" 412 | msgstr "Prix" 413 | 414 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:74 415 | msgid "Temperature offset" 416 | msgstr "Décalage de température" 417 | 418 | #: octoprint_filamentmanager/templates/sidebar.jinja2:3 419 | msgid "hide overused usage" 420 | msgstr "" 421 | 422 | #: octoprint_filamentmanager/templates/sidebar.jinja2:10 423 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:18 424 | msgid "Tool" 425 | msgstr "Outil" 426 | 427 | #: octoprint_filamentmanager/templates/sidebar.jinja2:19 428 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:19 429 | msgid "--- Select Spool ---" 430 | msgstr "--- Sélectionnez la bobine ---" 431 | 432 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:5 433 | msgid "Confirm your selected spools" 434 | msgstr "Confirmez vos bobines sélectionnées" 435 | 436 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:10 437 | msgid "" 438 | "There are no information available about the active tools for the print " 439 | "job. Make sure the analysing process of the file has finished and that " 440 | "it's loaded correctly." 441 | msgstr "" 442 | "Aucune information n'est disponible sur les outils actifs pour le travail" 443 | " d'impression. Assurez-vous que le processus d'analyse du fichier est " 444 | "terminé et qu'il est chargé correctement." 445 | 446 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:14 447 | msgid "" 448 | "Please confirm your selected spools for all active tools. This dialog is " 449 | "meant to protect you from accidentically selecting wrong spools for the " 450 | "print." 451 | msgstr "" 452 | "Veuillez confirmer vos bobines sélectionnées pour tous les outils actifs." 453 | " Cette boîte de dialogue est destinée à vous protéger contre la sélection" 454 | " accidentelle de mauvais spools pour l'impression." 455 | 456 | #~ msgid "Profile (ascending)" 457 | #~ msgstr "Profile (croissant)" 458 | 459 | #~ msgid "Selected Spools" 460 | #~ msgstr "Bobines sélectionnées" 461 | 462 | #~ msgid "Filament warning" 463 | #~ msgstr "Avertissement de filament" 464 | 465 | #~ msgid "Saving failed" 466 | #~ msgstr "Échec de l'enregistrement" 467 | 468 | #~ msgid "Failed to query spools" 469 | #~ msgstr "Échec de la requête des bobines" 470 | 471 | #~ msgid "" 472 | #~ "There was an unexpected database error" 473 | #~ " while saving the filament profile, " 474 | #~ "please consult the logs." 475 | #~ msgstr "" 476 | #~ "Une erreur de base de données " 477 | #~ "inattendue s'est produite lors de " 478 | #~ "l'enregistrement du profile de filament, " 479 | #~ "veuillez consulter les journaux." 480 | 481 | #~ msgid "" 482 | #~ "There was an unexpected database error" 483 | #~ " while updating the filament profile, " 484 | #~ "please consult the logs." 485 | #~ msgstr "" 486 | #~ "Une erreur de base de données " 487 | #~ "inattendue s'est produite lors de la " 488 | #~ "mise à jour du profile de " 489 | #~ "filament, veuillez consulter les journaux." 490 | 491 | #~ msgid "" 492 | #~ "There was an unexpected error while removing the filament spool,\n" 493 | #~ " please consult the logs." 494 | #~ msgstr "" 495 | #~ "Une erreur inattendue s'est produite " 496 | #~ "lors du retrait de la bobine de" 497 | #~ " filament,\n" 498 | #~ " veuillez " 499 | #~ "consulter les journaux." 500 | 501 | #~ msgid "Spool selection failed" 502 | #~ msgstr "Échec de la sélection de la bobine" 503 | 504 | #~ msgid "Cannot delete profiles with associated spools." 505 | #~ msgstr "Impossible de supprimer les profiles avec les bobines associés." 506 | 507 | #~ msgid "Data import successfull" 508 | #~ msgstr "Importation des données réussie" 509 | 510 | #~ msgid "Enable filament odometer" 511 | #~ msgstr "Activer l'odomètre à filament" 512 | 513 | -------------------------------------------------------------------------------- /translations/messages.pot: -------------------------------------------------------------------------------- 1 | # Translations template for OctoPrint-FilamentManager. 2 | # Copyright (C) 2021 The OctoPrint Project 3 | # This file is distributed under the same license as the 4 | # OctoPrint-FilamentManager project. 5 | # FIRST AUTHOR , 2021. 6 | # 7 | #, fuzzy 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: OctoPrint-FilamentManager 1.9.0\n" 11 | "Report-Msgid-Bugs-To: i18n@octoprint.org\n" 12 | "POT-Creation-Date: 2021-10-17 11:30+0200\n" 13 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 14 | "Last-Translator: FULL NAME \n" 15 | "Language-Team: LANGUAGE \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=utf-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Generated-By: Babel 2.9.0\n" 20 | 21 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:357 22 | msgid "Start Print" 23 | msgstr "" 24 | 25 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:372 26 | msgid "Resume Print" 27 | msgstr "" 28 | 29 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:447 30 | msgid "Data import failed" 31 | msgstr "" 32 | 33 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:448 34 | msgid "Something went wrong, please consult the logs." 35 | msgstr "" 36 | 37 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:580 38 | msgid "Could not add profile" 39 | msgstr "" 40 | 41 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:581 42 | msgid "" 43 | "There was an unexpected error while saving the filament profile, please " 44 | "consult the logs." 45 | msgstr "" 46 | 47 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:602 48 | msgid "Could not update profile" 49 | msgstr "" 50 | 51 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:603 52 | msgid "" 53 | "There was an unexpected error while updating the filament profile, please" 54 | " consult the logs." 55 | msgstr "" 56 | 57 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:617 58 | msgid "Could not delete profile" 59 | msgstr "" 60 | 61 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:618 62 | msgid "" 63 | "There was an unexpected error while removing the filament profile, please" 64 | " consult the logs." 65 | msgstr "" 66 | 67 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:627 68 | msgid "Delete profile?" 69 | msgstr "" 70 | 71 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:628 72 | msgid "" 73 | "You are about to delete the filament profile (). Please" 74 | " note that it is not possible to delete profiles with associated spools." 75 | msgstr "" 76 | 77 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:629 78 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:949 79 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:15 80 | msgid "Delete" 81 | msgstr "" 82 | 83 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:709 84 | msgid "Could not select spool" 85 | msgstr "" 86 | 87 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:710 88 | msgid "" 89 | "There was an unexpected error while selecting the spool, please consult " 90 | "the logs." 91 | msgstr "" 92 | 93 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:898 94 | msgid "Could not add spool" 95 | msgstr "" 96 | 97 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:899 98 | msgid "" 99 | "There was an unexpected error while saving the filament spool, please " 100 | "consult the logs." 101 | msgstr "" 102 | 103 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:921 104 | msgid "Could not update spool" 105 | msgstr "" 106 | 107 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:922 108 | msgid "" 109 | "There was an unexpected error while updating the filament spool, please " 110 | "consult the logs." 111 | msgstr "" 112 | 113 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:937 114 | msgid "Could not delete spool" 115 | msgstr "" 116 | 117 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:938 118 | msgid "" 119 | "There was an unexpected error while removing the filament spool, please " 120 | "consult the logs." 121 | msgstr "" 122 | 123 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:947 124 | msgid "Delete spool?" 125 | msgstr "" 126 | 127 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:948 128 | msgid "You are about to delete the filament spool - ()." 129 | msgstr "" 130 | 131 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:1020 132 | msgid "Insufficient filament" 133 | msgstr "" 134 | 135 | #: octoprint_filamentmanager/static/js/filamentmanager.bundled.js:1021 136 | msgid "" 137 | "The current print job needs more material than what's left on the " 138 | "selected spool." 139 | msgstr "" 140 | 141 | #: octoprint_filamentmanager/templates/settings.jinja2:4 142 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:5 143 | msgid "Plugin Configuration" 144 | msgstr "" 145 | 146 | #: octoprint_filamentmanager/templates/settings.jinja2:7 147 | msgid "Filament Spools" 148 | msgstr "" 149 | 150 | #: octoprint_filamentmanager/templates/settings.jinja2:13 151 | msgid "Items per page" 152 | msgstr "" 153 | 154 | #: octoprint_filamentmanager/templates/settings.jinja2:22 155 | msgid "Sort by" 156 | msgstr "" 157 | 158 | #: octoprint_filamentmanager/templates/settings.jinja2:23 159 | msgid "Name (ascending)" 160 | msgstr "" 161 | 162 | #: octoprint_filamentmanager/templates/settings.jinja2:24 163 | msgid "Material (ascending)" 164 | msgstr "" 165 | 166 | #: octoprint_filamentmanager/templates/settings.jinja2:25 167 | msgid "Vendor (ascending)" 168 | msgstr "" 169 | 170 | #: octoprint_filamentmanager/templates/settings.jinja2:26 171 | msgid "Remaining (descending)" 172 | msgstr "" 173 | 174 | #: octoprint_filamentmanager/templates/settings.jinja2:36 175 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:15 176 | msgid "Name" 177 | msgstr "" 178 | 179 | #: octoprint_filamentmanager/templates/settings.jinja2:37 180 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:38 181 | msgid "Material" 182 | msgstr "" 183 | 184 | #: octoprint_filamentmanager/templates/settings.jinja2:38 185 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:26 186 | msgid "Vendor" 187 | msgstr "" 188 | 189 | #: octoprint_filamentmanager/templates/settings.jinja2:39 190 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:50 191 | msgid "Weight" 192 | msgstr "" 193 | 194 | #: octoprint_filamentmanager/templates/settings.jinja2:40 195 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:62 196 | msgid "Remaining" 197 | msgstr "" 198 | 199 | #: octoprint_filamentmanager/templates/settings.jinja2:41 200 | msgid "Used" 201 | msgstr "" 202 | 203 | #: octoprint_filamentmanager/templates/settings.jinja2:42 204 | msgid "Action" 205 | msgstr "" 206 | 207 | #: octoprint_filamentmanager/templates/settings.jinja2:54 208 | msgid "Edit Spool" 209 | msgstr "" 210 | 211 | #: octoprint_filamentmanager/templates/settings.jinja2:55 212 | msgid "Duplicate Spool" 213 | msgstr "" 214 | 215 | #: octoprint_filamentmanager/templates/settings.jinja2:56 216 | msgid "Delete Spool" 217 | msgstr "" 218 | 219 | #: octoprint_filamentmanager/templates/settings.jinja2:79 220 | msgid "Manage Profiles" 221 | msgstr "" 222 | 223 | #: octoprint_filamentmanager/templates/settings.jinja2:80 224 | msgid "Add Spool" 225 | msgstr "" 226 | 227 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:12 228 | msgid "Features" 229 | msgstr "" 230 | 231 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:13 232 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:91 233 | msgid "Database" 234 | msgstr "" 235 | 236 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:14 237 | msgid "Appearance" 238 | msgstr "" 239 | 240 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:26 241 | msgid "" 242 | "Show dialog to confirm selected spools before starting/resuming the print" 243 | " job" 244 | msgstr "" 245 | 246 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:34 247 | msgid "Warn if print job exceeds remaining filament" 248 | msgstr "" 249 | 250 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:42 251 | msgid "Enable software odometer to measure used filament" 252 | msgstr "" 253 | 254 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:50 255 | msgid "Pause print if filament runs out" 256 | msgstr "" 257 | 258 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:56 259 | msgid "Pause threshold" 260 | msgstr "" 261 | 262 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:74 263 | msgid "Use external database" 264 | msgstr "" 265 | 266 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:78 267 | msgid "" 268 | "If you want to use an external database, please take a look into my wiki how to " 271 | "install the drivers and setup the database." 272 | msgstr "" 273 | 274 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:84 275 | msgid "URI" 276 | msgstr "" 277 | 278 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:98 279 | msgid "Username" 280 | msgstr "" 281 | 282 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:105 283 | msgid "Password" 284 | msgstr "" 285 | 286 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:113 287 | msgid "Test connection" 288 | msgstr "" 289 | 290 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:118 291 | msgid "" 292 | "Note: If you change these settings you must restart your OctoPrint " 293 | "instance for the changes to take affect." 294 | msgstr "" 295 | 296 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:122 297 | msgid "Import & Export" 298 | msgstr "" 299 | 300 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:127 301 | msgid "Browse..." 302 | msgstr "" 303 | 304 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:131 305 | msgid "Import" 306 | msgstr "" 307 | 308 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:133 309 | msgid "Export" 310 | msgstr "" 311 | 312 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:135 313 | msgid "" 314 | "This does not look like a valid import archive. Only zip files are " 315 | "supported." 316 | msgstr "" 317 | 318 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:144 319 | msgid "Currency symbol" 320 | msgstr "" 321 | 322 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:156 323 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:87 324 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:27 325 | msgid "Cancel" 326 | msgstr "" 327 | 328 | #: octoprint_filamentmanager/templates/settings_configdialog.jinja2:157 329 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:16 330 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:88 331 | msgid "Save" 332 | msgstr "" 333 | 334 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:5 335 | msgid "Filament Profiles" 336 | msgstr "" 337 | 338 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:13 339 | msgid "--- New Profile ---" 340 | msgstr "" 341 | 342 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:14 343 | msgid "New" 344 | msgstr "" 345 | 346 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:16 347 | msgid "Save profile" 348 | msgstr "" 349 | 350 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:30 351 | msgid "Vendor must be set" 352 | msgstr "" 353 | 354 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:42 355 | msgid "Material must be set" 356 | msgstr "" 357 | 358 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:50 359 | msgid "Density" 360 | msgstr "" 361 | 362 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:62 363 | msgid "Diameter" 364 | msgstr "" 365 | 366 | #: octoprint_filamentmanager/templates/settings_profiledialog.jinja2:75 367 | msgid "Close" 368 | msgstr "" 369 | 370 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:5 371 | msgid "Filament Spool" 372 | msgstr "" 373 | 374 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:19 375 | msgid "Name must be set" 376 | msgstr "" 377 | 378 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:27 379 | msgid "Profile" 380 | msgstr "" 381 | 382 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:38 383 | msgid "Price" 384 | msgstr "" 385 | 386 | #: octoprint_filamentmanager/templates/settings_spooldialog.jinja2:74 387 | msgid "Temperature offset" 388 | msgstr "" 389 | 390 | #: octoprint_filamentmanager/templates/sidebar.jinja2:3 391 | msgid "hide overused usage" 392 | msgstr "" 393 | 394 | #: octoprint_filamentmanager/templates/sidebar.jinja2:10 395 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:18 396 | msgid "Tool" 397 | msgstr "" 398 | 399 | #: octoprint_filamentmanager/templates/sidebar.jinja2:19 400 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:19 401 | msgid "--- Select Spool ---" 402 | msgstr "" 403 | 404 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:5 405 | msgid "Confirm your selected spools" 406 | msgstr "" 407 | 408 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:10 409 | msgid "" 410 | "There are no information available about the active tools for the print " 411 | "job. Make sure the analysing process of the file has finished and that " 412 | "it's loaded correctly." 413 | msgstr "" 414 | 415 | #: octoprint_filamentmanager/templates/spool_confirmation.jinja2:14 416 | msgid "" 417 | "Please confirm your selected spools for all active tools. This dialog is " 418 | "meant to protect you from accidentically selecting wrong spools for the " 419 | "print." 420 | msgstr "" 421 | 422 | --------------------------------------------------------------------------------