diff --git a/CHANGELOG.md b/CHANGELOG.md index 40006957e..d536607f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,21 @@ # Changelog -This just tracks the most notable changes, if you want all the details checkout the commit history. Probably all versions contain changes regarding documentation, translation, fixes and other minor refactors +This just tracks the most notable changes, if you want all the details checkout the commit history. +Probably all versions contain changes regarding documentation, translation, fixes and other minor refactors -## Untagged +## v0.4.5-* + +* basic lockscreen for shows or kids + +## v0.4.5 (Oct 28, 2024) + +* allow calling KlipperScreen panels from gcode +* bed_mesh: automatically call for z_tilt or quad_level if not applied +* show battery status in the topbar +* macros: keyboard to keypad input switch with auto pre-selection + +## v0.4.4 (Sep 16, 2024) +* support for different moonraker routes +* allow showing/hiding cursor from the settings * some wpa-eap support, adds the security type selector and user field * extrude: wait for temp or open temp panel automatically close #1416 * extrude: show more filament sensors (up to 9) @@ -17,7 +31,7 @@ This just tracks the most notable changes, if you want all the details checkout * gcodes: add extra info to confirm print * zcalibrate: add a dropdown with the function name to select * job_status: auto-estimated time: use last print time if available -* gcodes: add option to delete in the confirm +* gcodes: add option to delete in the confirmation ## v0.4.2 (Jun 10, 2024) * job_status: remove the status message and use the titlebar for that @@ -83,7 +97,7 @@ This just tracks the most notable changes, if you want all the details checkout * add moonraker warnings ## v0.3.6 (Sep 24, 2023) -* Led light control, close #991 (#1106) +* LED light control, close #991 (#1106) * pause will auto-open extrude * macros: hide the panel if there are no elegible macros * job_status: click thumbnail for fullscreen thumbnail @@ -254,7 +268,7 @@ The Project changed maintainer [alfrix](github.com/alfrix) ## v0.1.4 (Feb 15, 2021) * network: Show wifi information -* screen_panel: Put icons on a side bar instead of on the header +* screen_panel: Put icons on a sidebar instead of on the header * printer: Include quad_gantry_level * wifi: Initial wifi class * job_status/settings: Allow different file estimation methods diff --git a/README.md b/README.md index 78293ef7f..d1c45d61c 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,6 @@ We extend our gratitude to all contributors who have helped along the way. [Meet ### Sponsors -![LDO](docs/img/LDO-LOGO_SQ.png) ![YUMI](docs/img/YUMI.png) +![LDO](docs/img/sponsors/LDO.png) ![YUMI](docs/img/sponsors/YUMI.png) -Special thanks to [LDO](https://ldomotors.com/) and [YUMI](https://wiki.yumi-lab.com/) for sponsoring KlipperScreen and the open-source community. \ No newline at end of file +Special thanks to [LDO](https://ldomotors.com/) and [YUMI](https://wiki.yumi-lab.com/) for sponsoring KlipperScreen and the open-source community. diff --git a/config/defaults.conf b/config/defaults.conf index 0c36d3f21..afc07b4bc 100644 --- a/config/defaults.conf +++ b/config/defaults.conf @@ -5,23 +5,26 @@ [main] [preheat PLA] -bed = 40 -extruder = 195 +bed = 60 +extruder = 215 +extruder1 = 215 -[preheat ABS] -bed = 90 -extruder = 220 +[preheat TPU] +bed = 65 +extruder = 225 +extruder1 = 225 [preheat PETG] bed = 80 -extruder = 240 +extruder = 235 +extruder1 = 235 -[preheat FLEX] -bed = 0 -extruder = 210 +[preheat ABS] +bed = 110 +extruder = 245 +extruder1 = 245 [include main_menu.conf] [include splash_menu.conf] [include print_menu.conf] - -[include move_menu.conf] +[include move_menu.conf] \ No newline at end of file diff --git a/config/main_menu.conf b/config/main_menu.conf index 3ac5dff7d..cc5992644 100644 --- a/config/main_menu.conf +++ b/config/main_menu.conf @@ -50,15 +50,15 @@ icon: bed-mesh panel: bed_mesh enable: {{ 'bed_mesh' in printer.config_sections }} -[menu __main more zoffset] -name: {{ gettext('Z Calibrate') }} -icon: z-farther -panel: zcalibrate +# [menu __main more zoffset] +# name: {{ gettext('Z Calibrate') }} +# icon: z-farther +# panel: zcalibrate -[menu __main more limits] -name: {{ gettext('Limits') }} -icon: fine-tune -panel: limits +# [menu __main more limits] +# name: {{ gettext('Limits') }} +# icon: fine-tune +# panel: limits [menu __main more fan] name: {{ gettext('Fan') }} @@ -66,11 +66,11 @@ icon: fan panel: fan enable: {{ printer.fans.count > 0 }} -[menu __main more led] -name: {{ gettext('Leds') }} -icon: light -panel: led -enable: {{ printer.leds.count > 0 }} +# [menu __main more led] +# name: {{ gettext('Leds') }} +# icon: light +# panel: led +# enable: {{ printer.leds.count > 0 }} [menu __main more macros] name: {{ gettext('Macros') }} @@ -78,17 +78,17 @@ icon: custom-script panel: gcode_macros enable: {{ printer.gcode_macros.count > 0 }} -[menu __main more pins] -name: {{ gettext('Pins') }} -icon: hashtag -panel: pins -enable: {{ printer.output_pins.count > 0 or printer.pwm_tools.count > 0 }} +# [menu __main more pins] +# name: {{ gettext('Pins') }} +# icon: hashtag +# panel: pins +# enable: {{ printer.output_pins.count > 0 or printer.pwm_tools.count > 0 }} -[menu __main more power] -name: {{ gettext('Power') }} -icon: shutdown -panel: power -enable: {{ moonraker.power_devices.count > 0 }} +# [menu __main more power] +# name: {{ gettext('Power') }} +# icon: shutdown +# panel: power +# enable: {{ moonraker.power_devices.count > 0 }} [menu __main more camera] name: {{ gettext('Camera') }} @@ -106,21 +106,21 @@ name: {{ gettext('Update') }} icon: refresh panel: updater -[menu __main more input_shaper] -name: {{ gettext('Input Shaper') }} -icon: move -panel: input_shaper -enable: {{ 'input_shaper' in printer.config_sections }} +# [menu __main more input_shaper] +# name: {{ gettext('Input Shaper') }} +# icon: move +# panel: input_shaper +# enable: {{ 'input_shaper' in printer.config_sections }} -[menu __main more save] -name: {{ gettext('Save Config') }} -icon: complete -method: printer.gcode.script -params: {"script":"SAVE_CONFIG"} -confirm: - {{ gettext('Save configuration?') }} +# [menu __main more save] +# name: {{ gettext('Save Config') }} +# icon: complete +# method: printer.gcode.script +# params: {"script":"SAVE_CONFIG"} +# confirm: +# {{ gettext('Save configuration?') }} - {{ gettext('Klipper will reboot') }} +# {{ gettext('Klipper will reboot') }} [menu __main more settings] name: KlipperScreen @@ -152,4 +152,4 @@ enable: {{ moonraker.spoolman }} name: {{ gettext('System') }} icon: info panel: system -enable: {{ moonraker_connected }} +enable: {{ moonraker_connected }} \ No newline at end of file diff --git a/config/move_menu.conf b/config/move_menu.conf index e5342fbcf..99d35c938 100644 --- a/config/move_menu.conf +++ b/config/move_menu.conf @@ -2,6 +2,12 @@ # DO NOT EDIT THIS FILE USE KlipperScreen.conf # +[menu move homing homeall] +name: {{ gettext('Home All') }} +icon: home +method: printer.gcode.script +params: {"script":"G28"} + [menu move homing homex] name: {{ gettext('Home X') }} icon: home-x @@ -20,18 +26,6 @@ icon: home-z method: printer.gcode.script params: {"script":"G28 Z"} -[menu move homing homeall] -name: {{ gettext('Home All') }} -icon: home -method: printer.gcode.script -params: {"script":"G28"} - -[menu move homing homexy] -name: {{ gettext('Home XY') }} -icon: home -method: printer.gcode.script -params: {"script":"G28 X Y"} - [menu move homing quad_gantry_level] name: {{ gettext('Quad Gantry Level') }} icon: home-z @@ -39,9 +33,90 @@ method: printer.gcode.script params: {"script":"QUAD_GANTRY_LEVEL"} enable: {{ 'quad_gantry_level' in printer.config_sections }} +[menu move homing bed_alignment] +name: {{ gettext('Z Tilt') }} +icon: z-tilt +method: printer.gcode.script +params: {"script":"G34"} +enable: {{ 'quad_z_tilt_adjust' in printer.gcode_macros.list }} + [menu move homing Z-Tilt] name: {{ gettext('Z Tilt') }} icon: z-tilt method: printer.gcode.script params: {"script":"Z_TILT_ADJUST"} enable: {{ 'z_tilt' in printer.config_sections }} + +[menu move homing bed_mesh_calibrate] +name: {{ gettext('Bed calibrate') }} +icon: bed-mesh +method: printer.gcode.script +params: {"script":"G29"} +enable: {{ 'G29' in printer.gcode_macros.list }} + +[menu move homing z_min] +name: {{ gettext('Bed Up') }} +icon: arrow-up +method: printer.gcode.script +params: {"script":"G1 Z5 F1200"} + +[menu move homing z_max] +name: {{ gettext('Bed Down') }} +icon: arrow-down +method: printer.gcode.script +params: {"script":"Z_MAX"} +enable: {{ 'Z_MAX' in printer.gcode_macros.list }} + +[menu move homing pid_calibrate_hotend] +name: {{ gettext('Autocalibration of PID hotend') }} +icon: extruder +method: printer.gcode.script +params: {"script":"PID_CALIBRATE_HOTEND"} +enable: {{ 'PID_CALIBRATE_HOTEND' in printer.gcode_macros.list }} +confirm: + {{ gettext('After confirmation, the PID hotend autocalibration will begin') }} + +[menu move homing pid_calibrate_hotend0] +name: {{ gettext('Autocalibration of PID 1st head') }} +icon: extruder-1 +method: printer.gcode.script +params: {"script":"PID_CALIBRATE_HOTEND0"} +enable: {{ 'PID_CALIBRATE_HOTEND0' in printer.gcode_macros.list }} +confirm: + {{ gettext('After confirmation, the autocalibration of PID 1st head will begin') }} + +[menu move homing pid_calibrate_hotend1] +name: {{ gettext('Autocalibration of PID 2nd head') }} +icon: extruder-2 +method: printer.gcode.script +params: {"script":"PID_CALIBRATE_HOTEND1"} +enable: {{ 'PID_CALIBRATE_HOTEND1' in printer.gcode_macros.list }} +confirm: + {{ gettext('After confirmation, the autocalibration of PID 2nd head will begin') }} + +[menu move homing pid_calibrate_bed] +name: {{ gettext('Autocalibration of PID bed') }} +icon: bed +method: printer.gcode.script +params: {"script":"PID_CALIBRATE_BED"} +enable: {{ 'PID_CALIBRATE_BED' in printer.gcode_macros.list }} +confirm: + {{ gettext('After confirmation, the PID bed autocalibration will begin') }} + +[menu move homing calibrate_z-offset] +name: {{ gettext('Autocalibration of Z-offset of the 2nd head') }} +icon: toolchanger +method: printer.gcode.script +params: {"script":"Zoffset"} +enable: {{ 'Zoffset' in printer.gcode_macros.list }} +confirm: + {{ gettext('After confirmation, the autocalibration of the 2nd head offset will begin') }} + +[menu move homing unsave_lower_bed] +name: {{ gettext('Bed Down 10mm') }} +icon: arrow-down +method: printer.gcode.script +params: {"script":"UNSAFE_LOWER_BED"} +enable: {{ 'UNSAFE_LOWER_BED' in printer.gcode_macros.list }} +confirm: + {{ gettext('Make sure that moving the bed 10mm down will be safe for the printer!') }} \ No newline at end of file diff --git a/config/print_menu.conf b/config/print_menu.conf index 42baf82d0..31262ad9e 100644 --- a/config/print_menu.conf +++ b/config/print_menu.conf @@ -29,17 +29,17 @@ icon: extrude panel: extrude enable: {{ printer.extruders.count > 0 }} -[menu __print power] -name: {{ gettext('Power') }} -icon: shutdown -panel: power -enable: {{ moonraker.power_devices.count > 0 }} - -[menu __print led] -name: {{ gettext('Leds') }} -icon: light -panel: led -enable: {{ printer.leds.count > 0 }} +# [menu __print power] +# name: {{ gettext('Power') }} +# icon: shutdown +# panel: power +# enable: {{ moonraker.power_devices.count > 0 }} + +# [menu __print led] +# name: {{ gettext('Leds') }} +# icon: light +# panel: led +# enable: {{ printer.leds.count > 0 }} [menu __print macros] name: {{ gettext('Macros') }} @@ -59,10 +59,10 @@ name: {{ gettext('Console') }} icon: console panel: console -[menu __print limits] -name: {{ gettext('Limits') }} -icon: fine-tune -panel: limits +# [menu __print limits] +# name: {{ gettext('Limits') }} +# icon: fine-tune +# panel: limits [menu __print network] name: {{ gettext('Network') }} @@ -86,8 +86,8 @@ icon: info panel: system enable: {{ moonraker_connected }} -[menu __print pins] -name: {{ gettext('Pins') }} -icon: hashtag -panel: pins -enable: {{ printer.output_pins.count > 0 or printer.pwm_tools.count > 0 }} +# [menu __print pins] +# name: {{ gettext('Pins') }} +# icon: hashtag +# panel: pins +# enable: {{ printer.output_pins.count > 0 or printer.pwm_tools.count > 0 }} \ No newline at end of file diff --git a/config/splash_menu.conf b/config/splash_menu.conf index d53d64d13..7be459848 100644 --- a/config/splash_menu.conf +++ b/config/splash_menu.conf @@ -31,4 +31,4 @@ panel: settings name: {{ gettext('System') }} icon: info panel: system -enable: {{ moonraker_connected }} +enable: {{ moonraker_connected }} \ No newline at end of file diff --git a/docs/Android.md b/docs/Android.md index ca9367acc..0dfa557a8 100644 --- a/docs/Android.md +++ b/docs/Android.md @@ -1,25 +1,30 @@ -# Android +# XServer-XSDL (Android Only) -This article describes how to use KlipperScreen from an Android device +This article describe how to use KlipperScreen from an Android device using XServer-XSDL !!! warning The experience may not be equal to run KlipperScreen natively. Depending on the device or the network you may encounter performance degradation or other issues. +!!! bug + This method may cause [memory-leaks](https://github.com/KlipperScreen/KlipperScreen/issues/862) + + It's recommended that you use [VNC](VNC.md) instead or at least install [earlyoom](https://packages.debian.org/en/stable/earlyoom) + + 1. [First installl KlipperScreen](Installation.md) -2. Install [XServer-XSDL](https://play.google.com/store/apps/details?id=x.org.server) on the Android device - Devices that do not have acces to the play store can grab the apk from the [official sourceforge]( - https://sourceforge.net/projects/libsdl-android/files/apk/XServer-XSDL/). ViewTouch does work too +2. Download the apk of XServer-XSDL or ViewTouch from the [official sourceforge](https://sourceforge.net/projects/libsdl-android/files/apk/XServer-XSDL/). - with older versions of Android you may have to use v1.11.40 + since it's no longer on the play store. -3. Choose [USB (ADB)](#adb) or [WI-FI](#wifi) + With Android 4 you may have to use v1.11.40 -### ADB +3. Install the app on the Android device -!!! bug - Some [users have found](https://github.com/KlipperScreen/KlipperScreen/issues/862) that using this method may cause memory-leaks +4. Choose [USB (ADB)](#adb) or [WI-FI](#wifi) + +### ADB !!! warning Leaving the phone always connected it's not recommended, remove the battery to avoid issues. diff --git a/docs/Configuration.md b/docs/Configuration.md index acc80d28f..554d360d9 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -24,9 +24,6 @@ The options listed here are not editable from within the user interface. # Time in seconds before the Job Status closes itself if an error is encountered # job_error_timeout: 0 -# Allows the cursor to be displayed on the screen -# show_cursor: False - # If multiple printers are defined, this can be set the name of the one to show at startup. # default_printer: MyPrinter @@ -37,6 +34,12 @@ The options listed here are not editable from within the user interface. # Define one or more moonraker power devices that turn on/off with the screensaver (CSV list) # screen_on_devices: example1, example2 # screen_off_devices: example1, example2 + +# Define the password to use when locking the screen, this is not secure +# it's saved as plain text, it's meant to be a deterrent for kids or people at shows +# it will be redacted from the logs. +# default is no password +# lock_password: example_password ``` !!! tip @@ -49,8 +52,13 @@ Multiple printers can be defined [printer MyPrinter] # Define the moonraker host/port if different from 127.0.0.1 and 7125 moonraker_host: 127.0.0.1 -# ports 443 and 7130 will use https/wss moonraker_port: 7125 +# Use HTTPS/WSS. Defaults to True for ports 443 or 7130, False for any other port +# moonraker_ssl: False +# If you're using the route_prefix option in your moonraker config, specify it here. +# This can be useful for running multiple printers behind a path-based reverse proxy. +# Most installs will not need this. +# moonraker_path: printer1 # Moonraker API key if this host is not connecting from a trusted client IP # moonraker_api_key: False @@ -202,6 +210,7 @@ printer.gcode_macros.count # Number of gcode macros printer.gcode_macros.list # List of names of the gcode macros printer.leds.count # Number of leds printer.config_sections # Array of section headers of Klipper config (printer.cfg) +printer.available_commands # List of all the commands that the printer supports ``` diff --git a/docs/Developers.md b/docs/Developers.md index 039724936..c600da613 100644 --- a/docs/Developers.md +++ b/docs/Developers.md @@ -23,6 +23,8 @@ cd ~/KlipperScreen python3 -m venv .venv source .venv/bin/activate pip install -r scripts/klipperscreen-requirements.txt +# this one is optional: +pip install -r scripts/dev-requirements.txt ``` # Set configurations Create klipperscreen.conf and place it on the repo folder diff --git a/docs/FAQ.md b/docs/FAQ.md index d57b58599..a59a1f2be 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -5,8 +5,10 @@ The minimum required version of Python is 3.8. This requirement is checked during installation. ??? "Using Older Python Versions" - If you need to use Python 3.7, you can do so with KlipperScreen v0.4.1 by running: + If you need to use Python 3.7, you can revert KlipperScreen to v0.4.1 + Connect to the printer via SSH and: ```sh + cd ~/KlipperScreen git reset --hard v0.4.1 ``` diff --git a/docs/Multi_instance.md b/docs/Multi_instance.md new file mode 100644 index 000000000..c66d765da --- /dev/null +++ b/docs/Multi_instance.md @@ -0,0 +1,132 @@ +Multiple instances of KlipperScreen + +*Dificulty: Advanced* + +This article describes different methods of adding remote desktop clients (VNC or Xserver-XSDL) that do not support installing KS directly. +If your remote device runs GNU/Linux then you should install KlipperScreen directly, instead of the methods described below. + +The instances will be independent of each other and not a mirror. + +## Notes on Performance + +Beware that running multiple instances on the same device at the same time will consume more resources (memory and processing time) +and can be taxing on lower end hardware, in my testing even a Raspberry Pi 3A can run multiple instances of KS, +providing that it doesn't have any cameras or other advanced features. + +!!! tip + You can view the system resource usage in the "System" panel of KlipperScreen or directly at the console with htop + Beware that even if the load seems okay at idle, during a print heavy dynamic loads can push the device over the threshold + and that may result in a Klipper error/failure, if it's running on the same device. + +Performance will heavily depend on the devices used, +if one of the devices is connected through the network, like for example a VNC client or Android Xserver-XSDL client, +then the network will influence the response time of the interface. + +## Option 1: Using the startup script method + +*Advantage:* relatively easy to setup + +*Disadvantage:* starting or stopping the service will affect all the instances + +The default KlipperScreen service will launch the script + +```sh +nano $HOME/KlipperScreen/scripts/launch_KlipperScreen.sh +``` + +Example script: + +```sh +#!/bin/bash +/usr/bin/xinit $KS_XCLIENT & +DISPLAY=192.168.18.147:0 $KS_XCLIENT -c $HOME/.config/KlipperScreen/tablet.cfg & +wait +``` + +In this example the script launches a local instance for a screen connected to the host +then it launches a server for xserver-xsdl client that is running at the defined IP, +notice that the second instance uses a configuration that is specific to itself. + +Dont forget to restart the service to load the changes +```sh +sudo systemctl restart KlipperScreen +``` + +## Option 2: Using a separate service + +*Advantage:* stopping and starting the service will only affect the desired instance + +*Disadvantage:* configuration and setup is more complex + +Create a new service unit file + +```sh +sudo nano /etc/systemd/system/KlipperScreen_tablet.service +``` + +Example of a service unit for an android tablet: (change the IP and username) +```ini title="KlipperScreen_tablet.service" +[Unit] +Description=KlipperScreen Tablet +StartLimitIntervalSec=0 +After=systemd-user-sessions.service plymouth-quit-wait.service +ConditionPathExists=/dev/tty0 +Wants=dbus.socket systemd-logind.service +After=dbus.socket systemd-logind.service +After=moonraker.service + +[Service] +Type=simple +Restart=always +RestartSec=2 +SupplementaryGroups=klipperscreen +# username +User=pi +WorkingDirectory=/home/pi/KlipperScreen +Environment="DISPLAY=192.168.18.147:0" +# Absolute paths are required, separate config is optional +ExecStart=/home/pi/.KlipperScreen-env/bin/python /home/pi/KlipperScreen/screen.py -c /home/pi/.config/KlipperScreen/tablet.cfg + +[Install] +WantedBy=multi-user.target +``` + +Test your new service +```sh +sudo systemctl start KlipperScreen_tablet +``` + +Optional: After veryfing it works, make it load when the system starts +```sh +sudo systemctl enable KlipperScreen_tablet +``` + +if you made a mistake in the config you'll have to reload the service unit +```sh +sudo systemctl daemon-reload +``` + +Add the new service to moonraker so it can be started and stopped from the UI +```sh +nano $HOME/printer_data/moonraker.asvc +``` +In the example above it was `KlipperScreen_tablet`. Beware that is case sensitive + +So in this case it would look something like this: +``` title="moonraker.asvc" +klipper_mcu +webcamd +MoonCord +KlipperScreen +KlipperScreen_tablet +moonraker-telegram-bot +moonraker-obico +sonar +crowsnest +octoeverywhere +``` + +Restart moonraker +```sh +sudo systemctl restart moonraker +``` diff --git a/docs/Quicktips.md b/docs/Quicktips.md index ded009e51..12a092e03 100644 --- a/docs/Quicktips.md +++ b/docs/Quicktips.md @@ -20,11 +20,11 @@ fan1 will show in the interface, but _fan2 will be hidden. ## Layer Progress -### Accurate layer progress in the secondary screen of the printing panel: -* [PrusaSlicer](#prusaslicer_1) -* [Cura](#cura_1) -* [ideaMaker](#ideamaker_1) +* [PrusaSlicer](#prusaslicer) +* [Cura](#cura) +* [ideaMaker](#ideamaker) +* [OrcaSlicer](#orcaslicer) Follow this steps to provide the current layer in the printing information. @@ -45,6 +45,18 @@ Printer Settings > Custom Gcode > After layer change Gcode SET_PRINT_STATS_INFO CURRENT_LAYER={layer_num + 1} ``` +#### PrusaSlicer Layer Messages + +* Open PrusaSlicer +* Go to: `Printer Settings` > `Custom Gcode` > `After layer change Gcode` +* Add this: + +```ini +M117 Layer {layer_num+1}/[total_layer_count] : {filament_settings_id[0]} +``` + +![Layer_progress](img/quicktips/PS_SS_Layer_progress.png) + #### Cura @@ -88,6 +100,10 @@ Then save the changes and restart Klipper. After this, any new file sliced in Cura will tell Klipper how to handle the layer values +#### Cura Layer Messages + +Install the extension: `Display Filename and Layer on LCD` + #### IdeaMaker @@ -105,36 +121,48 @@ SET_PRINT_STATS_INFO CURRENT_LAYER={layer_index} `{total_layers}` doesn't seem to be available in the Start gcode (at least on IdeaMaker 4.3.2) -### Accurate layer progress as a message below the status: +#### IdeaMaker Layer Messages -* [PrusaSlicer](#prusaslicer) -* [Cura](#cura) -* [ideaMaker](#ideamaker) +* Open IdeaMaker +* Go to: `Slice` > `Manage templates` > `Click on your template` > `Edit` +* Select the tab named `Gcode` > `Layer Change Gcode` +* Paste this: + +```ini +M117 Layer {layer_index} / {total_layers} +``` -#### PrusaSlicer -* Open PrusaSlicer -* Go to: `Printer Settings` > `Custom Gcode` > `After layer change Gcode` -* Add this: +#### OrcaSlicer + +* Open OrcaSlcicer +* Go to Prepare or Preview and in the printer section click `Edit Preset` > `Machine G-code` +* In `Start Gcode` add: + +```ini +SET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count] +``` + +* In `Layer change Gcode` add: + +```ini +SET_PRINT_STATS_INFO CURRENT_LAYER={layer_num + 1} +``` + +#### OrcaSlicer Layer Messages + +* Open OrcaSlicer +* Go to Prepare or Preview and in the printer section click `Edit Preset` > `Machine G-code` +* Add this to "Layer Change Gcode": ```ini M117 Layer {layer_num+1}/[total_layer_count] : {filament_settings_id[0]} ``` -![Layer_progress](img/quicktips/PS_SS_Layer_progress.png) +![Layer_progress](img/quicktips/OrcaSlicer-progress.png) -#### Cura -Install the extension: `Display Filename and Layer on LCD` -#### IdeaMaker -* Open IdeaMaker -* Got to: `Slice` > `Manage templates` > `Click on your template` > `Edit` -* Select the tab named `Gcode` > `Layer Change Gcode` -* Paste this: -```ini -M117 Layer {layer_index} / {total_layers} -``` diff --git a/docs/Troubleshooting/Touch_issues.md b/docs/Troubleshooting/Touch_issues.md index 08bcbd4ff..33c1b6be6 100644 --- a/docs/Troubleshooting/Touch_issues.md +++ b/docs/Troubleshooting/Touch_issues.md @@ -203,6 +203,20 @@ sudo reboot As an alternative **if the above doesn't work**: + determine the touchscreen driver (usually libinput): + + ```bash + cat /var/log/Xorg.0.log + ``` + + ```bash title="example of /var/log/Xorg.0.log" + ... + (II) Using input driver 'libinput' for 'ADS7846 Touchscreen' + ... + ``` + + if it says `evdev` instead, then change `libinput` to `evdev` below, both in the filename and in the file + ```bash sudo nano /usr/share/X11/xorg.conf.d/40-libinput.conf ``` @@ -216,6 +230,11 @@ sudo reboot Option "TransformationMatrix" "0 -1 1 1 0 0 0 0 1" EndSection ``` + + !!! note + the number of the filename determines the order of loading, if you have issues + check if there are other files overriding your config or just use 99-touch_calibration.conf as a name. + Close the nano editor using `ctrl`+`x` (exit), then `y` for yes (save). ```sh sudo reboot diff --git a/docs/VNC.md b/docs/VNC.md index 5d57fb8df..1fa0c2cb4 100644 --- a/docs/VNC.md +++ b/docs/VNC.md @@ -38,30 +38,15 @@ The host device could be for example a Raspberry Pi sudo systemctl restart KlipperScreen.service ``` -6. On KlipperScreen set the following configuration: - -Turn off DPMS and Display timeout: - -![disable_dpms_poweroff](img/disable_dpms_poweroff.png) - ## On the remote device: -1. Install a VNC viewer and configure it to the ip of the host. +Install a VNC viewer and configure it to the ip of the host. -???+ example "Example using an iPad" +??? example "Example using an iPad" #### Example using an iPad * Install a VNC viewer for example: `RealVNC Viewer: Remote Desktop` - ##### Prevent unwanted rotation of UI: - * Go to `Settings` > `General` > Set `Use side switch to` to `Lock Rotation` - ##### Avoid accidentally switching between apps: - * Go to `Restrictions` > Set passcode > Enable restrictions. - * Open - * Triple-click "Home" button - * Guided access pops up - * Press "Start" - * Now iPad is locked to VNC viewer until "Guided access" mode is disabled by triple-clicking "Home" button and entering the password. - ##### On the VNC viewer: + * Open the VNC viewer app * Press "+" button at the top right * Enter IP address of your print host. * Press "Save" @@ -71,4 +56,28 @@ Turn off DPMS and Display timeout: * VNC client will complain about unencrypted connection. Disable the warning and say "Connect" * Use or skip tutorial * Press the "Pin" icon to hide the panel. - * Enjoy! + ##### Prevent unwanted rotation of UI + * Go to `Settings` > `General` > Set `Use side switch to` to `Lock Rotation` + ##### Avoid accidentally switching between apps + * Go to `Restrictions` > Set passcode > Enable restrictions. + * Open + * Triple-click "Home" button + * Guided access pops up + * Press "Start" + * Now iPad is locked to VNC viewer until "Guided access" mode is disabled by triple-clicking "Home" button and entering the password. + +??? example "Example using an Android device" + #### Example using an Android device + * Install a VNC viewer for example: `RealVNC Viewer: Remote Desktop` + * Open the VNC viewer app + * Press "+" button at the right + * Enter IP address of your print host. + * Press "Save" + * Double-click on an icon with name or IP address you have just added. + * VNC client may complain about unencrypted connection. Disable the warning and say "Connect" + ##### Prevent unwanted rotation of UI + * Lock the rotation using the buttons in the notification bar or in device Settings > Screen > Disable "Rotate automatically" + +It's recommended to turn off DPMS and Display timeout: + +![disable_dpms_poweroff](img/disable_dpms_poweroff.png) diff --git a/docs/img/quicktips/OrcaSlicer-progress.png b/docs/img/quicktips/OrcaSlicer-progress.png new file mode 100644 index 000000000..3b800275f Binary files /dev/null and b/docs/img/quicktips/OrcaSlicer-progress.png differ diff --git a/docs/macros.md b/docs/macros.md index a0e81bd5e..706f16d2a 100644 --- a/docs/macros.md +++ b/docs/macros.md @@ -268,3 +268,22 @@ gcode: RESPOND TYPE=command MSG="action:prompt_show" ``` ![Prompt_2](img/macros/Prompt_2.png) + +## KlipperScreen actions + +!!! warning + this should be considered experimental + +Show a panel: +``` +RESPOND TYPE=command MSG="action:ks_show extrude" +``` + +Show a menu with items: + +!!! note + you need to escape double quotes because they are used by MSG + +``` +RESPOND TYPE=command MSG="action:ks_show menu items=[{'save': {'name': 'Home', 'icon': 'home', 'panel': None, 'method': 'printer.gcode.script', 'enable': 'True', 'params': '{\"script\": \"G28\"}', 'style': None, 'confirm': None}}]" +``` \ No newline at end of file diff --git a/ks_includes/KlippyGtk.py b/ks_includes/KlippyGtk.py index d5729ed5a..ecabc8071 100644 --- a/ks_includes/KlippyGtk.py +++ b/ks_includes/KlippyGtk.py @@ -2,6 +2,7 @@ import logging import os import pathlib + import gi gi.require_version("Gtk", "3.0") @@ -35,7 +36,6 @@ class KlippyGtk: def __init__(self, screen): self.screen = screen self.themedir = os.path.join(pathlib.Path(__file__).parent.resolve().parent, "styles", screen.theme, "images") - self.cursor = screen.show_cursor self.font_size_type = screen._config.get_main_config().get("font_size", "medium") self.width = screen.width self.height = screen.height @@ -180,7 +180,7 @@ def Button(self, image_name=None, label=None, style=None, scale=None, position=G format_label(b, lines) if style is not None: b.get_style_context().add_class(style) - b.connect("clicked", self.screen.reset_screensaver_timeout) + b.connect("clicked", self.screen.screensaver.reset_timeout) return b @staticmethod @@ -211,7 +211,7 @@ def Dialog(self, title, buttons, content, callback=None, *args): dialog = Gtk.Dialog(title=title, modal=True, transient_for=self.screen, default_width=self.width, default_height=self.height) dialog.set_size_request(self.width, self.height) - if not self.screen.windowed: + if not self.screen.get_resizable(): dialog.fullscreen() if buttons: @@ -237,7 +237,7 @@ def Dialog(self, title, buttons, content, callback=None, *args): dialog.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK) dialog.connect("button-release-event", self.remove_dialog) - dialog.connect("response", self.screen.reset_screensaver_timeout) + dialog.connect("response", self.screen.screensaver.reset_timeout) dialog.connect("response", callback, *args) dialog.get_style_context().add_class("dialog") @@ -250,20 +250,20 @@ def Dialog(self, title, buttons, content, callback=None, *args): dialog.show_all() # Change cursor to blank - if self.cursor: - dialog.get_window().set_cursor( - Gdk.Cursor.new_for_display(Gdk.Display.get_default(), Gdk.CursorType.ARROW)) - else: - dialog.get_window().set_cursor( - Gdk.Cursor.new_for_display(Gdk.Display.get_default(), Gdk.CursorType.BLANK_CURSOR)) + self.set_cursor(show=self.screen.show_cursor, window=dialog.get_window()) self.screen.dialogs.append(dialog) logging.info(f"Showing dialog {dialog.get_title()} {dialog.get_size()}") return dialog def remove_dialog(self, dialog, *args): + if not isinstance(dialog, Gtk.Dialog): + logging.error(f"Invalid dialog: {dialog}") + return if self.screen.updating: return + if dialog == self.screen.confirm: + self.screen.confirm = None dialog.destroy() if dialog in self.screen.dialogs: logging.info("Removing Dialog") @@ -274,3 +274,13 @@ def remove_dialog(self, dialog, *args): def ScrolledWindow(self, steppers=True, **kwargs): steppers = steppers and self.screen._config.get_main_config().getboolean("show_scroll_steppers", fallback=False) return CustomScrolledWindow(steppers, **kwargs) + + def set_cursor(self, show: bool, window: Gdk.Window): + if show: + window.set_cursor( + Gdk.Cursor.new_for_display(Gdk.Display.get_default(), Gdk.CursorType.ARROW)) + os.system("xsetroot -cursor_name arrow") + else: + window.set_cursor( + Gdk.Cursor.new_for_display(Gdk.Display.get_default(), Gdk.CursorType.BLANK_CURSOR)) + os.system("xsetroot -cursor ks_includes/emptyCursor.xbm ks_includes/emptyCursor.xbm") diff --git a/ks_includes/KlippyRest.py b/ks_includes/KlippyRest.py index edb1a8243..ca7da1283 100644 --- a/ks_includes/KlippyRest.py +++ b/ks_includes/KlippyRest.py @@ -1,18 +1,22 @@ import logging import re + import requests class KlippyRest: - def __init__(self, ip, port=7125, api_key=False): + def __init__(self, ip, port=7125, api_key=False, path='', ssl=None): self.ip = ip self.port = port + self.path = f"/{path}" if path else '' + self.ssl = ssl self.api_key = api_key + self.ssl = int(self.port) in {443, 7130} if ssl is None else bool(ssl) self.status = '' @property def endpoint(self): - return f"{'https' if int(self.port) in {443, 7130} else 'http'}://{self.ip}:{self.port}" + return f"{'https' if self.ssl else 'http'}://{self.ip}:{self.port}{self.path}" @staticmethod def process_response(response): diff --git a/ks_includes/KlippyWebsocket.py b/ks_includes/KlippyWebsocket.py index db6d04d14..f5e5cb575 100644 --- a/ks_includes/KlippyWebsocket.py +++ b/ks_includes/KlippyWebsocket.py @@ -1,8 +1,8 @@ #!/usr/bin/python -import threading import json import logging +import threading import gi import websocket @@ -20,7 +20,7 @@ class KlippyWebsocket(threading.Thread): reconnect_count = 0 max_retries = 4 - def __init__(self, callback, host, port, api_key): + def __init__(self, callback, host, port, api_key, path='', ssl=None): threading.Thread.__init__(self) self._wst = None self.ws_url = None @@ -30,16 +30,18 @@ def __init__(self, callback, host, port, api_key): self.closing = False self.host = host self.port = port + self.path = f"/{path}" if path else '' + self.ssl = int(self.port) in {443, 7130} if ssl is None else bool(ssl) self.header = {"x-api-key": api_key} if api_key else {} self.api_key = api_key @property def _url(self): - return f"{self.host}:{self.port}" + return f"{self.host}:{self.port}{self.path}" @property def ws_proto(self): - return "wss" if int(self.port) in {443, 7130} else "ws" + return "wss" if self.ssl else "ws" def initial_connect(self): if self.connect() is not False: diff --git a/ks_includes/config.py b/ks_includes/config.py index 28b1efd06..abc3fc964 100644 --- a/ks_includes/config.py +++ b/ks_includes/config.py @@ -1,13 +1,12 @@ import configparser +import copy import gettext -import os -import logging import json -import re -import copy -import pathlib import locale - +import logging +import os +import pathlib +import re from io import StringIO SCREEN_BLANKING_OPTIONS = [ @@ -98,6 +97,8 @@ def __init__(self, configfile, screen=None): {printer[8:]: { "moonraker_host": self.config.get(printer, "moonraker_host", fallback="127.0.0.1"), "moonraker_port": self.config.get(printer, "moonraker_port", fallback="7125"), + "moonraker_path": self.config.get(printer, "moonraker_path", fallback='').strip('/'), + "moonraker_ssl": self.config.getboolean(printer, "moonraker_ssl", fallback=None), "moonraker_api_key": self.config.get(printer, "moonraker_api_key", fallback="").replace('"', '') }} for printer in printers ] @@ -161,11 +162,12 @@ def validate_config(self, config, string="", remove=False): bools = ( 'invert_x', 'invert_y', 'invert_z', '24htime', 'only_heaters', 'show_cursor', 'confirm_estop', 'autoclose_popups', 'use_dpms', 'use_default_menu', 'side_macro_shortcut', 'use-matchbox-keyboard', - 'show_heater_power', "show_scroll_steppers", "auto_open_extrude" + 'show_heater_power', 'show_lock_button', "show_scroll_steppers", "auto_open_extrude" ) strs = ( 'default_printer', 'language', 'print_sort_dir', 'theme', 'screen_blanking_printing', 'font_size', 'print_estimate_method', 'screen_blanking', "screen_on_devices", "screen_off_devices", 'print_view', + "lock_password" ) numbers = ( 'job_complete_timeout', 'job_error_timeout', 'move_speed_xy', 'move_speed_z', @@ -173,10 +175,10 @@ def validate_config(self, config, string="", remove=False): ) elif section.startswith('printer '): bools = ( - 'invert_x', 'invert_y', 'invert_z', + 'invert_x', 'invert_y', 'invert_z', 'moonraker_ssl', ) strs = ( - 'moonraker_api_key', 'moonraker_host', 'titlebar_name_type', + 'moonraker_api_key', 'moonraker_host', 'moonraker_path', 'titlebar_name_type', 'screw_positions', 'power_devices', 'titlebar_items', 'z_babystep_values', 'extrude_distances', 'extrude_speeds', 'move_distances', 'zcalibrate_custom_commands' ) @@ -304,11 +306,16 @@ def _create_configurable_options(self, screen): {"show_heater_power": {"section": "main", "name": _("Show Heater Power"), "type": "binary", "tooltip": _("Current percentage and graph line"), "value": "False", "callback": screen.reload_panels}}, + {"show_lock_button": {"section": "main", "name": _("Show Lock Button"), "type": "binary", + "value": "False", "callback": screen.reload_panels}}, {"show_scroll_steppers": {"section": "main", "name": _("Show Scrollbars Buttons"), "type": "binary", "tooltip": _("Useful for un-responsive touchscreens"), "value": "False", "callback": screen.reload_panels}}, {"auto_open_extrude": {"section": "main", "name": _("Auto-open Extrude On Pause"), "type": "binary", "value": "True", "callback": screen.reload_panels}}, + {"show_cursor": {"section": "main", "name": _("Show cursor"), "type": "binary", + "tooltip": _("For mouse control or to verify touchscreen accuracy"), + "value": "False", "callback": screen.update_cursor}}, # {"": {"section": "main", "name": _(""), "type": ""}} ] @@ -576,17 +583,19 @@ def save_user_config_options(self): logging.error(f"Error writing configuration file in {filepath}:\n{e}") def set(self, section, name, value): - self.config.set(section, name, value) + self.config.set(section, name, str(value)) def log_config(self, config): + sensitive_keys = [ + r'(moonraker_api_key\s*(?:=|:)\s*)\S+', + r'(lock_password\s*(?:=|:)\s*)\S+', + ] + config_str = self._build_config_string(config) + for pattern in sensitive_keys: + config_str = re.sub(pattern, r'\1[redacted]', config_str) lines = [ - " " "===== Config File =====", - re.sub( - r'(moonraker_api_key\s*=\s*\S+)', - 'moonraker_api_key = [redacted]', - self._build_config_string(config) - ), + config_str, "=======================" ] logging.info("\n".join(lines)) diff --git a/ks_includes/files.py b/ks_includes/files.py index 00fbd7484..eab6c93e2 100644 --- a/ks_includes/files.py +++ b/ks_includes/files.py @@ -1,5 +1,6 @@ import logging import os + import gi gi.require_version("Gtk", "3.0") diff --git a/ks_includes/functions.py b/ks_includes/functions.py index aa97f1029..514921df2 100644 --- a/ks_includes/functions.py +++ b/ks_includes/functions.py @@ -1,17 +1,14 @@ +import ctypes import logging import logging.handlers import os -import re +import struct import subprocess import sys import threading -import time import traceback from queue import SimpleQueue as Queue -import ctypes -import struct - dpms_loaded = False try: ctypes.cdll.LoadLibrary('libXext.so.6') diff --git a/ks_includes/locales/KlipperScreen.pot b/ks_includes/locales/KlipperScreen.pot index 7f0afab5d..254378872 100644 --- a/ks_includes/locales/KlipperScreen.pot +++ b/ks_includes/locales/KlipperScreen.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -342,6 +342,9 @@ msgstr "" msgid "Font Size" msgstr "" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "" + msgid "Forget" msgstr "" @@ -366,9 +369,6 @@ msgstr "" msgid "Hide sensors in Temp." msgstr "" -msgid "Hide temp." -msgstr "" - msgid "Home" msgstr "" @@ -420,6 +420,9 @@ msgstr "" msgid "Invalid password" msgstr "" +msgid "Invalid temperature" +msgstr "" + msgid "Inversely affects the icon size" msgstr "" @@ -496,6 +499,9 @@ msgstr "" msgid "Loading..." msgstr "" +msgid "Lock" +msgstr "" + msgid "Lost Connection to Moonraker" msgstr "" @@ -626,9 +632,6 @@ msgstr "" msgid "Outdated by %d" msgstr "" -msgid "PSK for" -msgstr "" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "" @@ -637,6 +640,9 @@ msgstr[1] "" msgid "Part Fan" msgstr "" +msgid "Password" +msgstr "" + msgid "Password saved" msgstr "" @@ -803,6 +809,9 @@ msgstr "" msgid "Show Scrollbars Buttons" msgstr "" +msgid "Show cursor" +msgstr "" + msgid "Show only devices that are able to be set" msgstr "" @@ -872,6 +881,9 @@ msgstr "" msgid "Temperature" msgstr "" +msgid "Temperature too low to extrude" +msgstr "" + msgid "The system doesn't meet the minimum requirement" msgstr "" @@ -899,6 +911,12 @@ msgstr "" msgid "Unload" msgstr "" +msgid "Unlock" +msgstr "" + +msgid "Unlock failed" +msgstr "" + msgid "Unretract Extra Length" msgstr "" @@ -917,6 +935,9 @@ msgstr "" msgid "Useful for un-responsive touchscreens" msgstr "" +msgid "User" +msgstr "" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "" diff --git a/ks_includes/locales/ar/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/ar/LC_MESSAGES/KlipperScreen.mo index cf755b777..d69737faa 100644 Binary files a/ks_includes/locales/ar/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/ar/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/ar/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/ar/LC_MESSAGES/KlipperScreen.po index fdc8ebf6f..fbc2230fc 100644 --- a/ks_includes/locales/ar/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/ar/LC_MESSAGES/KlipperScreen.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" "PO-Revision-Date: 2024-08-14 14:09+0000\n" "Last-Translator: Rashid Al Haqbany \n" "Language-Team: Arabic , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: KlipperScreen\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-12-22 20:00+0000\n" +"Last-Translator: Niolay Danov \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10-dev\n" + +#, python-format +msgid "%s will be updated to version" +msgstr "%s ще бъде актуализиран до версия" + +msgid "(default)" +msgstr "(по подразбиране)" + +msgid "24 Hour Time" +msgstr "24 часово време" + +msgid "A FIRMWARE_RESTART may fix the issue." +msgstr "Рестартиране на фърмуера може да реши проблема." + +msgid "ADXL Not Configured" +msgstr "ADXL не е конфигуриран" + +msgid "Abort" +msgstr "Прекъсване" + +msgid "Acceleration:" +msgstr "Ускорение:" + +msgid "Accept" +msgstr "Приложи" + +msgid "Add profile" +msgstr "Добавете профил" + +msgid "All" +msgstr "Всички" + +msgid "Apply" +msgstr "Приложи" + +#, python-format +msgid "Apply %s%.3f offset to Endstop?" +msgstr "Да се ​​приложи ли отместване на %s%.3f към Endstop?" + +#, python-format +msgid "Apply %s%.3f offset to Probe?" +msgstr "Прилагане на %s%.3f отместване към сонда?" + +msgid "Archived" +msgstr "Архивирано" + +msgid "Are you sure do you want to exclude the object?" +msgstr "Сигурни ли сте, че искате да изключите обекта?" + +msgid "Are you sure you want to run Emergency Stop?" +msgstr "Сигурни ли сте, че искате да стартирате аварийно спиране?" + +msgid "Are you sure you wish to cancel this print?" +msgstr "Сигурни ли сте, че искате да отмените този печат?" + +msgid "Are you sure you wish to disable motors?" +msgstr "Сигурни ли сте, че искате да деактивирате двигателите?" + +msgid "Are you sure you wish to reboot the system?" +msgstr "Сигурни ли сте, че искате да рестартирате системата?" + +msgid "Are you sure you wish to shutdown the system?" +msgstr "Сигурни ли сте, че искате да изключите системата?" + +msgid "Asks for confirmation before stopping" +msgstr "Иска потвърждение преди спиране" + +msgid "Auto" +msgstr "Авто" + +msgid "Auto-calibrate" +msgstr "Автоматично калибриране" + +msgid "Auto-close notifications" +msgstr "Известия за автоматично затваряне" + +msgid "Auto-open Extrude On Pause" +msgstr "Автоматично отваряне на екструдиране при пауза" + +msgid "Auto-scroll" +msgstr "Автоматично превъртане" + +msgid "Bed Level" +msgstr "Ниво на леглото" + +msgid "Bed Mesh" +msgstr "Мрежа за легло" + +msgid "Both" +msgstr "И двете" + +msgid "Calibrate" +msgstr "Калибриране" + +msgid "Calibrated" +msgstr "Калибриран" + +msgid "Calibrating" +msgstr "Калибриране" + +msgid "Camera" +msgstr "Камера" + +msgid "Can't set above the maximum:" +msgstr "Не може да се зададе над максимума:" + +msgid "Cancel" +msgstr "Отказ" + +msgid "Cancel Print" +msgstr "Край на печата" + +msgid "Cancelled" +msgstr "Отменен" + +msgid "Cancelling" +msgstr "Отмяна" + +msgid "Cannot connect to Moonraker" +msgstr "Не може да се свърже с Moonraker" + +msgid "Changes how the interface looks" +msgstr "Променя начина, по който изглежда интерфейсът" + +msgid "Changes how the time remaining is calculated" +msgstr "Променя начина на изчисляване на оставащото време" + +msgid "Channel" +msgstr "Канал" + +msgid "Check ADXL Wiring" +msgstr "Проверете ADXL свързването" + +msgid "Checking for updates, please wait..." +msgstr "Проверява се за актуализации, моля изчакайте..." + +msgid "Clear" +msgstr "Изчисти" + +msgid "Close" +msgstr "Затваряне" + +msgid "Close messages after a timeout" +msgstr "Затваряне на съобщения след изчакване" + +msgid "Complete" +msgstr "Завършено" + +msgid "Confirm Emergency Stop" +msgstr "Потвърдете аварийно спиране" + +msgid "Connected" +msgstr "Свързан" + +msgid "Connecting" +msgstr "Свързване" + +#, python-format +msgid "Connecting to %s" +msgstr "Свързан с %s" + +msgid "Connection failed" +msgstr "Връзката е неуспешна" + +msgid "Console" +msgstr "Конзола" + +msgid "Cooldown" +msgstr "Охлади" + +msgid "Couldn't add network" +msgstr "Неуспешно добавяне на мрежа" + +msgid "Current" +msgstr "Текущ" + +msgid "Current percentage and graph line" +msgstr "Текущ процент и графика" + +msgid "DPMS has failed to load and has been disabled" +msgstr "DPMS не успя да се зареди и е деактивиран" + +msgid "Date" +msgstr "Дата" + +msgid "Delete" +msgstr "Изтриване" + +msgid "Delete Directory?" +msgstr "Изтриване на директория?" + +msgid "Delete File?" +msgstr "Изтрий файла?" + +msgid "Disable Motors" +msgstr "Изкл. моторите" + +msgid "Disable for 12hs with am / pm" +msgstr "Деактивирайте за 12 часа с am / pm" + +msgid "Disconnect" +msgstr "Прекъснете връзката" + +msgid "Distance (mm)" +msgstr "Растояние (mm)" + +#, python-format +msgid "Do you want to forget or disconnect %s?" +msgstr "Искате ли да забравите или да прекъснете връзката с %s?" + +#, python-format +msgid "Do you want to recover %s?" +msgstr "Искате ли да възстановите %s?" + +msgid "Elapsed:" +msgstr "Изминало:" + +msgid "Emergency Stop" +msgstr "Аварийно спиране" + +msgid "Enable screen power management" +msgstr "Активирайте управлението на захранването на екрана" + +msgid "Error" +msgstr "Грешка" + +msgid "Error clearing active spool" +msgstr "Грешка при изчистване на активния спул" + +msgid "Error getting active spool" +msgstr "Грешка при активиране на спула" + +msgid "Error setting active spool" +msgstr "Грешка при настройване на активен спул" + +msgid "Error trying to fetch spools" +msgstr "Грешка при опит за извличане на шпули" + +msgid "Error: Couldn't get a position to probe" +msgstr "Грешка: Не може да се намери позиция за сондиране" + +msgid "Estimated Time" +msgstr "Очаквано време" + +msgid "Estimated Time Method" +msgstr "Расчетно време" + +msgid "Example" +msgstr "Пример" + +msgid "Exclude Object" +msgstr "Изключване на обект" + +msgid "Extra Large" +msgstr "Много голям" + +msgid "Extrude" +msgstr "Екструзия" + +msgid "Extruders" +msgstr "Екструдери" + +msgid "Extrusion +" +msgstr "Екструзия +" + +msgid "Extrusion -" +msgstr "Екструзия -" + +msgid "Failed to delete connection" +msgstr "Неуспешно изтриване на връзката" + +msgid "Failed to initialize" +msgstr "Неуспешно инициализиране" + +msgid "Failed, adjust position first" +msgstr "Грешка. Първо сменете позицията" + +msgid "Fan" +msgstr "Охлаждане" + +msgid "Filament" +msgstr "Филамент" + +msgid "Filament Used" +msgstr "Използване на филамента" + +msgid "Filament total:" +msgstr "Общо нишка:" + +msgid "Filament used:" +msgstr "Използван филамент:" + +msgid "Filament:" +msgstr "Филамент:" + +msgid "File" +msgstr "Файл" + +msgid "File:" +msgstr "Файл:" + +msgid "Filter" +msgstr "Филтър" + +msgid "Finding ADXL" +msgstr "ADXL Търсене" + +msgid "Fine Tuning" +msgstr "Фина настройка" + +msgid "Finish" +msgstr "Край" + +msgid "Firmware Restart" +msgstr "Рестартиране на фърмуера" + +msgid "Flow:" +msgstr "Поток:" + +msgid "Flowrate:" +msgstr "Расход:" + +msgid "Font Size" +msgstr "Размер на шрифта" + +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "За управление с мишка или за проверка на точността на сензорния екран" + +msgid "Forget" +msgstr "Забравете" + +msgid "Full Update" +msgstr "Пълна актуализация" + +msgid "Gcodes" +msgstr "Gcodes" + +msgid "Getting IP address" +msgstr "Получаване на IP адрес" + +msgid "Go Back" +msgstr "Назад" + +msgid "Height:" +msgstr "Височина:" + +msgid "Hide" +msgstr "Скрий" + +msgid "Hide sensors in Temp." +msgstr "Скрий датчиците в Temp." + +msgid "Home" +msgstr "Паркирай X" + +msgid "Home All" +msgstr "Паркирай всички" + +msgid "Home X" +msgstr "Паркирай X" + +msgid "Home XY" +msgstr "Паркирай XY" + +msgid "Home Y" +msgstr "Паркирай Y" + +msgid "Home Z" +msgstr "Паркирай Z" + +msgid "Host" +msgstr "Хост" + +msgid "Hostname" +msgstr "Име на хоста" + +msgid "ID" +msgstr "ID" + +msgid "Icon Theme" +msgstr "Тема" + +msgid "Initializing printer..." +msgstr "Принтера стартира..." + +msgid "Initiate a PID calibration for:" +msgstr "Започнете PID калибриране за:" + +msgid "Input Shaper" +msgstr "Входен шейпер" + +msgid "Insufficient privileges" +msgstr "Недостатъчни привилегии" + +msgid "Interface" +msgstr "Интерфейс" + +msgid "Invalid" +msgstr "Неправилно" + +msgid "Invalid password" +msgstr "Грешна парола" + +msgid "Invalid temperature" +msgstr "Невалидна температура" + +msgid "Inversely affects the icon size" +msgstr "Обратно влияе върху размера на иконата" + +msgid "Invert X" +msgstr "Инверсиране X" + +msgid "Invert Y" +msgstr "Инверсиране Y" + +msgid "Invert Z" +msgstr "Инверсиране Z" + +msgid "It may take more than 5 minutes depending on the heater power." +msgstr "" +"Може да отнеме повече от 5 минути в зависимост от мощността на нагревателя." + +msgid "It's possible that the configuration is not correct" +msgstr "Възможно е конфигурацията да не е правилна" + +msgid "Job Status" +msgstr "Статус на работа" + +msgid "Klipper Restart" +msgstr "Klipper Рестарт" + +msgid "Klipper has disconnected" +msgstr "Няма връзка с Klipper" + +msgid "Klipper has encountered an error." +msgstr "Klipper откри грешка." + +msgid "Klipper has shutdown" +msgstr "Klipper се изключи" + +msgid "Klipper is attempting to start" +msgstr "Klipper е готов" + +msgid "Klipper will reboot" +msgstr "Klipper се рестартира" + +msgid "" +"LOAD_FILAMENT/UNLOAD_FILAMENT are hidden and should be used from extrude" +msgstr "" +"LOAD_FILAMENT/UNLOAD_FILAMENT са скрити и трябва да се използват от " +"екструдиране" + +msgid "Language" +msgstr "Език" + +msgid "Large" +msgstr "Голям" + +msgid "Last Duration" +msgstr "Ретракт" + +msgid "Last Used" +msgstr "Използване на филамента" + +msgid "Layer Height" +msgstr "Височина на слоя" + +msgid "Layer:" +msgstr "Слой:" + +msgid "Leds" +msgstr "LEDs" + +msgid "Left:" +msgstr "Остава:" + +msgid "Limits" +msgstr "Лимити" + +msgid "Load" +msgstr "Зареди" + +msgid "Loading..." +msgstr "Зареждане..." + +msgid "Lock" +msgstr "Заключване" + +msgid "Lost Connection to Moonraker" +msgstr "Не може да се свърже с Moonraker" + +msgid "Lower Nozzle" +msgstr "Спусни дюзата" + +msgid "Macro shortcut on sidebar" +msgstr "Покажи макроси в панела" + +msgid "Macros" +msgstr "Макроси" + +msgid "Main Menu" +msgstr "Главно меню" + +msgid "Material" +msgstr "Материал" + +msgid "Max" +msgstr "Макс" + +msgid "Max Acceleration" +msgstr "Максимално ускорение" + +msgid "Max Velocity" +msgstr "Скорост" + +msgid "Max:" +msgstr "Макс:" + +msgid "Maximum" +msgstr "Максимум" + +msgid "Measure Both" +msgstr "Измерете и двете" + +msgid "Measure X" +msgstr "Измерете X" + +msgid "Measure Y" +msgstr "Измерете Y" + +msgid "Medium" +msgstr "Средно" + +msgid "Memory" +msgstr "Памет" + +msgid "Menu" +msgstr "Меню" + +msgid "Minimum Cruise Ratio" +msgstr "Минимално круизно съотношение" + +msgid "Minimum:" +msgstr "Минимум:" + +msgid "Modified" +msgstr "Променено" + +msgid "Moonraker: connected" +msgstr "Moonraker: Свързан" + +msgid "More" +msgstr "Повече" + +msgid "Move" +msgstr "Ход" + +msgid "Move Distance (mm)" +msgstr "Дистанция на движение (мм)" + +msgid "Name" +msgstr "Име" + +msgid "Network" +msgstr "Мрежа" + +msgid "Network connected" +msgstr "Мрежата е свързана" + +msgid "Network disconnected" +msgstr "Няма връзка с мрежата" + +msgid "Network not found" +msgstr "Мрежата не е намерена" + +msgid "Never" +msgstr "Никога" + +msgid "New" +msgstr "Нов" + +msgid "No elegible macros:" +msgstr "Няма избираеми макроси:" + +msgid "No info available" +msgstr "Няма налична информация" + +msgid "No mesh has been loaded" +msgstr "Не е заредена мрежа" + +msgid "No wireless interface has been found" +msgstr "Не е открит безжичен интерфейс" + +msgid "Not all screens support this" +msgstr "Не всички екрани поддържат това" + +msgid "Not working or not configured" +msgstr "Не работи или не е конфигуриран" + +msgid "Nothing selected" +msgstr "Нищо не е избрано" + +msgid "Notification log empty" +msgstr "Дневникът на известията е празен" + +msgid "Notifications" +msgstr "Известия" + +msgid "Nozzle diameter" +msgstr "Диаметър на дюзата" + +msgid "Only for the move panel" +msgstr "Само за панела за движение" + +#, python-format +msgid "Outdated by %d" +msgstr "Остарял на %d" + +msgid "Package will be updated" +msgid_plural "Packages will be updated" +msgstr[0] "Пакета ще бъде обновен" +msgstr[1] "Пакетите ще бъдат обновени" + +msgid "Part Fan" +msgstr "Частичен вентилатор" + +msgid "Password" +msgstr "Паролата" + +msgid "Password saved" +msgstr "Паролата е записана" + +msgid "Pause" +msgstr "Пауза" + +msgid "Paused" +msgstr "Спряно" + +msgid "Perform a full upgrade?" +msgstr "Пълна актуализация?" + +msgid "Pins" +msgstr "Пинове" + +msgid "Please recompile and flash the micro-controller." +msgstr "Моля, прекомпилирайте и флашнете микроконтролера." + +msgid "Please wait" +msgstr "Моля изчакайте" + +msgid "Power" +msgstr "Изк. принтера" + +msgid "Power On Printer" +msgstr "Вкл. принтера" + +msgid "Pressure Advance" +msgstr "Предварително налягане" + +msgid "Pressure Advance:" +msgstr "Предварително налягане:" + +msgid "Pressure advance" +msgstr "Предварително налягане" + +msgid "Print" +msgstr "Печат" + +msgid "Print Control" +msgstr "Контрол на печата" + +msgid "Printer" +msgstr "Принтер" + +msgid "Printer Connections" +msgstr "Свързване на принтер" + +msgid "Printer Select" +msgstr "Избор на принтер" + +msgid "Printing" +msgstr "Печатане" + +msgid "Probe Offset" +msgstr "Отместване на сондата" + +msgid "Profile Name:" +msgstr "Име на профила:" + +msgid "Provide KlipperScreen.log when asking for help.\n" +msgstr "Осигурете KlipperScreen.log, когато поискате помощ.\n" + +msgid "Quad Gantry Level" +msgstr "Ниво Quad Gantry" + +msgid "Raise Nozzle" +msgstr "Повдигнете дюзата" + +msgid "Recover" +msgstr "Възстановяване" + +msgid "Recover Hard" +msgstr "Възстановяване Hard" + +msgid "Recover Soft" +msgstr "Възстановяване Soft" + +msgid "Reference" +msgstr "Връзка" + +msgid "Refresh" +msgstr "Опресняване" + +msgid "Remove network" +msgstr "Премахване на мрежата" + +msgid "Rename/Move:" +msgstr "Преименуване/Преместване:" + +msgid "Restart" +msgstr "Рестарт" + +msgid "Resume" +msgstr "Продължи" + +msgid "Retract" +msgstr "Ретракт" + +msgid "Retraction" +msgstr "Ретракт" + +msgid "Retraction Length" +msgstr "Дължина на ретракта" + +msgid "Retraction Speed" +msgstr "Скорост на ретракта" + +msgid "Retry" +msgstr "Повтори" + +msgid "Retrying" +msgstr "Повторен опит" + +msgid "Rotation invalid" +msgstr "Завъртането е невалидно" + +msgid "Save" +msgstr "Запиши" + +msgid "Save Config" +msgstr "Зап. Конфиг" + +msgid "Save Z" +msgstr "Запиши Z" + +msgid "Save configuration?" +msgstr "Запиши конфигурацията?" + +msgid "Saved" +msgstr "Записано" + +#, python-format +msgid "Saved offset: %s" +msgstr "Записан офсет: %s" + +msgid "Screen DPMS" +msgstr "Екран DPMS" + +msgid "Screen Power Off Time" +msgstr "Време за изключване на екрана" + +msgid "Screws Adjust" +msgstr "Настройки на винтовете" + +msgid "Screws not used:" +msgstr "Неизползвани винтове:" + +msgid "Send" +msgstr "Изпрати" + +msgid "Set Temp" +msgstr "Задайте температура" + +msgid "Settings" +msgstr "Настройки" + +msgid "Show" +msgstr "Покажи" + +msgid "Show Heater Power" +msgstr "Показване на мощността на нагревателя" + +msgid "Show Scrollbars Buttons" +msgstr "Показване на бутони за ленти за превъртане" + +msgid "Show cursor" +msgstr "Показване на курсора" + +msgid "Show only devices that are able to be set" +msgstr "Показване само на устройства, които могат да бъдат настроени" + +msgid "Shutdown" +msgstr "Изключване" + +msgid "Size" +msgstr "Размер" + +msgid "Slicer" +msgstr "Слайсер" + +msgid "Slicer:" +msgstr "Слайсер:" + +msgid "Small" +msgstr "Малък" + +msgid "Smooth time" +msgstr "Гладко време" + +msgid "Speed (mm/s)" +msgstr "Скорост (мм/с)" + +msgid "Speed +" +msgstr "Скорост +" + +msgid "Speed -" +msgstr "Скорост -" + +msgid "Speed:" +msgstr "Скорост:" + +msgid "Square Corner Velocity" +msgstr "Квадратна ъглова скорост" + +msgid "Standby" +msgstr "В режим на готовност" + +msgid "Start" +msgstr "Старт" + +msgid "Starting recovery for" +msgstr "Започнете възстановяване за" + +msgid "Starting update for" +msgstr "Стартиране на актуализация за" + +msgid "Swaps buttons if they are on top of each other, affects other panels" +msgstr "Разменя бутоните, ако са един върху друг, засяга други панели" + +msgid "System" +msgstr "Система" + +msgid "System Restart" +msgstr "Рестартиране на системата" + +msgid "System Shutdown" +msgstr "Изключване на системата" + +msgid "System:" +msgstr "Система:" + +msgid "Temp (°C)" +msgstr "Темп (°С)" + +msgid "Temperature" +msgstr "Tемпература" + +msgid "Temperature too low to extrude" +msgstr "Температурата е твърде ниска за екструдиране" + +msgid "The system doesn't meet the minimum requirement" +msgstr "Системата не отговаря на минималните изисквания" + +msgid "This panel supports up-to 9 screws in a 3x3 Grid" +msgstr "Този панел поддържа до 9 винта в мрежа 3x3" + +msgid "This will affect screw positions and mesh graph" +msgstr "Това ще повлияе на позициите на винтовете и графиката на мрежата" + +msgid "Timeout for screen black-out or power-off" +msgstr "Време за изчакване за затъмняване на екрана или изключване" + +msgid "Timeout for screen black-out or power-off during printing" +msgstr "" +"Изчакване за затъмняване на екрана или изключване на захранването по време " +"на печат" + +msgid "Total:" +msgstr "Всичко:" + +msgid "Unknown Heater" +msgstr "Неизвестен нагревател" + +msgid "Unknown security type" +msgstr "Неизвестен тип защита" + +msgid "Unload" +msgstr "Извади" + +msgid "Unlock" +msgstr "Отключи" + +msgid "Unlock failed" +msgstr "Отключването е неуспешно" + +msgid "Unretract Extra Length" +msgstr "Отмяна на прибиране на допълнителната дължина" + +msgid "Unretract Speed" +msgstr "Скорост на оттегляне" + +msgid "Up To Date" +msgstr "Актуално" + +msgid "Update" +msgstr "Обнови" + +msgid "Updating" +msgstr "Обновяване" + +msgid "Useful for un-responsive touchscreens" +msgstr "Полезно за неотзивчиви сензорни екрани" + +msgid "User" +msgstr "Потребител" + +msgid "WebRTC is not supported by the backend trying Stream" +msgstr "WebRTC не се поддържа от бекенда, опитващ Stream" + +msgid "Working" +msgstr "Работещ" + +msgid "XY Move Speed (mm/s)" +msgstr "Скорост по оси XY (мм/с)" + +msgid "XY Speed (mm/s)" +msgstr "XY скорост (mm/s)" + +msgid "Z Calibrate" +msgstr "Калибр. Z" + +msgid "Z Move Speed (mm/s)" +msgstr "Скорост по ос Z (мм/с)" + +msgid "Z Speed (mm/s)" +msgstr "Z скорост (mm/s)" + +msgid "Z Tilt" +msgstr "Z Наклон" + +msgid "Z offset:" +msgstr "Z отместване:" + +msgid "commit" +msgid_plural "commits" +msgstr[0] "промяна" +msgstr[1] "промяна" + +msgid "day" +msgid_plural "days" +msgstr[0] "ден" +msgstr[1] "дни" + +msgid "g" +msgstr "г" + +msgid "hour" +msgid_plural "hours" +msgstr[0] "час" +msgstr[1] "часа" + +msgid "macros that use 'rename_existing' are hidden" +msgstr "макросите, които използват 'rename_existing' са скрити" + +msgid "macros with a name starting with '_' are hidden" +msgstr "макросите с име, започващо с '_' са скрити" + +msgid "minute" +msgid_plural "minutes" +msgstr[0] "минута" +msgstr[1] "минути" + +msgid "mm" +msgstr "мм" + +msgid "mm/s" +msgstr "мм/с" + +msgid "mm/s²" +msgstr "мм/с²" + +msgid "mm³/s" +msgstr "мм³/s" + +msgid "s" +msgstr "с" + +msgid "second" +msgid_plural "seconds" +msgstr[0] "секунда" +msgstr[1] "секунди" + +#~ msgid "Hide temp." +#~ msgstr "Скрий температурата." + +#~ msgid "PSK for" +#~ msgstr "PSK за" + +#~ msgid "Actions" +#~ msgstr "Действия" + +#~ msgid "Bed screw configuration:" +#~ msgstr "Конфигурация на винта на леглото:" + +#~ msgid "Calibrated, save configuration to make it permanent" +#~ msgstr "Калибриран, запазете конфигурацията, за да стане постоянна" + +#~ msgid "Configuration" +#~ msgstr "Конфигурация" + +#~ msgid "Continue" +#~ msgstr "Продължи" + +#~ msgid "Decrease" +#~ msgstr "Намали" + +#~ msgid "Deselect" +#~ msgstr "Отмени" + +#~ msgid "Disable XY" +#~ msgstr "Изключи XY" + +#~ msgid "Hidden" +#~ msgstr "Скрит" + +#~ msgid "Homing" +#~ msgstr "Паркирай" + +#~ msgid "Increase" +#~ msgstr "Повдигане" + +#~ msgid "KlipperScreen will reboot" +#~ msgstr "KlipperScreen ще се рестартира" + +#~ msgid "Max Acceleration to Deceleration" +#~ msgstr "Ускорение на забавяне" + +#~ msgid "Mesh calibrate" +#~ msgstr "Калибриране на мрежата" + +#~ msgid "" +#~ "Not supported for auto-detection, it needs to be configured in " +#~ "klipperscreen.conf" +#~ msgstr "" +#~ "Не се поддържа за автоматично откриване, трябва да се конфигурира в " +#~ "klipperscreen.conf" + +#~ msgid "Print Time" +#~ msgstr "Време за печат" + +#~ msgid "Select" +#~ msgstr "Избери" + +#~ msgid "Sending Power ON signal to: %s" +#~ msgstr "Изпращане на сигнал за включване до: %s" + +#~ msgid "Slicer Time correction (%)" +#~ msgstr "Корекция на времето на слайсера (%)" + +#~ msgid "Starting WiFi Association" +#~ msgstr "Сдвояване" + +#~ msgid "Unknown screw position" +#~ msgstr "Неизвестна позиция на винта" + +#~ msgid "Uploaded" +#~ msgstr "Качено" + +#~ msgid "dBm" +#~ msgstr "dBm" diff --git a/ks_includes/locales/cs/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/cs/LC_MESSAGES/KlipperScreen.mo index 3c1ca710d..f85fdfeff 100644 Binary files a/ks_includes/locales/cs/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/cs/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/cs/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/cs/LC_MESSAGES/KlipperScreen.po index b78a04e68..01506008d 100644 --- a/ks_includes/locales/cs/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/cs/LC_MESSAGES/KlipperScreen.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: Czech\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-06-29 06:09+0000\n" -"Last-Translator: Miloslav Kos \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-11-27 21:00+0000\n" +"Last-Translator: Michal Bitala \n" "Language-Team: Czech \n" "Language: cs\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.9-dev\n" #, python-format msgid "%s will be updated to version" @@ -343,6 +343,9 @@ msgstr "Rychlost toku:" msgid "Font Size" msgstr "Velikost fontu" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "ro ovládání myší nebo ověření přesnosti dotykového displeje" + msgid "Forget" msgstr "Zapomenout" @@ -367,9 +370,6 @@ msgstr "Skrýt" msgid "Hide sensors in Temp." msgstr "Skrýt senzory v Temp." -msgid "Hide temp." -msgstr "Skrýt teplotu" - msgid "Home" msgstr "Domů" @@ -421,6 +421,9 @@ msgstr "Špatně" msgid "Invalid password" msgstr "Špatné heslo" +msgid "Invalid temperature" +msgstr "Chybná teplota" + msgid "Inversely affects the icon size" msgstr "Inverzně ovlivňuje velikost ikony" @@ -498,6 +501,9 @@ msgstr "Zasuň" msgid "Loading..." msgstr "Načítání...." +msgid "Lock" +msgstr "Uzamknout" + msgid "Lost Connection to Moonraker" msgstr "Ztracené spojení s Moonrakerem" @@ -628,9 +634,6 @@ msgstr "Pouze pro panel pohybů" msgid "Outdated by %d" msgstr "Zastaralý %d" -msgid "PSK for" -msgstr "PSK pro" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "Balíček bude aktualizován" @@ -640,6 +643,9 @@ msgstr[2] "Balíčky budou aktualizovány" msgid "Part Fan" msgstr "Částečný ofuk" +msgid "Password" +msgstr "Heslo" + msgid "Password saved" msgstr "Heslo uloženo" @@ -806,6 +812,9 @@ msgstr "Ukaž odběr topení" msgid "Show Scrollbars Buttons" msgstr "Ukaž rolovací tlačítka" +msgid "Show cursor" +msgstr "Zobrazit kurzor" + msgid "Show only devices that are able to be set" msgstr "Zobrazit pouze zařízení, která lze nastavit" @@ -875,6 +884,9 @@ msgstr "Teplota (°C)" msgid "Temperature" msgstr "Teplota" +msgid "Temperature too low to extrude" +msgstr "Příliš nízká teplota pro extruzi" + msgid "The system doesn't meet the minimum requirement" msgstr "Systém nesplňuje minimální požadavky" @@ -902,6 +914,12 @@ msgstr "Neznámý typ zabezpečení" msgid "Unload" msgstr "Vysuň" +msgid "Unlock" +msgstr "Odemknout" + +msgid "Unlock failed" +msgstr "Odemknutí selhalo" + msgid "Unretract Extra Length" msgstr "Vysuň extra délku" @@ -920,6 +938,9 @@ msgstr "Aktualizuji" msgid "Useful for un-responsive touchscreens" msgstr "Užitečné pro nereagující dotykové obrazovky" +msgid "User" +msgstr "Uživatel" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC není podporováno backendem, který se pokouší spustit Stream" @@ -1001,6 +1022,12 @@ msgstr[0] "sekunda" msgstr[1] "sekundy" msgstr[2] "sekundy" +#~ msgid "Hide temp." +#~ msgstr "Skrýt teplotu" + +#~ msgid "PSK for" +#~ msgstr "PSK pro" + #~ msgid "Are you sure you want to stop the calibration?" #~ msgstr "Opravdu chcete kalibraci zastavit?" diff --git a/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.mo index b2feedf06..7db61a521 100644 Binary files a/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.po index 588ab8c78..0b054d8f8 100644 --- a/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/da/LC_MESSAGES/KlipperScreen.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" "PO-Revision-Date: 2024-07-03 13:59+0000\n" "Last-Translator: srbjessen \n" "Language-Team: Danish \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2025-01-13 18:53+0000\n" +"Last-Translator: Eduard Iten \n" "Language-Team: German \n" "Language: de\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.10-dev\n" #, python-format msgid "%s will be updated to version" @@ -143,7 +143,7 @@ msgid "Changes how the interface looks" msgstr "Ändert das Aussehen der Benutzeroberfläche" msgid "Changes how the time remaining is calculated" -msgstr "Ändert die Berechnungsweiße der Restzeit" +msgstr "Ändert, wie die verbleibende Zeit berechnet wird" msgid "Channel" msgstr "Kanal" @@ -343,6 +343,9 @@ msgstr "Flussrate:" msgid "Font Size" msgstr "Schriftgröße" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "Für Maus Kontroller oder um Touchscreen Genauigkeit zu überprüfen" + msgid "Forget" msgstr "Vergessen" @@ -367,9 +370,6 @@ msgstr "Verstecken" msgid "Hide sensors in Temp." msgstr "Sensoren in Temp ausblenden." -msgid "Hide temp." -msgstr "Temp. ausblenden" - msgid "Home" msgstr "Grundposition" @@ -421,6 +421,9 @@ msgstr "Ungültig" msgid "Invalid password" msgstr "Ungültiges Passwort" +msgid "Invalid temperature" +msgstr "Ungültige Temperatur" + msgid "Inversely affects the icon size" msgstr "Beeinflusst die Symbolgröße umgekehrt" @@ -499,6 +502,9 @@ msgstr "Laden" msgid "Loading..." msgstr "Lädt..." +msgid "Lock" +msgstr "Sperren" + msgid "Lost Connection to Moonraker" msgstr "Verbindung zu Moonraker verloren" @@ -629,9 +635,6 @@ msgstr "Nur für das Bewegungspanel" msgid "Outdated by %d" msgstr "Veraltet von %d" -msgid "PSK for" -msgstr "PSK für" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "Paket wird aktualisiert" @@ -640,6 +643,9 @@ msgstr[1] "Pakete werden aktualisiert" msgid "Part Fan" msgstr "Bauteil Lüfter" +msgid "Password" +msgstr "Passwort" + msgid "Password saved" msgstr "Passwort gespeichert" @@ -806,6 +812,9 @@ msgstr "Heizleistung anzeigen" msgid "Show Scrollbars Buttons" msgstr "Zeige Scrollbar Schaltfläche" +msgid "Show cursor" +msgstr "Cursor anzeigen" + msgid "Show only devices that are able to be set" msgstr "Zeige nur Geräte die eingestellt werden können" @@ -824,9 +833,8 @@ msgstr "Slicer:" msgid "Small" msgstr "Klein" -#, fuzzy msgid "Smooth time" -msgstr "Smooth time" +msgstr "Erweichungsdauer" msgid "Speed (mm/s)" msgstr "Geschwindigkeit (mm/s)" @@ -878,6 +886,9 @@ msgstr "Temp (°C)" msgid "Temperature" msgstr "Temperatur" +msgid "Temperature too low to extrude" +msgstr "Temperatur zu niedrig zum extrudieren" + msgid "The system doesn't meet the minimum requirement" msgstr "Das System erfüllt die minimalen Anforderungen nicht" @@ -905,6 +916,12 @@ msgstr "Unbekannter Sicherheitstyp" msgid "Unload" msgstr "Entladen" +msgid "Unlock" +msgstr "Entsperren" + +msgid "Unlock failed" +msgstr "Entsperren fehlgeschlagen" + msgid "Unretract Extra Length" msgstr "Überlänge ausfahren" @@ -925,11 +942,14 @@ msgstr "Aktualisiere" msgid "Useful for un-responsive touchscreens" msgstr "Nützlich für nicht reagierende Touchscreens" +msgid "User" +msgstr "Benutzer" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC wird vom Backend nicht unterstützt" msgid "Working" -msgstr "" +msgstr "Arbeitet" msgid "XY Move Speed (mm/s)" msgstr "XY Bewegungsgeschwindigkeit (mm/s)" @@ -1001,6 +1021,12 @@ msgid_plural "seconds" msgstr[0] "sekunde" msgstr[1] "sekunden" +#~ msgid "Hide temp." +#~ msgstr "Temp. ausblenden" + +#~ msgid "PSK for" +#~ msgstr "PSK für" + #~ msgid "Are you sure you want to stop the calibration?" #~ msgstr "Kalibrierung wirklich abbrechen?" diff --git a/ks_includes/locales/de_formal/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/de_formal/LC_MESSAGES/KlipperScreen.mo index 77690eb5c..e1a2a788a 100644 Binary files a/ks_includes/locales/de_formal/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/de_formal/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/de_formal/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/de_formal/LC_MESSAGES/KlipperScreen.po index b98d1841c..6c3a535e3 100644 --- a/ks_includes/locales/de_formal/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/de_formal/LC_MESSAGES/KlipperScreen.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-07-12 00:09+0000\n" -"Last-Translator: Flo082002 \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-09-07 00:09+0000\n" +"Last-Translator: Leart Dukaj \n" "Language-Team: German \n" "Language: de_formal\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.8-dev\n" #, python-format msgid "%s will be updated to version" @@ -55,11 +55,11 @@ msgstr "Anwenden" #, python-format msgid "Apply %s%.3f offset to Endstop?" -msgstr "%s%.3f Offset auf Endstop anwenden" +msgstr "%s%.3f Offset auf Endstop anwenden?" #, python-format msgid "Apply %s%.3f offset to Probe?" -msgstr "%s%.3f Offset auf Probe anwenden" +msgstr "%s%.3f Offset auf Probe anwenden?" msgid "Archived" msgstr "Archiviert" @@ -83,7 +83,7 @@ msgid "Are you sure you wish to shutdown the system?" msgstr "Möchten Sie das System wirklich herunterfahren?" msgid "Asks for confirmation before stopping" -msgstr "" +msgstr "Bittet sie vor dem aufhören um Bestätigung" msgid "Auto" msgstr "Auto" @@ -95,7 +95,7 @@ msgid "Auto-close notifications" msgstr "Benachrichtigungen automatisch schließen" msgid "Auto-open Extrude On Pause" -msgstr "" +msgstr "Extrudieren bei Pause automatisch öffnen" msgid "Auto-scroll" msgstr "Auto-scroll" @@ -140,7 +140,7 @@ msgid "Cannot connect to Moonraker" msgstr "Es kann keine Verbindung zu Moonraker hergestellt werden" msgid "Changes how the interface looks" -msgstr "" +msgstr "Ändert das Aussehen der Oberfläche" msgid "Changes how the time remaining is calculated" msgstr "Verändert, wie die verbleibende Zeit berechnet wird" @@ -161,7 +161,7 @@ msgid "Close" msgstr "Schließen" msgid "Close messages after a timeout" -msgstr "" +msgstr "Schließe Nachrichten nach einer bestimmten Zeit" msgid "Complete" msgstr "Fertiggestellt" @@ -189,13 +189,13 @@ msgid "Cooldown" msgstr "Abkühlen" msgid "Couldn't add network" -msgstr "" +msgstr "Netzwerk konnte nicht hinzugefügt werden" msgid "Current" -msgstr "" +msgstr "Aktuell" msgid "Current percentage and graph line" -msgstr "" +msgstr "Momentane Prozent und Diagramm Linie" msgid "DPMS has failed to load and has been disabled" msgstr "DPMS konnte nicht geladen werden und wurde deaktiviert" @@ -216,7 +216,7 @@ msgid "Disable Motors" msgstr "Motoren deaktivieren" msgid "Disable for 12hs with am / pm" -msgstr "" +msgstr "Deaktivieren für 12h Anzeige mit AM/PM" msgid "Disconnect" msgstr "Trennen" @@ -226,7 +226,7 @@ msgstr "Entfernung (mm)" #, python-format msgid "Do you want to forget or disconnect %s?" -msgstr "" +msgstr "Wollen Sie %s vergessen oder trennen?" #, python-format msgid "Do you want to recover %s?" @@ -236,31 +236,31 @@ msgid "Elapsed:" msgstr "Laufzeit:" msgid "Emergency Stop" -msgstr "" +msgstr "Notausschalter" msgid "Enable screen power management" -msgstr "" +msgstr "Bildschirm Energieverwaltung aktivieren" msgid "Error" msgstr "Fehler" msgid "Error clearing active spool" -msgstr "" +msgstr "Fehler beim Leeren der aktiven Spule" msgid "Error getting active spool" -msgstr "" +msgstr "Fehler beim Abrufen der aktiven Spule" msgid "Error setting active spool" -msgstr "" +msgstr "Fehler beim Einstellen der aktiven Spule" msgid "Error trying to fetch spools" -msgstr "" +msgstr "Fehler beim Abrufen der Spulen" msgid "Error: Couldn't get a position to probe" -msgstr "" +msgstr "Fehler: Es konnte keine Position zum Abtasten ermittelt werden" msgid "Estimated Time" -msgstr "" +msgstr "Geschätzte Zeit" msgid "Estimated Time Method" msgstr "Verbleibende Zeit" @@ -287,10 +287,10 @@ msgid "Extrusion -" msgstr "Extrudieren -" msgid "Failed to delete connection" -msgstr "" +msgstr "Löschen der Verbindung fehlgeschlagen" msgid "Failed to initialize" -msgstr "" +msgstr "Initialisierung fehlgeschlagen" msgid "Failed, adjust position first" msgstr "Fehlgeschlagen, Position zuerst anpassen" @@ -343,17 +343,20 @@ msgstr "Flussrate:" msgid "Font Size" msgstr "Schriftgröße" -msgid "Forget" +msgid "For mouse control or to verify touchscreen accuracy" msgstr "" +msgid "Forget" +msgstr "Vergessen" + msgid "Full Update" msgstr "Vollständige Update" msgid "Gcodes" -msgstr "" +msgstr "Gcodes" msgid "Getting IP address" -msgstr "" +msgstr "Rufe IP Adresse ab" msgid "Go Back" msgstr "Zurück" @@ -367,9 +370,6 @@ msgstr "Verstecken" msgid "Hide sensors in Temp." msgstr "Sensoren in Temp ausblenden." -msgid "Hide temp." -msgstr "Temperatur ausblenden" - msgid "Home" msgstr "Grundposition" @@ -410,7 +410,7 @@ msgid "Input Shaper" msgstr "Input Shaper" msgid "Insufficient privileges" -msgstr "" +msgstr "Unzureichende Rechte" msgid "Interface" msgstr "Oberfläche" @@ -421,9 +421,12 @@ msgstr "Ungültig" msgid "Invalid password" msgstr "Ungültiges Passwort" -msgid "Inversely affects the icon size" +msgid "Invalid temperature" msgstr "" +msgid "Inversely affects the icon size" +msgstr "Beeinflusst die Symbolgröße umgekehrt" + msgid "Invert X" msgstr "Achse X invertieren" @@ -437,10 +440,10 @@ msgid "It may take more than 5 minutes depending on the heater power." msgstr "Je nach Leistung der Heizung kann dies mehr als 5 Minuten dauern." msgid "It's possible that the configuration is not correct" -msgstr "" +msgstr "Es ist möglich, dass die Konfiguration nicht richtig ist" msgid "Job Status" -msgstr "" +msgstr "Auftragsstatus" msgid "Klipper Restart" msgstr "Klipper Neustart" @@ -473,7 +476,7 @@ msgid "Large" msgstr "Groß" msgid "Last Duration" -msgstr "" +msgstr "Letze Dauer" msgid "Last Used" msgstr "Zuletzt verwendet" @@ -485,7 +488,7 @@ msgid "Layer:" msgstr "Schicht:" msgid "Leds" -msgstr "" +msgstr "LEDs" msgid "Left:" msgstr "Restzeit:" @@ -499,6 +502,9 @@ msgstr "Laden" msgid "Loading..." msgstr "Laden..." +msgid "Lock" +msgstr "" + msgid "Lost Connection to Moonraker" msgstr "Verbindung zu Moonraker verloren" @@ -545,13 +551,13 @@ msgid "Medium" msgstr "Mittel" msgid "Memory" -msgstr "" +msgstr "Speicher" msgid "Menu" msgstr "Menü" msgid "Minimum Cruise Ratio" -msgstr "" +msgstr "Minimales Cruiseverhältnis" msgid "Minimum:" msgstr "Minimum:" @@ -581,7 +587,7 @@ msgid "Network connected" msgstr "Netzwerk verbunden" msgid "Network disconnected" -msgstr "" +msgstr "Netzwerk getrennt" msgid "Network not found" msgstr "Netzwerk nicht gefunden" @@ -596,19 +602,19 @@ msgid "No elegible macros:" msgstr "Keine wählbaren Makros:" msgid "No info available" -msgstr "Keine Informationen verfügbar." +msgstr "Keine Informationen verfügbar" msgid "No mesh has been loaded" -msgstr "" +msgstr "Es wurde kein Netz geladen" msgid "No wireless interface has been found" -msgstr "" +msgstr "Es wurde keine drahtlose Schnittstelle gefunden" msgid "Not all screens support this" -msgstr "" +msgstr "Nicht alle Bildschirme unterstützen das" msgid "Not working or not configured" -msgstr "" +msgstr "Nicht funktionsfähig oder nicht konfiguriert" msgid "Nothing selected" msgstr "Nichts ausgewählt" @@ -623,15 +629,12 @@ msgid "Nozzle diameter" msgstr "Düsendurchmesser" msgid "Only for the move panel" -msgstr "" +msgstr "Nur für das Bewegungspanel" #, python-format msgid "Outdated by %d" msgstr "Veraltet von %d" -msgid "PSK for" -msgstr "PSK für" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "Paket wird aktualisiert" @@ -640,6 +643,9 @@ msgstr[1] "Pakete werden aktualisiert" msgid "Part Fan" msgstr "Bauteil Lüfter" +msgid "Password" +msgstr "" + msgid "Password saved" msgstr "Passwort gespeichert" @@ -674,7 +680,7 @@ msgid "Pressure Advance:" msgstr "Druckvorlauf:" msgid "Pressure advance" -msgstr "" +msgstr "Pressure advance" msgid "Print" msgstr "Druck" @@ -701,10 +707,10 @@ msgid "Profile Name:" msgstr "Profilname:" msgid "Provide KlipperScreen.log when asking for help.\n" -msgstr "" +msgstr "Wenn Hilfe benötigt wird KlipperScreen.log angeben\n" msgid "Quad Gantry Level" -msgstr "Quad Gantry Level" +msgstr "Vierfache Nivellierung" msgid "Raise Nozzle" msgstr "Düse anheben" @@ -755,7 +761,7 @@ msgid "Retrying" msgstr "Wiederhole" msgid "Rotation invalid" -msgstr "" +msgstr "Drehung ungültig" msgid "Save" msgstr "Speichern" @@ -786,7 +792,7 @@ msgid "Screws Adjust" msgstr "Schrauben Einstellen" msgid "Screws not used:" -msgstr "" +msgstr "nicht genutzte Schrauben:" msgid "Send" msgstr "Senden" @@ -806,9 +812,12 @@ msgstr "Heizleistung anzeigen" msgid "Show Scrollbars Buttons" msgstr "Zeige Scrollbar Schaltfläche" -msgid "Show only devices that are able to be set" +msgid "Show cursor" msgstr "" +msgid "Show only devices that are able to be set" +msgstr "Zeige nur Geräte die eingestellt werden können" + msgid "Shutdown" msgstr "Ausschalten" @@ -825,7 +834,7 @@ msgid "Small" msgstr "Klein" msgid "Smooth time" -msgstr "" +msgstr "Erweichungsdauer" msgid "Speed (mm/s)" msgstr "Geschwindigkeit (mm/s)" @@ -856,6 +865,8 @@ msgstr "Starte Update für" msgid "Swaps buttons if they are on top of each other, affects other panels" msgstr "" +"Vertauscht Tasten, wenn sie übereinander liegen, wirkt sich auf andere " +"Bedienfelder aus" msgid "System" msgstr "System" @@ -875,20 +886,23 @@ msgstr "Temp (°C)" msgid "Temperature" msgstr "Temperatur" +msgid "Temperature too low to extrude" +msgstr "" + msgid "The system doesn't meet the minimum requirement" msgstr "Das System entspricht nicht den Mindestanforderungen" msgid "This panel supports up-to 9 screws in a 3x3 Grid" -msgstr "" +msgstr "Dieses Panel unterstützt bis zu 9 Schrauben in einem 3x3 Raster" msgid "This will affect screw positions and mesh graph" -msgstr "" +msgstr "Dies wirkt sich auf die Schraubenpositionen und das Netzdiagramm aus" msgid "Timeout for screen black-out or power-off" -msgstr "" +msgstr "Timeout für dunklen oder ausgeschalteten Bildschirm" msgid "Timeout for screen black-out or power-off during printing" -msgstr "" +msgstr "Timeout für dunklen oder ausgeschalteten Bildschirm während dem Druck" msgid "Total:" msgstr "Gesamt:" @@ -897,11 +911,17 @@ msgid "Unknown Heater" msgstr "Unbekannte Heizung" msgid "Unknown security type" -msgstr "" +msgstr "Unbekannter Sicherheitstyp" msgid "Unload" msgstr "Entladen" +msgid "Unlock" +msgstr "" + +msgid "Unlock failed" +msgstr "" + msgid "Unretract Extra Length" msgstr "Überlänge ausfahren" @@ -920,13 +940,16 @@ msgid "Updating" msgstr "Aktualisiere" msgid "Useful for un-responsive touchscreens" +msgstr "Nützlich für nicht reagierende Touchscreens" + +msgid "User" msgstr "" msgid "WebRTC is not supported by the backend trying Stream" -msgstr "" +msgstr "WebRTC wird vom Backend nicht unterstützt" msgid "Working" -msgstr "" +msgstr "Arbeitet" msgid "XY Move Speed (mm/s)" msgstr "XY Bewegungsgeschwindigkeit (mm/s)" @@ -998,6 +1021,12 @@ msgid_plural "seconds" msgstr[0] "Sekunde" msgstr[1] "Sekunden" +#~ msgid "Hide temp." +#~ msgstr "Temperatur ausblenden" + +#~ msgid "PSK for" +#~ msgstr "PSK für" + #~ msgid "Mesh calibrate" #~ msgstr "Mesh kalibrieren" diff --git a/ks_includes/locales/en/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/en/LC_MESSAGES/KlipperScreen.po index 84c108fb2..742965fe9 100644 --- a/ks_includes/locales/en/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/en/LC_MESSAGES/KlipperScreen.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -337,6 +337,9 @@ msgstr "" msgid "Font Size" msgstr "" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "" + msgid "Forget" msgstr "" @@ -361,9 +364,6 @@ msgstr "" msgid "Hide sensors in Temp." msgstr "" -msgid "Hide temp." -msgstr "" - msgid "Home" msgstr "" @@ -415,6 +415,9 @@ msgstr "" msgid "Invalid password" msgstr "" +msgid "Invalid temperature" +msgstr "" + msgid "Inversely affects the icon size" msgstr "" @@ -491,6 +494,9 @@ msgstr "" msgid "Loading..." msgstr "" +msgid "Lock" +msgstr "" + msgid "Lost Connection to Moonraker" msgstr "" @@ -621,9 +627,6 @@ msgstr "" msgid "Outdated by %d" msgstr "" -msgid "PSK for" -msgstr "" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "" @@ -632,6 +635,9 @@ msgstr[1] "" msgid "Part Fan" msgstr "" +msgid "Password" +msgstr "" + msgid "Password saved" msgstr "" @@ -798,6 +804,9 @@ msgstr "" msgid "Show Scrollbars Buttons" msgstr "" +msgid "Show cursor" +msgstr "" + msgid "Show only devices that are able to be set" msgstr "" @@ -867,6 +876,9 @@ msgstr "" msgid "Temperature" msgstr "" +msgid "Temperature too low to extrude" +msgstr "" + msgid "The system doesn't meet the minimum requirement" msgstr "" @@ -894,6 +906,12 @@ msgstr "" msgid "Unload" msgstr "" +msgid "Unlock" +msgstr "" + +msgid "Unlock failed" +msgstr "" + msgid "Unretract Extra Length" msgstr "" @@ -912,6 +930,9 @@ msgstr "" msgid "Useful for un-responsive touchscreens" msgstr "" +msgid "User" +msgstr "" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "" diff --git a/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.mo index b54864236..5a66de41e 100644 Binary files a/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.po index 491482a59..23a652e94 100644 --- a/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/es/LC_MESSAGES/KlipperScreen.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-07-12 00:09+0000\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-12-02 18:00+0000\n" "Last-Translator: Radiotbo \n" "Language-Team: Spanish \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.9-dev\n" #, python-format msgid "%s will be updated to version" @@ -343,6 +343,9 @@ msgstr "Tasa de Flujo:" msgid "Font Size" msgstr "Tamaño del texto" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "Para controlar el ratón o verificar la precisión de la pantalla táctil" + msgid "Forget" msgstr "Olvidar" @@ -367,9 +370,6 @@ msgstr "Ocultar" msgid "Hide sensors in Temp." msgstr "Ocultar sensores en Temp." -msgid "Hide temp." -msgstr "Ocultar temp." - msgid "Home" msgstr "Inicio" @@ -421,6 +421,9 @@ msgstr "Invalido" msgid "Invalid password" msgstr "Contraseña invalida" +msgid "Invalid temperature" +msgstr "Temperatura incorrecta" + msgid "Inversely affects the icon size" msgstr "Afecta inversamente al tamaño del icono" @@ -500,8 +503,11 @@ msgstr "Cargar" msgid "Loading..." msgstr "Cargando..." +msgid "Lock" +msgstr "Bloquear" + msgid "Lost Connection to Moonraker" -msgstr "Conexión perdida a Moonraker" +msgstr "Conexión perdida con Moonraker" msgid "Lower Nozzle" msgstr "Bajar Boquilla" @@ -630,9 +636,6 @@ msgstr "Solo para el panel de movimiento" msgid "Outdated by %d" msgstr "Desactualizado por %d" -msgid "PSK for" -msgstr "PSK para" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "Paquete será actualizado" @@ -641,6 +644,9 @@ msgstr[1] "Paquetes serán actualizados" msgid "Part Fan" msgstr "Ventilador de parte" +msgid "Password" +msgstr "Contraseña" + msgid "Password saved" msgstr "Contraseña guardada" @@ -807,6 +813,9 @@ msgstr "Mostrar potencia del calentador" msgid "Show Scrollbars Buttons" msgstr "Mostrar botones de desplazamiento" +msgid "Show cursor" +msgstr "Mostrar cursor" + msgid "Show only devices that are able to be set" msgstr "Mostrar solo los dispositivos que se pueden configurar" @@ -877,6 +886,9 @@ msgstr "Temp (°C)" msgid "Temperature" msgstr "Temperatura" +msgid "Temperature too low to extrude" +msgstr "Temperatura muy baja para extruir" + msgid "The system doesn't meet the minimum requirement" msgstr "El sistema no cumple con los requisitos mínimos" @@ -884,7 +896,7 @@ msgid "This panel supports up-to 9 screws in a 3x3 Grid" msgstr "Este panel soporta hasta 9 tornillos en una grilla 3x3" msgid "This will affect screw positions and mesh graph" -msgstr "Esto afectará la posición de los tornillos y el gráfico de malla" +msgstr "Afectará la posición de los tornillos y el gráfico de malla" msgid "Timeout for screen black-out or power-off" msgstr "Tiempo hasta apagar u oscurecer la pantalla" @@ -906,6 +918,12 @@ msgstr "Tipo de seguridad desconocido" msgid "Unload" msgstr "Descargar" +msgid "Unlock" +msgstr "Desbloquear" + +msgid "Unlock failed" +msgstr "Desbloqueo fallido" + msgid "Unretract Extra Length" msgstr "Distancia extra al desretraer" @@ -924,6 +942,9 @@ msgstr "Actualizando" msgid "Useful for un-responsive touchscreens" msgstr "Útil para pantallas táctiles poco responsivas" +msgid "User" +msgstr "Usuario" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC no es soportado por el backend intentando con Stream" @@ -1000,6 +1021,12 @@ msgid_plural "seconds" msgstr[0] "segundo" msgstr[1] "segundos" +#~ msgid "Hide temp." +#~ msgstr "Ocultar temp." + +#~ msgid "PSK for" +#~ msgstr "PSK para" + #~ msgid "Are you sure you want to stop the calibration?" #~ msgstr "¿Está seguro de que desea detener la calibración?" diff --git a/ks_includes/locales/et/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/et/LC_MESSAGES/KlipperScreen.mo index b399d390f..c9fa27377 100644 Binary files a/ks_includes/locales/et/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/et/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/et/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/et/LC_MESSAGES/KlipperScreen.po index 9e26bed19..70b76d5c2 100644 --- a/ks_includes/locales/et/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/et/LC_MESSAGES/KlipperScreen.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" "PO-Revision-Date: 2024-07-26 19:09+0000\n" "Last-Translator: Jegert Uusküla \n" "Language-Team: Estonian \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-08-29 20:09+0000\n" +"Last-Translator: Nackophilz \n" "Language-Team: French \n" "Language: fr\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.7.1-dev\n" #, python-format msgid "%s will be updated to version" @@ -83,7 +83,7 @@ msgid "Are you sure you wish to shutdown the system?" msgstr "Êtes-vous sûr de vouloir arrêter le système ?" msgid "Asks for confirmation before stopping" -msgstr "" +msgstr "Demande une confirmation avant de s'arrêter" msgid "Auto" msgstr "Auto" @@ -107,7 +107,7 @@ msgid "Bed Mesh" msgstr "Maillage du plateau" msgid "Both" -msgstr "" +msgstr "Les deux" msgid "Calibrate" msgstr "Calibrer" @@ -140,10 +140,10 @@ msgid "Cannot connect to Moonraker" msgstr "Impossible de se connecter à Moonraker" msgid "Changes how the interface looks" -msgstr "" +msgstr "Modifie l'aspect de l'interface" msgid "Changes how the time remaining is calculated" -msgstr "" +msgstr "Modifie le mode de calcul du temps restant" msgid "Channel" msgstr "Canal" @@ -161,7 +161,7 @@ msgid "Close" msgstr "Fermer" msgid "Close messages after a timeout" -msgstr "" +msgstr "Fermer les messages après un délai d'attente" msgid "Complete" msgstr "Impression terminée" @@ -173,14 +173,14 @@ msgid "Connected" msgstr "Connecté" msgid "Connecting" -msgstr "" +msgstr "Connexion" #, python-format msgid "Connecting to %s" msgstr "Connexion à %s" msgid "Connection failed" -msgstr "" +msgstr "Connexion échouée" msgid "Console" msgstr "Console" @@ -189,13 +189,13 @@ msgid "Cooldown" msgstr "Refroidir" msgid "Couldn't add network" -msgstr "" +msgstr "Impossible d'ajouter le réseau" msgid "Current" -msgstr "" +msgstr "Actuel" msgid "Current percentage and graph line" -msgstr "" +msgstr "Pourcentage actuel et ligne graphique" msgid "DPMS has failed to load and has been disabled" msgstr "DPMS n’a pas pu charger et a été désactivé" @@ -216,7 +216,7 @@ msgid "Disable Motors" msgstr "Désactiver les moteurs" msgid "Disable for 12hs with am / pm" -msgstr "" +msgstr "Désactivation pour 12hs avec am / pm" msgid "Disconnect" msgstr "Déconnecter" @@ -226,7 +226,7 @@ msgstr "Distance (mm)" #, python-format msgid "Do you want to forget or disconnect %s?" -msgstr "" +msgstr "Voulez-vous oublier ou déconnecter %s ?" #, python-format msgid "Do you want to recover %s?" @@ -236,10 +236,10 @@ msgid "Elapsed:" msgstr "Écoulé:" msgid "Emergency Stop" -msgstr "" +msgstr "Arrêt d'urgence" msgid "Enable screen power management" -msgstr "" +msgstr "Activer la gestion de la consommation d'énergie de l'écran" msgid "Error" msgstr "Erreur" @@ -254,19 +254,19 @@ msgid "Error setting active spool" msgstr "Erreur dans le réglage de la bobine active" msgid "Error trying to fetch spools" -msgstr "" +msgstr "Erreur lors de la récupération des spools" msgid "Error: Couldn't get a position to probe" -msgstr "" +msgstr "Erreur : Impossible d'obtenir une position pour la sonde" msgid "Estimated Time" -msgstr "" +msgstr "Temps estimé" msgid "Estimated Time Method" msgstr "Méthode d'estimation de la durée" msgid "Example" -msgstr "" +msgstr "Exemple" msgid "Exclude Object" msgstr "Exclure Objet" @@ -287,10 +287,10 @@ msgid "Extrusion -" msgstr "Extrusion -" msgid "Failed to delete connection" -msgstr "" +msgstr "Échec de la suppression de la connexion" msgid "Failed to initialize" -msgstr "" +msgstr "Échec de l'initialisation" msgid "Failed, adjust position first" msgstr "Échec, ajustez d'abord la position" @@ -299,7 +299,7 @@ msgid "Fan" msgstr "Ventilation" msgid "Filament" -msgstr "" +msgstr "Filament" msgid "Filament Used" msgstr "Filament utilisé" @@ -343,17 +343,20 @@ msgstr "Débit:" msgid "Font Size" msgstr "Taille de la police" -msgid "Forget" +msgid "For mouse control or to verify touchscreen accuracy" msgstr "" +msgid "Forget" +msgstr "Oublier" + msgid "Full Update" msgstr "Mettre à jour" msgid "Gcodes" -msgstr "" +msgstr "Gcodes" msgid "Getting IP address" -msgstr "" +msgstr "Récupérer l'adresse IP" msgid "Go Back" msgstr "Retour" @@ -367,9 +370,6 @@ msgstr "Masquer" msgid "Hide sensors in Temp." msgstr "Masquer les capteurs dans Températures" -msgid "Hide temp." -msgstr "Masquer les températures" - msgid "Home" msgstr "Accueil" @@ -410,7 +410,7 @@ msgid "Input Shaper" msgstr "Input Shaper" msgid "Insufficient privileges" -msgstr "" +msgstr "Privilèges insuffisant" msgid "Interface" msgstr "Interface" @@ -421,9 +421,12 @@ msgstr "Invalide" msgid "Invalid password" msgstr "Mot de passe invalide" -msgid "Inversely affects the icon size" +msgid "Invalid temperature" msgstr "" +msgid "Inversely affects the icon size" +msgstr "Inverse de la taille de l'icône" + msgid "Invert X" msgstr "Inverser l'axe X" @@ -438,10 +441,10 @@ msgstr "" "Cela peut prendre plus de 5 minutes en fonction de la puissance du chauffage." msgid "It's possible that the configuration is not correct" -msgstr "" +msgstr "Il est possible que la configuration ne soit pas correcte" msgid "Job Status" -msgstr "" +msgstr "Statut du job" msgid "Klipper Restart" msgstr "Redémarrer Klipper" @@ -474,13 +477,13 @@ msgid "Large" msgstr "Grande" msgid "Last Duration" -msgstr "" +msgstr "Dernière durée" msgid "Last Used" msgstr "Dernière utilisation" msgid "Layer Height" -msgstr "" +msgstr "Hauteur de couche" msgid "Layer:" msgstr "Couche:" @@ -500,6 +503,9 @@ msgstr "Charger" msgid "Loading..." msgstr "Chargement..." +msgid "Lock" +msgstr "" + msgid "Lost Connection to Moonraker" msgstr "Perte de connexion avec Moonraker" @@ -528,7 +534,7 @@ msgid "Max Velocity" msgstr "Vélocité maximale" msgid "Max:" -msgstr "" +msgstr "Max:" msgid "Maximum" msgstr "Maximum" @@ -546,16 +552,16 @@ msgid "Medium" msgstr "Moyenne" msgid "Memory" -msgstr "" +msgstr "Mémoire" msgid "Menu" msgstr "Menu" msgid "Minimum Cruise Ratio" -msgstr "" +msgstr "Ratio de croisière minimum" msgid "Minimum:" -msgstr "" +msgstr "Minimum:" msgid "Modified" msgstr "Modifié" @@ -579,13 +585,13 @@ msgid "Network" msgstr "Réseau" msgid "Network connected" -msgstr "" +msgstr "Réseau connecté" msgid "Network disconnected" -msgstr "" +msgstr "Réseau déconnecté" msgid "Network not found" -msgstr "" +msgstr "Réseau non trouvé" msgid "Never" msgstr "Jamais" @@ -597,7 +603,7 @@ msgid "No elegible macros:" msgstr "Macros non éligibles :" msgid "No info available" -msgstr "" +msgstr "Pas d'information disponible" msgid "No mesh has been loaded" msgstr "Aucun maillage chargé" @@ -606,7 +612,7 @@ msgid "No wireless interface has been found" msgstr "Pas de périphérique sans-fil trouvé" msgid "Not all screens support this" -msgstr "" +msgstr "Tout les écrans ne supporte pas cela" msgid "Not working or not configured" msgstr "Ne fonctionne pas ou n'est pas configuré" @@ -621,18 +627,15 @@ msgid "Notifications" msgstr "Notifications" msgid "Nozzle diameter" -msgstr "" +msgstr "Diamètre de la buse" msgid "Only for the move panel" -msgstr "" +msgstr "Seulement pour bouger le panneau" #, python-format msgid "Outdated by %d" msgstr "Obsolète par %d" -msgid "PSK for" -msgstr "PSK pour" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "Le paquet sera mis à jour" @@ -641,6 +644,9 @@ msgstr[1] "Les paquets seront mis à jour" msgid "Part Fan" msgstr "Ventilateurs de refroidissement" +msgid "Password" +msgstr "" + msgid "Password saved" msgstr "Mot de passe enregistré" @@ -660,7 +666,7 @@ msgid "Please recompile and flash the micro-controller." msgstr "Veuillez recompiler et flasher le microcontrôleur." msgid "Please wait" -msgstr "" +msgstr "Veuillez patienter" msgid "Power" msgstr "Alimentation" @@ -675,7 +681,7 @@ msgid "Pressure Advance:" msgstr "Avance de pression:" msgid "Pressure advance" -msgstr "" +msgstr "Avance de pression" msgid "Print" msgstr "Imprimer" @@ -727,7 +733,7 @@ msgid "Refresh" msgstr "Rafraîchir" msgid "Remove network" -msgstr "" +msgstr "Supprimer le réseau" msgid "Rename/Move:" msgstr "Renommer/déplacer :" @@ -757,7 +763,7 @@ msgid "Retrying" msgstr "Réessaye" msgid "Rotation invalid" -msgstr "" +msgstr "Rotation invalide" msgid "Save" msgstr "Enregistrer" @@ -788,7 +794,7 @@ msgid "Screws Adjust" msgstr "Ajuster les vis" msgid "Screws not used:" -msgstr "" +msgstr "Vis non utilisée(s):" msgid "Send" msgstr "Envoyer" @@ -808,9 +814,12 @@ msgstr "Afficher la puissance de chauffe" msgid "Show Scrollbars Buttons" msgstr "Boutons d'affichage des barres de défilement" -msgid "Show only devices that are able to be set" +msgid "Show cursor" msgstr "" +msgid "Show only devices that are able to be set" +msgstr "Afficher uniquement les appareils pouvant être configurés" + msgid "Shutdown" msgstr "Arrêter" @@ -827,7 +836,7 @@ msgid "Small" msgstr "Petite" msgid "Smooth time" -msgstr "" +msgstr "Temps de pause" msgid "Speed (mm/s)" msgstr "Vitesse (mm/s)" @@ -858,6 +867,7 @@ msgstr "Démarrage de la mise à jour pour" msgid "Swaps buttons if they are on top of each other, affects other panels" msgstr "" +"Intervertit les boutons s'ils sont superposés, affecte les autres panneaux" msgid "System" msgstr "Système" @@ -869,7 +879,7 @@ msgid "System Shutdown" msgstr "Arrêter le système" msgid "System:" -msgstr "" +msgstr "Système:" msgid "Temp (°C)" msgstr "Temp (°C)" @@ -877,20 +887,24 @@ msgstr "Temp (°C)" msgid "Temperature" msgstr "Température" -msgid "The system doesn't meet the minimum requirement" +msgid "Temperature too low to extrude" msgstr "" +msgid "The system doesn't meet the minimum requirement" +msgstr "Le système ne répond pas aux exigences minimales" + msgid "This panel supports up-to 9 screws in a 3x3 Grid" -msgstr "" +msgstr "Ce panneau supporte jusqu'à 9 vis dans une grille de 3x3" msgid "This will affect screw positions and mesh graph" -msgstr "" +msgstr "Cela affectera la position des vis et le graphique des mailles" msgid "Timeout for screen black-out or power-off" -msgstr "" +msgstr "Délai d'extinction de l'écran ou de mise hors tension" msgid "Timeout for screen black-out or power-off during printing" msgstr "" +"Délai d'extinction de l'écran ou de mise hors tension pendant l'impression" msgid "Total:" msgstr "Total:" @@ -899,11 +913,17 @@ msgid "Unknown Heater" msgstr "Chauffe inconnue" msgid "Unknown security type" -msgstr "" +msgstr "Type de sécurité inconnu" msgid "Unload" msgstr "Décharger" +msgid "Unlock" +msgstr "" + +msgid "Unlock failed" +msgstr "" + msgid "Unretract Extra Length" msgstr "Longueur supplémentaire non rétractée" @@ -920,13 +940,16 @@ msgid "Updating" msgstr "Mise à jour" msgid "Useful for un-responsive touchscreens" +msgstr "Utile pour les écrans tactiles peu réactifs" + +msgid "User" msgstr "" msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC n'est pas pris en charge par le backend essai du Stream" msgid "Working" -msgstr "" +msgstr "Fonctionne" msgid "XY Move Speed (mm/s)" msgstr "Vitesse de déplacement XY (mm/s)" @@ -956,11 +979,11 @@ msgstr[1] "changements" msgid "day" msgid_plural "days" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "jour" +msgstr[1] "jours" msgid "g" -msgstr "" +msgstr "g" msgid "hour" msgid_plural "hours" @@ -991,12 +1014,18 @@ msgid "mm³/s" msgstr "mm³/s" msgid "s" -msgstr "" +msgstr "s" msgid "second" msgid_plural "seconds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "seconde" +msgstr[1] "secondes" + +#~ msgid "Hide temp." +#~ msgstr "Masquer les températures" + +#~ msgid "PSK for" +#~ msgstr "PSK pour" #~ msgid "Mesh calibrate" #~ msgstr "Calibration du maillage" diff --git a/ks_includes/locales/he/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/he/LC_MESSAGES/KlipperScreen.mo index a371c5846..1669969b0 100644 Binary files a/ks_includes/locales/he/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/he/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/he/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/he/LC_MESSAGES/KlipperScreen.po index 5cff90895..e975125aa 100644 --- a/ks_includes/locales/he/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/he/LC_MESSAGES/KlipperScreen.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Klipperscreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" "PO-Revision-Date: 2024-04-13 16:48+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Hebrew \n" "Language-Team: Hungarian \n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.9-dev\n" #, python-format msgid "%s will be updated to version" @@ -338,6 +338,9 @@ msgstr "Áramlás:" msgid "Font Size" msgstr "Betűméret" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "Egérvezérlés vagy az érintőképernyő pontosságának ellenőrzése" + msgid "Forget" msgstr "Elfelejtés" @@ -362,9 +365,6 @@ msgstr "Elrejt" msgid "Hide sensors in Temp." msgstr "Hőfok szenzorok elrejtése" -msgid "Hide temp." -msgstr "Hőfok elrejtése" - msgid "Home" msgstr "Kezdőpontok" @@ -416,6 +416,9 @@ msgstr "Érvénytelen" msgid "Invalid password" msgstr "Érvénytelen jelszó" +msgid "Invalid temperature" +msgstr "Rossz hőmérséklet" + msgid "Inversely affects the icon size" msgstr "Fordítottan befolyásolja az ikon méretét" @@ -493,6 +496,9 @@ msgstr "Betöltés" msgid "Loading..." msgstr "Betöltés..." +msgid "Lock" +msgstr "Zár" + msgid "Lost Connection to Moonraker" msgstr "Megszakadt a kapcsolat a Moonraker-el" @@ -623,9 +629,6 @@ msgstr "Csak a mozgatópanelhez" msgid "Outdated by %d" msgstr "%d által elavult" -msgid "PSK for" -msgstr "PSK-nak" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "A csomag frissítésre kerül" @@ -634,6 +637,9 @@ msgstr[1] "Csomag frissül" msgid "Part Fan" msgstr "Tárgyhűtő" +msgid "Password" +msgstr "Jelszó" + msgid "Password saved" msgstr "Jelszó mentve" @@ -800,6 +806,9 @@ msgstr "A fűtésteljesítmény megjelenítése" msgid "Show Scrollbars Buttons" msgstr "Görgetősáv gombok megjelenítése" +msgid "Show cursor" +msgstr "Kurzor mutatása" + msgid "Show only devices that are able to be set" msgstr "Csak a beállítható eszközök megjelenítése" @@ -870,6 +879,9 @@ msgstr "Hőfok (°C)" msgid "Temperature" msgstr "Hőfok" +msgid "Temperature too low to extrude" +msgstr "Extrudálási hőmérséklet túl alacsony" + msgid "The system doesn't meet the minimum requirement" msgstr "A rendszer nem felel meg a minimális követelményeknek" @@ -898,6 +910,12 @@ msgstr "Ismeretlen biztonsági típus" msgid "Unload" msgstr "Kiadás" +msgid "Unlock" +msgstr "Felold" + +msgid "Unlock failed" +msgstr "Feloldás sikertelen" + msgid "Unretract Extra Length" msgstr "Extra visszahúzás hossza" @@ -916,6 +934,9 @@ msgstr "Frissítés" msgid "Useful for un-responsive touchscreens" msgstr "Hasznos a nem reagáló érintőképernyőknél" +msgid "User" +msgstr "Felhasználó" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "A WebRTC-t a Streamet próbáló háttérrendszer nem támogatja" @@ -992,6 +1013,12 @@ msgid_plural "seconds" msgstr[0] "másodperc" msgstr[1] "másodperc" +#~ msgid "Hide temp." +#~ msgstr "Hőfok elrejtése" + +#~ msgid "PSK for" +#~ msgstr "PSK-nak" + #~ msgid "Are you sure you want to stop the calibration?" #~ msgstr "Biztos, hogy leállítod a kalibrálást?" diff --git a/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.mo index 446098297..0c3e88ec7 100644 Binary files a/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.po index 5c4e7433a..ed21dab20 100644 --- a/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/it/LC_MESSAGES/KlipperScreen.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-04-24 20:07+0000\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-11-30 20:00+0000\n" "Last-Translator: Giadej \n" "Language-Team: Italian \n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.5.1-dev\n" +"X-Generator: Weblate 5.9-dev\n" #, python-format msgid "%s will be updated to version" @@ -78,7 +78,7 @@ msgid "Are you sure you wish to shutdown the system?" msgstr "Sei sicuro di voler spegnere il sistema?" msgid "Asks for confirmation before stopping" -msgstr "" +msgstr "Chiedi conferma prima di interrompere" msgid "Auto" msgstr "Automatico" @@ -135,10 +135,10 @@ msgid "Cannot connect to Moonraker" msgstr "Impossibile connettersi a Moonraker" msgid "Changes how the interface looks" -msgstr "" +msgstr "Cambia l'aspetto dell'interfaccia" msgid "Changes how the time remaining is calculated" -msgstr "" +msgstr "Cambia il metodo di calcolo del tempo residuo" msgid "Channel" msgstr "Canale" @@ -150,13 +150,13 @@ msgid "Checking for updates, please wait..." msgstr "Controllo aggiornamenti in corso, attendere..." msgid "Clear" -msgstr "Clear" +msgstr "Pulisci" msgid "Close" msgstr "Chiudi" msgid "Close messages after a timeout" -msgstr "" +msgstr "Chiudi i messaggi dopo il timeout" msgid "Complete" msgstr "Completo" @@ -168,14 +168,14 @@ msgid "Connected" msgstr "Connesso" msgid "Connecting" -msgstr "" +msgstr "Connessione" #, python-format msgid "Connecting to %s" msgstr "Connessione a %s" msgid "Connection failed" -msgstr "" +msgstr "Connessione fallita" msgid "Console" msgstr "Console" @@ -184,13 +184,13 @@ msgid "Cooldown" msgstr "Raffreddare" msgid "Couldn't add network" -msgstr "" +msgstr "Impossibile aggiungere la rete" msgid "Current" -msgstr "" +msgstr "Attuale" msgid "Current percentage and graph line" -msgstr "" +msgstr "Percentuale attuale e linea grafica" msgid "DPMS has failed to load and has been disabled" msgstr "DPMS non è stato caricato ed è stato disabilitato" @@ -211,7 +211,7 @@ msgid "Disable Motors" msgstr "Disabilita Motori" msgid "Disable for 12hs with am / pm" -msgstr "" +msgstr "Disattiva am/pm per formato 12 ore" msgid "Disconnect" msgstr "Sconnetti" @@ -221,7 +221,7 @@ msgstr "Distanza (mm)" #, python-format msgid "Do you want to forget or disconnect %s?" -msgstr "" +msgstr "Vuoi tralasciare o disconnettere %s?" #, python-format msgid "Do you want to recover %s?" @@ -234,7 +234,7 @@ msgid "Emergency Stop" msgstr "Stop di Emergenza" msgid "Enable screen power management" -msgstr "" +msgstr "Abilita la gestione energetica dello schermo" msgid "Error" msgstr "Errore" @@ -255,13 +255,13 @@ msgid "Error: Couldn't get a position to probe" msgstr "Errore: impossibile ottenere una posizione da sondare" msgid "Estimated Time" -msgstr "" +msgstr "Tempo stimato" msgid "Estimated Time Method" msgstr "Metodo Tempo Stimato" msgid "Example" -msgstr "" +msgstr "Esempio" msgid "Exclude Object" msgstr "Escludi Oggetto" @@ -282,10 +282,10 @@ msgid "Extrusion -" msgstr "Estrusione -" msgid "Failed to delete connection" -msgstr "" +msgstr "Cancellazione della connessione fallita" msgid "Failed to initialize" -msgstr "" +msgstr "Inizializzazione fallita" msgid "Failed, adjust position first" msgstr "Fallito, regola prima la posizione" @@ -294,7 +294,7 @@ msgid "Fan" msgstr "Ventola" msgid "Filament" -msgstr "" +msgstr "Filamento" msgid "Filament Used" msgstr "Filamento Usato" @@ -338,17 +338,20 @@ msgstr "Portata:" msgid "Font Size" msgstr "Dimensione Carattere" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "Per controllo mouse o verifica accuratezza touchscreen" + msgid "Forget" -msgstr "" +msgstr "Tralascia" msgid "Full Update" msgstr "Aggiornamento Completo" msgid "Gcodes" -msgstr "" +msgstr "Gcode" msgid "Getting IP address" -msgstr "" +msgstr "Ottieni indirizzo IP" msgid "Go Back" msgstr "Torna indietro" @@ -362,9 +365,6 @@ msgstr "Nascondi" msgid "Hide sensors in Temp." msgstr "Nascondi sensori in Temp." -msgid "Hide temp." -msgstr "Nascondi temp." - msgid "Home" msgstr "Home" @@ -405,7 +405,7 @@ msgid "Input Shaper" msgstr "Input Shaper" msgid "Insufficient privileges" -msgstr "" +msgstr "Privilegi insufficienti" msgid "Interface" msgstr "Interfaccia" @@ -416,8 +416,11 @@ msgstr "Non valido" msgid "Invalid password" msgstr "Password non valida" +msgid "Invalid temperature" +msgstr "Temperatura non valida" + msgid "Inversely affects the icon size" -msgstr "" +msgstr "Inverte le dimensioni dell'icona" msgid "Invert X" msgstr "Inverti X" @@ -433,10 +436,10 @@ msgstr "" "Potrebbero volerci più di 5 min. a seconda della potenza del riscaldatore." msgid "It's possible that the configuration is not correct" -msgstr "" +msgstr "E' possibile che la configurazione sia errata" msgid "Job Status" -msgstr "" +msgstr "Stato di avanzamento lavoro" msgid "Klipper Restart" msgstr "Riavvia Klipper" @@ -469,13 +472,13 @@ msgid "Large" msgstr "Grande" msgid "Last Duration" -msgstr "" +msgstr "Ultima durata" msgid "Last Used" msgstr "Ultimo Utilizzo" msgid "Layer Height" -msgstr "" +msgstr "Altezza Layer" msgid "Layer:" msgstr "Layer:" @@ -495,6 +498,9 @@ msgstr "Carica" msgid "Loading..." msgstr "Caricamento..." +msgid "Lock" +msgstr "Blocca" + msgid "Lost Connection to Moonraker" msgstr "Connessione persa con Moonraker" @@ -523,7 +529,7 @@ msgid "Max Velocity" msgstr "Velocità massima" msgid "Max:" -msgstr "" +msgstr "Massimo:" msgid "Maximum" msgstr "Massimo" @@ -541,7 +547,7 @@ msgid "Medium" msgstr "Medio" msgid "Memory" -msgstr "" +msgstr "Memoria" msgid "Menu" msgstr "Menù" @@ -550,7 +556,7 @@ msgid "Minimum Cruise Ratio" msgstr "Cruise Ratio Minimo" msgid "Minimum:" -msgstr "" +msgstr "Minimo:" msgid "Modified" msgstr "Modificato" @@ -574,13 +580,13 @@ msgid "Network" msgstr "Rete" msgid "Network connected" -msgstr "" +msgstr "Rete connessa" msgid "Network disconnected" -msgstr "" +msgstr "Rete disconnessa" msgid "Network not found" -msgstr "" +msgstr "Rete non trovata" msgid "Never" msgstr "Mai" @@ -592,7 +598,7 @@ msgid "No elegible macros:" msgstr "Nessuna macro elegibile:" msgid "No info available" -msgstr "" +msgstr "Informazioni non disponibili" msgid "No mesh has been loaded" msgstr "Nessuna besh_mesh caricata" @@ -601,7 +607,7 @@ msgid "No wireless interface has been found" msgstr "Nessura interfaccia wireless trovata" msgid "Not all screens support this" -msgstr "" +msgstr "Non tutti gli schermi lo supportano" msgid "Not working or not configured" msgstr "Non funzionante o non configurato" @@ -616,18 +622,15 @@ msgid "Notifications" msgstr "Notifiche" msgid "Nozzle diameter" -msgstr "" +msgstr "Diametro Ugello" msgid "Only for the move panel" -msgstr "" +msgstr "Solo per il pannello \"move\"" #, python-format msgid "Outdated by %d" msgstr "Obsoleto da %d" -msgid "PSK for" -msgstr "PSK per" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "Il pacchetto verrà aggiornato" @@ -636,6 +639,9 @@ msgstr[1] "I pacchetti verranno aggiornati" msgid "Part Fan" msgstr "Part Fan" +msgid "Password" +msgstr "Password" + msgid "Password saved" msgstr "Password salvata" @@ -655,7 +661,7 @@ msgid "Please recompile and flash the micro-controller." msgstr "Ricompila e flasha il micro-controller." msgid "Please wait" -msgstr "" +msgstr "Attendere prego" msgid "Power" msgstr "Power" @@ -670,7 +676,7 @@ msgid "Pressure Advance:" msgstr "Pressure Advance:" msgid "Pressure advance" -msgstr "" +msgstr "Pressure advance" msgid "Print" msgstr "Stampa" @@ -721,7 +727,7 @@ msgid "Refresh" msgstr "Aggiorna" msgid "Remove network" -msgstr "" +msgstr "Rimuovi rete" msgid "Rename/Move:" msgstr "Rinomina/Sposta:" @@ -751,7 +757,7 @@ msgid "Retrying" msgstr "Nuovo tentativo" msgid "Rotation invalid" -msgstr "" +msgstr "Rotazione non valida" msgid "Save" msgstr "Salva" @@ -782,7 +788,7 @@ msgid "Screws Adjust" msgstr "Screws Adjust" msgid "Screws not used:" -msgstr "" +msgstr "Viti non utilizzate:" msgid "Send" msgstr "Invia" @@ -802,8 +808,11 @@ msgstr "Mostra Potenza Riscaldatore" msgid "Show Scrollbars Buttons" msgstr "Mostra Pulsanti Barre di Scorrimento" +msgid "Show cursor" +msgstr "Mostra cursore" + msgid "Show only devices that are able to be set" -msgstr "" +msgstr "Mostra solo i dispositivi impostabili" msgid "Shutdown" msgstr "Spegnimento" @@ -821,7 +830,7 @@ msgid "Small" msgstr "Piccolo" msgid "Smooth time" -msgstr "" +msgstr "Smooth time" msgid "Speed (mm/s)" msgstr "Velocità (mm/s)" @@ -851,7 +860,7 @@ msgid "Starting update for" msgstr "Avvio aggiornamento per" msgid "Swaps buttons if they are on top of each other, affects other panels" -msgstr "" +msgstr "Scambia i pulsanti se sono sovrapposti, influisce sugli altri pannelli" msgid "System" msgstr "Sistema" @@ -863,7 +872,7 @@ msgid "System Shutdown" msgstr "Spegni Sistema" msgid "System:" -msgstr "" +msgstr "Sistema:" msgid "Temp (°C)" msgstr "Temperatura (°C)" @@ -871,20 +880,23 @@ msgstr "Temperatura (°C)" msgid "Temperature" msgstr "Temperatura" +msgid "Temperature too low to extrude" +msgstr "Temperatura troppo bassa per estrudere" + msgid "The system doesn't meet the minimum requirement" -msgstr "" +msgstr "Il sistema non soddisfa i requisiti minimi" msgid "This panel supports up-to 9 screws in a 3x3 Grid" -msgstr "" +msgstr "Questo pannello supporta fino a 9 viti con griglia 3x3" msgid "This will affect screw positions and mesh graph" -msgstr "" +msgstr "Questo influisce sulla posizione delle viti e sul grafico della mesh" msgid "Timeout for screen black-out or power-off" -msgstr "" +msgstr "Timeout per oscurare o spegnere lo schermo" msgid "Timeout for screen black-out or power-off during printing" -msgstr "" +msgstr "Timeout per oscurare o spegnere lo schermo durante la stampa" msgid "Total:" msgstr "Totale:" @@ -893,11 +905,17 @@ msgid "Unknown Heater" msgstr "Riscaldatore sconosciuto" msgid "Unknown security type" -msgstr "" +msgstr "Tipo di sicurezza sconosciuto" msgid "Unload" msgstr "Scarica" +msgid "Unlock" +msgstr "Sblocca" + +msgid "Unlock failed" +msgstr "Sblocco fallito" + msgid "Unretract Extra Length" msgstr "Lunghezza Extra De-Retrazione" @@ -914,13 +932,16 @@ msgid "Updating" msgstr "Aggiornamento" msgid "Useful for un-responsive touchscreens" -msgstr "" +msgstr "Utile per i touchscreen poco reattivi" + +msgid "User" +msgstr "Utente" msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC non è supportato dal backend che sta tentando lo stream" msgid "Working" -msgstr "" +msgstr "Lavoro" msgid "XY Move Speed (mm/s)" msgstr "Velocità movimento XY (mm/s)" @@ -950,11 +971,11 @@ msgstr[1] "Applica" msgid "day" msgid_plural "days" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "giorno" +msgstr[1] "giorni" msgid "g" -msgstr "" +msgstr "g" msgid "hour" msgid_plural "hours" @@ -985,12 +1006,18 @@ msgid "mm³/s" msgstr "mm³/s" msgid "s" -msgstr "" +msgstr "s" msgid "second" msgid_plural "seconds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "secondo" +msgstr[1] "secondi" + +#~ msgid "Hide temp." +#~ msgstr "Nascondi temp." + +#~ msgid "PSK for" +#~ msgstr "PSK per" #~ msgid "Mesh calibrate" #~ msgstr "Calibrazione mesh" diff --git a/ks_includes/locales/jp/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/jp/LC_MESSAGES/KlipperScreen.mo index 929e9e7fb..d7e050b5c 100644 Binary files a/ks_includes/locales/jp/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/jp/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/jp/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/jp/LC_MESSAGES/KlipperScreen.po index b32f110f2..ce977d61b 100644 --- a/ks_includes/locales/jp/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/jp/LC_MESSAGES/KlipperScreen.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-04-13 16:48+0000\n" -"Last-Translator: Anonymous \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-10-20 01:16+0000\n" +"Last-Translator: Hideki Matsunobu \n" "Language-Team: Japanese \n" "Language: jp\n" @@ -12,7 +12,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.5-dev\n" +"X-Generator: Weblate 5.8-rc\n" #, python-format msgid "%s will be updated to version" @@ -43,21 +43,21 @@ msgid "Add profile" msgstr "プロファイルの追加" msgid "All" -msgstr "" +msgstr "全て" msgid "Apply" msgstr "適用する" #, python-format msgid "Apply %s%.3f offset to Endstop?" -msgstr "" +msgstr "エンドストップに %s%.3f オフセットを適用しますか?" #, python-format msgid "Apply %s%.3f offset to Probe?" -msgstr "" +msgstr "プローブに %s%.3f オフセットを適用しますか?" msgid "Archived" -msgstr "" +msgstr "保管されました" msgid "Are you sure do you want to exclude the object?" msgstr "対象を除外しますか?" @@ -78,7 +78,7 @@ msgid "Are you sure you wish to shutdown the system?" msgstr "システムをシャットダウンしますか?" msgid "Asks for confirmation before stopping" -msgstr "" +msgstr "停止する前に確認を求めます" msgid "Auto" msgstr "自動" @@ -102,7 +102,7 @@ msgid "Bed Mesh" msgstr "ベッドメッシュ" msgid "Both" -msgstr "" +msgstr "両方" msgid "Calibrate" msgstr "校正" @@ -114,7 +114,7 @@ msgid "Calibrating" msgstr "校正中" msgid "Camera" -msgstr "" +msgstr "カメラ" msgid "Can't set above the maximum:" msgstr "上限値を超えて設定できません:" @@ -135,10 +135,10 @@ msgid "Cannot connect to Moonraker" msgstr "Moonrakerに接続できません" msgid "Changes how the interface looks" -msgstr "" +msgstr "インターフェイスの外観を変更します" msgid "Changes how the time remaining is calculated" -msgstr "" +msgstr "残り時間の計算方法を変更します" msgid "Channel" msgstr "チャンネル" @@ -147,7 +147,7 @@ msgid "Check ADXL Wiring" msgstr "ADXL Wiring を検査する" msgid "Checking for updates, please wait..." -msgstr "" +msgstr "更新を確認しています。しばらくお待ちください..." msgid "Clear" msgstr "クリア" @@ -156,7 +156,7 @@ msgid "Close" msgstr "終了" msgid "Close messages after a timeout" -msgstr "" +msgstr "タイムアウト後にメッセージを閉じる" msgid "Complete" msgstr "完了" @@ -168,14 +168,14 @@ msgid "Connected" msgstr "接続済み" msgid "Connecting" -msgstr "" +msgstr "接続中です" #, python-format msgid "Connecting to %s" msgstr "%s へ接続中・・・" msgid "Connection failed" -msgstr "" +msgstr "接続に失敗しました" msgid "Console" msgstr "コンソール" @@ -184,25 +184,25 @@ msgid "Cooldown" msgstr "クールダウン" msgid "Couldn't add network" -msgstr "" +msgstr "ネットワークを追加できませんでした" msgid "Current" -msgstr "" +msgstr "カレント" msgid "Current percentage and graph line" -msgstr "" +msgstr "現在の割合とグラフ線" msgid "DPMS has failed to load and has been disabled" -msgstr "" +msgstr "DPMS の読み込みに失敗したため、無効になりました" msgid "Date" msgstr "日付" msgid "Delete" -msgstr "" +msgstr "削除" msgid "Delete Directory?" -msgstr "" +msgstr "ディレクトリを削除しますか?" msgid "Delete File?" msgstr "ファイルを削除しますか?" @@ -211,17 +211,17 @@ msgid "Disable Motors" msgstr "モーターの無効化" msgid "Disable for 12hs with am / pm" -msgstr "" +msgstr "午前/午後の12時間表記を無効化" msgid "Disconnect" -msgstr "" +msgstr "切断" msgid "Distance (mm)" msgstr "距離(mm)" #, python-format msgid "Do you want to forget or disconnect %s?" -msgstr "" +msgstr "%s を無視するか、または、切断しますか?" #, python-format msgid "Do you want to recover %s?" @@ -231,37 +231,37 @@ msgid "Elapsed:" msgstr "経過時間:" msgid "Emergency Stop" -msgstr "" +msgstr "緊急停止" msgid "Enable screen power management" -msgstr "" +msgstr "画面の電源管理を有効化" msgid "Error" msgstr "エラー" msgid "Error clearing active spool" -msgstr "" +msgstr "アクティブスプールのクリア中にエラーが発生しました" msgid "Error getting active spool" -msgstr "" +msgstr "アクティブスプールの取得中にエラーが発生しました" msgid "Error setting active spool" -msgstr "" +msgstr "アクティブスプールの設定中にエラーが発生しました" msgid "Error trying to fetch spools" -msgstr "" +msgstr "スプールを取得中にエラーが発生しました" msgid "Error: Couldn't get a position to probe" -msgstr "" +msgstr "エラー: 調査する位置を取得できませんでした" msgid "Estimated Time" -msgstr "" +msgstr "推定所要時間" msgid "Estimated Time Method" msgstr "予定時刻" msgid "Example" -msgstr "" +msgstr "例" msgid "Exclude Object" msgstr "対象の除外" @@ -273,7 +273,7 @@ msgid "Extrude" msgstr "吐出" msgid "Extruders" -msgstr "" +msgstr "押出機" msgid "Extrusion +" msgstr "吐出+" @@ -282,10 +282,10 @@ msgid "Extrusion -" msgstr "吐出-" msgid "Failed to delete connection" -msgstr "" +msgstr "接続を削除できませんでした" msgid "Failed to initialize" -msgstr "" +msgstr "初期化に失敗しました" msgid "Failed, adjust position first" msgstr "失敗時は最初に位置を調整する" @@ -294,7 +294,7 @@ msgid "Fan" msgstr "ファン" msgid "Filament" -msgstr "" +msgstr "フィラメント" msgid "Filament Used" msgstr "使用済フィラメント" @@ -315,7 +315,7 @@ msgid "File:" msgstr "ファイル:" msgid "Filter" -msgstr "" +msgstr "フィルタ" msgid "Finding ADXL" msgstr "ADXLを検索中" @@ -338,17 +338,20 @@ msgstr "フローレート:" msgid "Font Size" msgstr "フォントサイズ" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "マウス制御またはタッチスクリーンの精度を確認する場合" + msgid "Forget" -msgstr "" +msgstr "無視" msgid "Full Update" msgstr "フルアップデート" msgid "Gcodes" -msgstr "" +msgstr "Gコード" msgid "Getting IP address" -msgstr "" +msgstr "IPアドレスの取得中" msgid "Go Back" msgstr "戻る" @@ -362,20 +365,17 @@ msgstr "隠す" msgid "Hide sensors in Temp." msgstr "温度を非表示にする" -msgid "Hide temp." -msgstr "温度を非表示にする" - msgid "Home" -msgstr "" +msgstr "ホーム" msgid "Home All" -msgstr "" +msgstr "全てをホームに戻す" msgid "Home X" msgstr "Home X" msgid "Home XY" -msgstr "Home XY" +msgstr "XY軸をホームに戻す" msgid "Home Y" msgstr "Home Y" @@ -384,28 +384,28 @@ msgid "Home Z" msgstr "Home Z" msgid "Host" -msgstr "" +msgstr "ホスト" msgid "Hostname" -msgstr "Hostname" +msgstr "ホスト名" msgid "ID" -msgstr "" +msgstr "ID" msgid "Icon Theme" msgstr "アイコンテーマ" msgid "Initializing printer..." -msgstr "" +msgstr "プリンタの初期化中..." msgid "Initiate a PID calibration for:" -msgstr "" +msgstr "以下の PID キャリブレーションを開始:" msgid "Input Shaper" -msgstr "" +msgstr "入力シェーパー" msgid "Insufficient privileges" -msgstr "" +msgstr "十分な権限がありません" msgid "Interface" msgstr "インターフェース" @@ -414,10 +414,13 @@ msgid "Invalid" msgstr "不正" msgid "Invalid password" +msgstr "パスワードが無効です" + +msgid "Invalid temperature" msgstr "" msgid "Inversely affects the icon size" -msgstr "" +msgstr "アイコンのサイズに逆影響を及ぼします" msgid "Invert X" msgstr "X軸を反対にする" @@ -429,13 +432,13 @@ msgid "Invert Z" msgstr "X軸を反対にする" msgid "It may take more than 5 minutes depending on the heater power." -msgstr "" +msgstr "ヒーターの電力によっては5分以上かかる場合もあります。" msgid "It's possible that the configuration is not correct" -msgstr "" +msgstr "設定が正しくない可能性があります" msgid "Job Status" -msgstr "" +msgstr "ジョブステータス" msgid "Klipper Restart" msgstr "Klipperを再起動する" @@ -458,6 +461,8 @@ msgstr "Klipperは再起動します" msgid "" "LOAD_FILAMENT/UNLOAD_FILAMENT are hidden and should be used from extrude" msgstr "" +"LOAD_FILAMENT/UNLOAD_FILAMENT は非表示になっているため、押し出しから使用する" +"必要があります" msgid "Language" msgstr "言語" @@ -466,13 +471,13 @@ msgid "Large" msgstr "大" msgid "Last Duration" -msgstr "" +msgstr "最後の持続時間" msgid "Last Used" -msgstr "" +msgstr "最後に使用したもの" msgid "Layer Height" -msgstr "" +msgstr "レイヤの高さ" msgid "Layer:" msgstr "レイヤー:" @@ -487,13 +492,16 @@ msgid "Limits" msgstr "制限" msgid "Load" -msgstr "" +msgstr "ロード" msgid "Loading..." +msgstr "ロード中..." + +msgid "Lock" msgstr "" msgid "Lost Connection to Moonraker" -msgstr "" +msgstr "Moonraker への接続が失われました" msgid "Lower Nozzle" msgstr "ノズルが低い" @@ -508,7 +516,7 @@ msgid "Main Menu" msgstr "メインメニュー" msgid "Material" -msgstr "" +msgstr "素材" msgid "Max" msgstr "最大" @@ -520,7 +528,7 @@ msgid "Max Velocity" msgstr "最大速度" msgid "Max:" -msgstr "" +msgstr "最大:" msgid "Maximum" msgstr "最大" @@ -538,16 +546,16 @@ msgid "Medium" msgstr "中" msgid "Memory" -msgstr "" +msgstr "メモリ" msgid "Menu" msgstr "メニュー" msgid "Minimum Cruise Ratio" -msgstr "" +msgstr "最小巡航比率" msgid "Minimum:" -msgstr "" +msgstr "最小:" msgid "Modified" msgstr "変更" @@ -571,13 +579,13 @@ msgid "Network" msgstr "ネットワーク" msgid "Network connected" -msgstr "" +msgstr "ネットワークに接続しました" msgid "Network disconnected" -msgstr "" +msgstr "ネットワークを切断しました" msgid "Network not found" -msgstr "" +msgstr "ネットワークが見つかりません" msgid "Never" msgstr "未" @@ -586,45 +594,42 @@ msgid "New" msgstr "新" msgid "No elegible macros:" -msgstr "" +msgstr "有効なマクロがありません:" msgid "No info available" -msgstr "" +msgstr "利用できる情報はありません" msgid "No mesh has been loaded" -msgstr "" +msgstr "メッシュが読み込まれていません" msgid "No wireless interface has been found" -msgstr "" +msgstr "ワイヤレスインターフェイスが見つかりませんでした" msgid "Not all screens support this" -msgstr "" +msgstr "すべての画面がこれをサポートしているわけではありません" msgid "Not working or not configured" -msgstr "" +msgstr "動作していないか設定されていません" msgid "Nothing selected" msgstr "未選択" msgid "Notification log empty" -msgstr "" +msgstr "通知ログがありません" msgid "Notifications" -msgstr "" +msgstr "通知" msgid "Nozzle diameter" -msgstr "" +msgstr "ノズルの直径" msgid "Only for the move panel" -msgstr "" +msgstr "移動パネル専用" #, python-format msgid "Outdated by %d" msgstr "" -msgid "PSK for" -msgstr "" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "" @@ -632,6 +637,9 @@ msgstr[0] "" msgid "Part Fan" msgstr "" +msgid "Password" +msgstr "" + msgid "Password saved" msgstr "パスワードを保存しました" @@ -651,7 +659,7 @@ msgid "Please recompile and flash the micro-controller." msgstr "マイクロコントローラーをリコンパイル&フラッシュしてください" msgid "Please wait" -msgstr "" +msgstr "しばらくお待ちください" msgid "Power" msgstr "電源" @@ -717,7 +725,7 @@ msgid "Refresh" msgstr "最新表示" msgid "Remove network" -msgstr "" +msgstr "ネットワークの削除" msgid "Rename/Move:" msgstr "" @@ -781,7 +789,7 @@ msgid "Screws not used:" msgstr "" msgid "Send" -msgstr "" +msgstr "送信" msgid "Set Temp" msgstr "温度設定" @@ -798,6 +806,9 @@ msgstr "" msgid "Show Scrollbars Buttons" msgstr "" +msgid "Show cursor" +msgstr "カーソルの表示" + msgid "Show only devices that are able to be set" msgstr "" @@ -820,22 +831,22 @@ msgid "Smooth time" msgstr "" msgid "Speed (mm/s)" -msgstr "" +msgstr "速度 (mm/s)" msgid "Speed +" -msgstr "" +msgstr "速度+" msgid "Speed -" -msgstr "" +msgstr "速度-" msgid "Speed:" -msgstr "" +msgstr "速度:" msgid "Square Corner Velocity" msgstr "四隅の速度" msgid "Standby" -msgstr "" +msgstr "スタンバイ" msgid "Start" msgstr "開始" @@ -848,6 +859,7 @@ msgstr "更新中" msgid "Swaps buttons if they are on top of each other, affects other panels" msgstr "" +"ボタンが重なっている場合はボタンを交換しますが、他のパネルに影響を与えます" msgid "System" msgstr "システム" @@ -859,7 +871,7 @@ msgid "System Shutdown" msgstr "システムのシャットダウン" msgid "System:" -msgstr "" +msgstr "システム:" msgid "Temp (°C)" msgstr "温度 (°C)" @@ -867,20 +879,23 @@ msgstr "温度 (°C)" msgid "Temperature" msgstr "温度" +msgid "Temperature too low to extrude" +msgstr "温度が低すぎるため押し出すことができません" + msgid "The system doesn't meet the minimum requirement" -msgstr "" +msgstr "システムは最低要件を満たしていません" msgid "This panel supports up-to 9 screws in a 3x3 Grid" -msgstr "" +msgstr "このパネルは3x3グリッドで最大9本のネジをサポートします" msgid "This will affect screw positions and mesh graph" -msgstr "" +msgstr "これはネジの位置とメッシュグラフに影響します" msgid "Timeout for screen black-out or power-off" -msgstr "" +msgstr "画面の消灯または電源オフのタイムアウト" msgid "Timeout for screen black-out or power-off during printing" -msgstr "" +msgstr "印刷中における画面の消灯または電源オフによるタイムアウト" msgid "Total:" msgstr "全体:" @@ -889,16 +904,22 @@ msgid "Unknown Heater" msgstr "無効なヒーター" msgid "Unknown security type" -msgstr "" +msgstr "不明なセキュリティタイプ" msgid "Unload" msgstr "アンロード" +msgid "Unlock" +msgstr "" + +msgid "Unlock failed" +msgstr "" + msgid "Unretract Extra Length" msgstr "" msgid "Unretract Speed" -msgstr "" +msgstr "非リトラクト速度" msgid "Up To Date" msgstr "最新" @@ -910,13 +931,16 @@ msgid "Updating" msgstr "更新中" msgid "Useful for un-responsive touchscreens" -msgstr "" +msgstr "無反応のタッチスクリーンに有利" + +msgid "User" +msgstr "ユーザ" msgid "WebRTC is not supported by the backend trying Stream" -msgstr "" +msgstr "WebRTCはストリームを試行するバックエンドではサポートされていません" msgid "Working" -msgstr "" +msgstr "動作中" msgid "XY Move Speed (mm/s)" msgstr "XY移動速度 (mm/s)" @@ -931,13 +955,13 @@ msgid "Z Move Speed (mm/s)" msgstr "X軸 移動速度 (mm/s)" msgid "Z Speed (mm/s)" -msgstr "" +msgstr "Z軸 速度 (mm/s)" msgid "Z Tilt" -msgstr "" +msgstr "Z軸 チルト" msgid "Z offset:" -msgstr "" +msgstr "Z軸オフセット:" msgid "commit" msgid_plural "commits" @@ -955,10 +979,10 @@ msgid_plural "hours" msgstr[0] "" msgid "macros that use 'rename_existing' are hidden" -msgstr "" +msgstr "「rename_existing」を使用するマクロは非表示になります" msgid "macros with a name starting with '_' are hidden" -msgstr "" +msgstr "名前が「_」で始まるマクロは非表示になります" msgid "minute" msgid_plural "minutes" @@ -983,6 +1007,9 @@ msgid "second" msgid_plural "seconds" msgstr[0] "" +#~ msgid "Hide temp." +#~ msgstr "温度を非表示にする" + #~ msgid "Mesh calibrate" #~ msgstr "メッシュ較正" diff --git a/ks_includes/locales/ko/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/ko/LC_MESSAGES/KlipperScreen.mo index 6d09edaf8..f5d348f9d 100644 Binary files a/ks_includes/locales/ko/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/ko/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/ko/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/ko/LC_MESSAGES/KlipperScreen.po index 8e1c4c132..14715db2c 100644 --- a/ks_includes/locales/ko/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/ko/LC_MESSAGES/KlipperScreen.po @@ -2,9 +2,10 @@ msgid "" msgstr "" "Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" "PO-Revision-Date: 2024-07-06 14:10+0900\n" -"Last-Translator: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com>\n" +"Last-Translator: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github." +"com>\n" "Language-Team: Korean \n" "Language: ko\n" @@ -338,6 +339,9 @@ msgstr "유량 비율:" msgid "Font Size" msgstr "글꼴 크기" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "" + msgid "Forget" msgstr "" @@ -362,9 +366,6 @@ msgstr "가리기" msgid "Hide sensors in Temp." msgstr "온도 섹션에서 센서 항목 숨김." -msgid "Hide temp." -msgstr "온도 숨김." - msgid "Home" msgstr "원점 이동" @@ -416,6 +417,9 @@ msgstr "존재하지 않음" msgid "Invalid password" msgstr "잘못된 패스워드" +msgid "Invalid temperature" +msgstr "" + msgid "Inversely affects the icon size" msgstr "" @@ -493,6 +497,9 @@ msgstr "필라멘트 로드" msgid "Loading..." msgstr "로딩중..." +msgid "Lock" +msgstr "" + msgid "Lost Connection to Moonraker" msgstr "문레이커와 연결이 끊어졌습니다" @@ -623,9 +630,6 @@ msgstr "" msgid "Outdated by %d" msgstr "%d 보다 오래됨" -msgid "PSK for" -msgstr "PSK 키 값(비밀번호)" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "패키지가 업데이트 됩니다" @@ -633,6 +637,9 @@ msgstr[0] "패키지가 업데이트 됩니다" msgid "Part Fan" msgstr "파트 쿨링 팬" +msgid "Password" +msgstr "" + msgid "Password saved" msgstr "비밀번호 저장됨" @@ -799,6 +806,9 @@ msgstr "히터 전원 보기" msgid "Show Scrollbars Buttons" msgstr "스크롤바 버튼 보기" +msgid "Show cursor" +msgstr "" + msgid "Show only devices that are able to be set" msgstr "" @@ -868,6 +878,9 @@ msgstr "온도 (°C)" msgid "Temperature" msgstr "온도" +msgid "Temperature too low to extrude" +msgstr "" + msgid "The system doesn't meet the minimum requirement" msgstr "시스템이 최소 요구 조건을 충족하지 않습니다" @@ -895,6 +908,12 @@ msgstr "알 수 없는 보안 유형" msgid "Unload" msgstr "필라멘트 꺼내기" +msgid "Unlock" +msgstr "" + +msgid "Unlock failed" +msgstr "" + msgid "Unretract Extra Length" msgstr "필라멘트 언리트렉션 길이" @@ -913,6 +932,9 @@ msgstr "업데이트 중" msgid "Useful for un-responsive touchscreens" msgstr "응답 없는 터치스크린에 유용함" +msgid "User" +msgstr "" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC는 백엔드 trying Stream에서 지원되지 않습니다" @@ -984,6 +1006,12 @@ msgid "second" msgid_plural "seconds" msgstr[0] "초" +#~ msgid "Hide temp." +#~ msgstr "온도 숨김." + +#~ msgid "PSK for" +#~ msgstr "PSK 키 값(비밀번호)" + #~ msgid "Mesh calibrate" #~ msgstr "메쉬 보정" @@ -1023,8 +1051,7 @@ msgstr[0] "초" #~ msgid "" #~ "Not supported for auto-detection, it needs to be configured in " #~ "klipperscreen.conf" -#~ msgstr "" -#~ "자동 감지는 지원되지 않으므로 klipperscreen.conf로 구성해야 합니다" +#~ msgstr "자동 감지는 지원되지 않으므로 klipperscreen.conf로 구성해야 합니다" #~ msgid "Unknown screw position" #~ msgstr "알 수 없는 스크류 위치" diff --git a/ks_includes/locales/lt/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/lt/LC_MESSAGES/KlipperScreen.mo index 9fa519ff6..27b7b9fa1 100644 Binary files a/ks_includes/locales/lt/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/lt/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/lt/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/lt/LC_MESSAGES/KlipperScreen.po index c985d456b..b53636251 100644 --- a/ks_includes/locales/lt/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/lt/LC_MESSAGES/KlipperScreen.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-07-16 13:09+0000\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-12-02 18:00+0000\n" "Last-Translator: vjurka \n" "Language-Team: Lithuanian \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (" "n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.9-dev\n" #, python-format msgid "%s will be updated to version" @@ -344,6 +344,9 @@ msgstr "Sąnaudos:" msgid "Font Size" msgstr "Šrifto dydis" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "Norėdami valdyti pele ar patikrinti jutiklinio ekrano tikslumą" + msgid "Forget" msgstr "Užmiršti" @@ -368,9 +371,6 @@ msgstr "Paslėpti" msgid "Hide sensors in Temp." msgstr "Slėpti temperatūros daviklius." -msgid "Hide temp." -msgstr "Slėpti temperatūrą." - msgid "Home" msgstr "Parkavimas" @@ -422,6 +422,9 @@ msgstr "Neteisinga" msgid "Invalid password" msgstr "Blogas slaptažodis" +msgid "Invalid temperature" +msgstr "Neteisinga temperatūra" + msgid "Inversely affects the icon size" msgstr "Atvirkščiai veikia piktogramos dydį" @@ -501,6 +504,9 @@ msgstr "Užkrauti" msgid "Loading..." msgstr "Užkraunama..." +msgid "Lock" +msgstr "Užrakinti" + msgid "Lost Connection to Moonraker" msgstr "Prarastas ryšys su Moonraker" @@ -631,9 +637,6 @@ msgstr "Tik perkėlimo skydeliui" msgid "Outdated by %d" msgstr "Pasenę %d" -msgid "PSK for" -msgstr "PSK" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "Paketas bus atnaujintas" @@ -643,6 +646,9 @@ msgstr[2] "Paketai bus atnaujinti" msgid "Part Fan" msgstr "Dirbinio ventiliatorius" +msgid "Password" +msgstr "Slaptažodis" + msgid "Password saved" msgstr "Slaptažodis išsaugotas" @@ -809,6 +815,9 @@ msgstr "Rodyti šildytuvo galią" msgid "Show Scrollbars Buttons" msgstr "Rodyti stumdymo juostą" +msgid "Show cursor" +msgstr "Rodyti kursorių" + msgid "Show only devices that are able to be set" msgstr "Rodyti tik tuos įrenginius, kuriuos galima nustatyti" @@ -879,6 +888,9 @@ msgstr "Temperatūra (°С)" msgid "Temperature" msgstr "Temperatūra" +msgid "Temperature too low to extrude" +msgstr "Per maža temperatūra ekstruzijai" + msgid "The system doesn't meet the minimum requirement" msgstr "Sistema neatitinka minimalių reikalavimų" @@ -906,6 +918,12 @@ msgstr "Nežinomas saugos tipas" msgid "Unload" msgstr "Iškrauti" +msgid "Unlock" +msgstr "Atrakinti" + +msgid "Unlock failed" +msgstr "Atrakinti nepavyko" + msgid "Unretract Extra Length" msgstr "Papildomas plastiko padavimo ilgis" @@ -924,6 +942,9 @@ msgstr "Atnaujinama" msgid "Useful for un-responsive touchscreens" msgstr "Naudinga nereaguojantiems jutikliniams ekranams" +msgid "User" +msgstr "Vartotojas" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC nepalaikoma, bandoma Stream" @@ -1005,6 +1026,12 @@ msgstr[0] "sekundė" msgstr[1] "sekundės" msgstr[2] "sekundžių" +#~ msgid "Hide temp." +#~ msgstr "Slėpti temperatūrą." + +#~ msgid "PSK for" +#~ msgstr "PSK" + #~ msgid "Are you sure you want to stop the calibration?" #~ msgstr "Ar tikrai norite sustabdyti kalibraciją?" diff --git a/ks_includes/locales/nl/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/nl/LC_MESSAGES/KlipperScreen.mo index c97a2c75e..22454bb3d 100644 Binary files a/ks_includes/locales/nl/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/nl/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/nl/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/nl/LC_MESSAGES/KlipperScreen.po index 2df158146..82aa808ed 100644 --- a/ks_includes/locales/nl/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/nl/LC_MESSAGES/KlipperScreen.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-07-23 00:09+0000\n" -"Last-Translator: Thijs Triemstra \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2025-01-08 14:01+0000\n" +"Last-Translator: Jelle van Campen \n" "Language-Team: Dutch \n" "Language: nl\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.10-dev\n" #, python-format msgid "%s will be updated to version" @@ -219,7 +219,7 @@ msgid "Disable for 12hs with am / pm" msgstr "Uitschakelen gedurende 12 uur met am / pm" msgid "Disconnect" -msgstr "" +msgstr "Ontkoppelen" msgid "Distance (mm)" msgstr "Afstand (mm)" @@ -343,6 +343,11 @@ msgstr "Flowrate:" msgid "Font Size" msgstr "Lettertype Grootte" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "" +"Voor muisbediening of om de nauwkeurigheid van het aanraakscherm te " +"verifiëren" + msgid "Forget" msgstr "Vergeet" @@ -367,9 +372,6 @@ msgstr "Verberg" msgid "Hide sensors in Temp." msgstr "Verberg sensoren in Temp." -msgid "Hide temp." -msgstr "Verberg temp." - msgid "Home" msgstr "Home" @@ -410,7 +412,7 @@ msgid "Input Shaper" msgstr "Input Shaper" msgid "Insufficient privileges" -msgstr "" +msgstr "Onvoldoende rechten" msgid "Interface" msgstr "Interface" @@ -421,8 +423,11 @@ msgstr "Ongeldig" msgid "Invalid password" msgstr "Ongeldig wachtwoord" +msgid "Invalid temperature" +msgstr "Ongeldige temperatuur" + msgid "Inversely affects the icon size" -msgstr "" +msgstr "Beïnvloedt de icoongrootte omgekeerd" msgid "Invert X" msgstr "Invert X" @@ -437,10 +442,10 @@ msgid "It may take more than 5 minutes depending on the heater power." msgstr "Het kan meer dan 5 minuten duren op basis van de heater power." msgid "It's possible that the configuration is not correct" -msgstr "" +msgstr "Het is mogelijk dat de configuratie incorrect is" msgid "Job Status" -msgstr "" +msgstr "Opdrachtstatus" msgid "Klipper Restart" msgstr "Klipper Herstarten" @@ -473,13 +478,13 @@ msgid "Large" msgstr "Groot" msgid "Last Duration" -msgstr "" +msgstr "Laatste duur" msgid "Last Used" msgstr "Laatst Gebruikt" msgid "Layer Height" -msgstr "" +msgstr "Laag Hoogte" msgid "Layer:" msgstr "Laag:" @@ -499,6 +504,9 @@ msgstr "Laad" msgid "Loading..." msgstr "Laden..." +msgid "Lock" +msgstr "Vergrendelen" + msgid "Lost Connection to Moonraker" msgstr "Verbinding met Moonraker verbroken" @@ -527,7 +535,7 @@ msgid "Max Velocity" msgstr "Max Velocity" msgid "Max:" -msgstr "" +msgstr "Max:" msgid "Maximum" msgstr "Maximum" @@ -545,16 +553,16 @@ msgid "Medium" msgstr "Medium" msgid "Memory" -msgstr "" +msgstr "Geheugen" msgid "Menu" msgstr "Menu" msgid "Minimum Cruise Ratio" -msgstr "" +msgstr "Minimale Cruise Ratio" msgid "Minimum:" -msgstr "" +msgstr "Minimum:" msgid "Modified" msgstr "Aangepast" @@ -578,13 +586,13 @@ msgid "Network" msgstr "Netwerk" msgid "Network connected" -msgstr "" +msgstr "Netwerk verbonden" msgid "Network disconnected" -msgstr "" +msgstr "Network verbroken" msgid "Network not found" -msgstr "" +msgstr "Netwerk niet gevonden" msgid "Never" msgstr "Nooit" @@ -596,7 +604,7 @@ msgid "No elegible macros:" msgstr "Macros komen niet in aanmerking:" msgid "No info available" -msgstr "" +msgstr "Geen info beschikbaar" msgid "No mesh has been loaded" msgstr "Geen mesh geladen" @@ -605,7 +613,7 @@ msgid "No wireless interface has been found" msgstr "Geen draadloze netwerk interface gevonden" msgid "Not all screens support this" -msgstr "" +msgstr "Niet alle schermen ondersteunen dit" msgid "Not working or not configured" msgstr "Niet werkend of niet geconfigureerd" @@ -620,18 +628,15 @@ msgid "Notifications" msgstr "Notificaties" msgid "Nozzle diameter" -msgstr "" +msgstr "Diameter mondstuk" msgid "Only for the move panel" -msgstr "" +msgstr "Enkel voor het bewegingspaneel" #, python-format msgid "Outdated by %d" msgstr "Verouderd sinds %d" -msgid "PSK for" -msgstr "PSK voor" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "Pakket word ge-update" @@ -640,6 +645,9 @@ msgstr[1] "Pakketten worden ge-update" msgid "Part Fan" msgstr "Part Ventilator" +msgid "Password" +msgstr "Wachtwoord" + msgid "Password saved" msgstr "Wachtwoord opgeslagen" @@ -659,7 +667,7 @@ msgid "Please recompile and flash the micro-controller." msgstr "Hercompileer en flash de micro-controller aub." msgid "Please wait" -msgstr "" +msgstr "Even geduld aub" msgid "Power" msgstr "Stroom" @@ -674,7 +682,7 @@ msgid "Pressure Advance:" msgstr "Pressure Advance:" msgid "Pressure advance" -msgstr "" +msgstr "Pressure advance" msgid "Print" msgstr "Print" @@ -725,7 +733,7 @@ msgid "Refresh" msgstr "Refresh" msgid "Remove network" -msgstr "" +msgstr "Verwijder netwerk" msgid "Rename/Move:" msgstr "Hernoem/beweeg:" @@ -755,7 +763,7 @@ msgid "Retrying" msgstr "Probeert opnieuw" msgid "Rotation invalid" -msgstr "" +msgstr "Rotatie ongeldig" msgid "Save" msgstr "Opslaan" @@ -786,7 +794,7 @@ msgid "Screws Adjust" msgstr "Schroeven Aanpassen" msgid "Screws not used:" -msgstr "" +msgstr "Ongebruikte schroeven:" msgid "Send" msgstr "Verstuur" @@ -806,8 +814,11 @@ msgstr "Toon Heater Stroom" msgid "Show Scrollbars Buttons" msgstr "Toon Scrollbars Knoppen" +msgid "Show cursor" +msgstr "Toon cursor" + msgid "Show only devices that are able to be set" -msgstr "" +msgstr "Toon enkel apparaten die ingesteld kunnen worden" msgid "Shutdown" msgstr "Afsluiten" @@ -855,7 +866,7 @@ msgid "Starting update for" msgstr "Update starten voor" msgid "Swaps buttons if they are on top of each other, affects other panels" -msgstr "" +msgstr "Wissel knoppen als ze over elkaar staan, beïnvloedt andere panelen" msgid "System" msgstr "Systeem" @@ -867,7 +878,7 @@ msgid "System Shutdown" msgstr "Systeem Afsluiten" msgid "System:" -msgstr "" +msgstr "Systeem:" msgid "Temp (°C)" msgstr "Temp (°C)" @@ -875,20 +886,23 @@ msgstr "Temp (°C)" msgid "Temperature" msgstr "Temperatuur" +msgid "Temperature too low to extrude" +msgstr "Temperatuur te laag voor extrude" + msgid "The system doesn't meet the minimum requirement" -msgstr "" +msgstr "Het systeem voldoet niet aan de minimum vereisten" msgid "This panel supports up-to 9 screws in a 3x3 Grid" -msgstr "" +msgstr "Dit paneel ondersteunt tot 9 schroeven in een 3x3 raster" msgid "This will affect screw positions and mesh graph" -msgstr "" +msgstr "Dit zal de schroefposities en mesh graph beïnvloeden" msgid "Timeout for screen black-out or power-off" -msgstr "" +msgstr "Timeout voor schermbeveiliging of uitschakelen" msgid "Timeout for screen black-out or power-off during printing" -msgstr "" +msgstr "Timeout voor schermbeveiliging of uitschakelen tijdens printen" msgid "Total:" msgstr "Totaal:" @@ -897,11 +911,17 @@ msgid "Unknown Heater" msgstr "Onbekende Heater" msgid "Unknown security type" -msgstr "" +msgstr "Onbekend beveiliging type" msgid "Unload" msgstr "Uitladen" +msgid "Unlock" +msgstr "Ontgrendelen" + +msgid "Unlock failed" +msgstr "Ontgrendelen mislukt" + msgid "Unretract Extra Length" msgstr "Unretract Extra Lengte" @@ -918,13 +938,16 @@ msgid "Updating" msgstr "Bezig met updaten" msgid "Useful for un-responsive touchscreens" -msgstr "" +msgstr "Nuttig voor niet-reagerende aanraakschermen" + +msgid "User" +msgstr "Gebruiker" msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC is niet ondersteund door de backend" msgid "Working" -msgstr "" +msgstr "Werkend" msgid "XY Move Speed (mm/s)" msgstr "XY Move Snelheid (mm/s)" @@ -954,11 +977,11 @@ msgstr[1] "commits" msgid "day" msgid_plural "days" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "dag" +msgstr[1] "dagen" msgid "g" -msgstr "" +msgstr "g" msgid "hour" msgid_plural "hours" @@ -989,12 +1012,18 @@ msgid "mm³/s" msgstr "mm³/s" msgid "s" -msgstr "" +msgstr "s" msgid "second" msgid_plural "seconds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "seconde" +msgstr[1] "seconden" + +#~ msgid "Hide temp." +#~ msgstr "Verberg temp." + +#~ msgid "PSK for" +#~ msgstr "PSK voor" #~ msgid "Mesh calibrate" #~ msgstr "Mesh kalibreren" diff --git a/ks_includes/locales/pl/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/pl/LC_MESSAGES/KlipperScreen.mo index 9a501f3a4..4a281ba09 100644 Binary files a/ks_includes/locales/pl/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/pl/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/pl/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/pl/LC_MESSAGES/KlipperScreen.po index a63b962fb..e36f16b7a 100644 --- a/ks_includes/locales/pl/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/pl/LC_MESSAGES/KlipperScreen.po @@ -3,9 +3,9 @@ msgid "" msgstr "" "Project-Id-Version: Polish (KlipperScreen)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-07-16 13:09+0000\n" -"Last-Translator: Marcin Laber \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-12-10 12:04+0000\n" +"Last-Translator: Julia \n" "Language-Team: Polish \n" "Language: pl\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.9-dev\n" #, python-format msgid "%s will be updated to version" @@ -340,6 +340,9 @@ msgstr "Przepływ:" msgid "Font Size" msgstr "Rozmiar czcionki" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "Do obsługi myszą lub zweryfikowania dokładności ekranu dotykowego" + msgid "Forget" msgstr "Zapomnij" @@ -364,9 +367,6 @@ msgstr "Ukryj" msgid "Hide sensors in Temp." msgstr "Ukryj sensory w sekcji temperatur" -msgid "Hide temp." -msgstr "Ukryj temp." - msgid "Home" msgstr "Bazuj" @@ -418,6 +418,9 @@ msgstr "Nieprawidłowy" msgid "Invalid password" msgstr "Nieprawidłowe hasło" +msgid "Invalid temperature" +msgstr "Nieprawidłowa temperatura" + msgid "Inversely affects the icon size" msgstr "Wpływa proporcjonalnie na rozmiar ikon" @@ -496,6 +499,9 @@ msgstr "Ładuj" msgid "Loading..." msgstr "Ładowanie..." +msgid "Lock" +msgstr "Zablokuj" + msgid "Lost Connection to Moonraker" msgstr "Utracono połączenie z Moonraker" @@ -626,9 +632,6 @@ msgstr "Tylko dla panelu ruchu" msgid "Outdated by %d" msgstr "Nieaktualny o %d" -msgid "PSK for" -msgstr "PSK dla" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "pakiet zostanie zaktualizowany" @@ -638,6 +641,9 @@ msgstr[2] "pakietów zostanie zaktualizowanych" msgid "Part Fan" msgstr "Chłodzenie wydruku" +msgid "Password" +msgstr "Hasło" + msgid "Password saved" msgstr "Hasło zostało zapisane" @@ -804,6 +810,9 @@ msgstr "Pokaż moc grzałki" msgid "Show Scrollbars Buttons" msgstr "Pokaż przyciski pasków przewijania" +msgid "Show cursor" +msgstr "Pokaż kursor" + msgid "Show only devices that are able to be set" msgstr "Pokaż tylko urządzenia możliwe do ustawienia" @@ -873,6 +882,9 @@ msgstr "Temperatura (°C)" msgid "Temperature" msgstr "Temperatura" +msgid "Temperature too low to extrude" +msgstr "Zbyt niska temperatura do wytłaczania" + msgid "The system doesn't meet the minimum requirement" msgstr "System nie spełnia wymagań minimalnych" @@ -902,6 +914,12 @@ msgstr "Nieznany rodzaj zabezpieczeń" msgid "Unload" msgstr "Wyładuj" +msgid "Unlock" +msgstr "Odblokuj" + +msgid "Unlock failed" +msgstr "Nie udało się odblokować" + msgid "Unretract Extra Length" msgstr "Dodatkowa ilość dla powrotu" @@ -920,6 +938,9 @@ msgstr "Aktualizowanie" msgid "Useful for un-responsive touchscreens" msgstr "Przydatne na mniej responsywnych ekranach dotykowych" +msgid "User" +msgstr "Użytkownik" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC nie jest wspierane przez backend próbujący streamować" @@ -1001,6 +1022,12 @@ msgstr[0] "sekunda" msgstr[1] "sekundy" msgstr[2] "sekund" +#~ msgid "Hide temp." +#~ msgstr "Ukryj temp." + +#~ msgid "PSK for" +#~ msgstr "PSK dla" + #~ msgid "Mesh calibrate" #~ msgstr "Kalibracja siatki" diff --git a/ks_includes/locales/pt/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/pt/LC_MESSAGES/KlipperScreen.mo index 3c9afd1b1..18d96ad4b 100644 Binary files a/ks_includes/locales/pt/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/pt/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/pt/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/pt/LC_MESSAGES/KlipperScreen.po index 37a353294..27cf9bea7 100644 --- a/ks_includes/locales/pt/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/pt/LC_MESSAGES/KlipperScreen.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-08-09 23:09+0000\n" -"Last-Translator: Matheus Mösken Diegues \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-10-05 13:15+0000\n" +"Last-Translator: Paulo Henrique \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.8-dev\n" #, python-format msgid "%s will be updated to version" @@ -92,13 +92,13 @@ msgid "Auto-calibrate" msgstr "Calibrar automaticamente" msgid "Auto-close notifications" -msgstr "Fechar notificações autom." +msgstr "Fechamento Automático das Notificações" msgid "Auto-open Extrude On Pause" msgstr "Abrir Ext. automaticamente em Pausa" msgid "Auto-scroll" -msgstr "Acompanhar Conteúdo" +msgstr "Rolar Automaticamente" msgid "Bed Level" msgstr "Nível da Mesa" @@ -219,7 +219,7 @@ msgid "Disable for 12hs with am / pm" msgstr "" msgid "Disconnect" -msgstr "" +msgstr "Desconectar" msgid "Distance (mm)" msgstr "Distancia (mm)" @@ -260,13 +260,13 @@ msgid "Error: Couldn't get a position to probe" msgstr "Erro: Não foi possível obter uma posição para a sonda" msgid "Estimated Time" -msgstr "" +msgstr "Tempo estimado" msgid "Estimated Time Method" msgstr "Método de Tempo Estimado" msgid "Example" -msgstr "" +msgstr "Exemplo" msgid "Exclude Object" msgstr "Excluir Objeto" @@ -290,7 +290,7 @@ msgid "Failed to delete connection" msgstr "" msgid "Failed to initialize" -msgstr "" +msgstr "Falha ao inicializar" msgid "Failed, adjust position first" msgstr "Falhou, ajuste a posição primeiro" @@ -343,17 +343,20 @@ msgstr "Flow:" msgid "Font Size" msgstr "Tamanho da fonte" -msgid "Forget" +msgid "For mouse control or to verify touchscreen accuracy" msgstr "" +msgid "Forget" +msgstr "Esquecer" + msgid "Full Update" msgstr "Atualizar Tudo" msgid "Gcodes" -msgstr "" +msgstr "Gcodes" msgid "Getting IP address" -msgstr "" +msgstr "Obter Endereço IP" msgid "Go Back" msgstr "Voltar" @@ -367,9 +370,6 @@ msgstr "Ocultar" msgid "Hide sensors in Temp." msgstr "Ocultar sensores na Temperatura." -msgid "Hide temp." -msgstr "Ocultar Temp." - msgid "Home" msgstr "Zerar" @@ -410,7 +410,7 @@ msgid "Input Shaper" msgstr "Moldagem Assistiva" msgid "Insufficient privileges" -msgstr "" +msgstr "Privilégios insuficientes" msgid "Interface" msgstr "Interface" @@ -421,6 +421,9 @@ msgstr "Inválido" msgid "Invalid password" msgstr "Senha Inválida" +msgid "Invalid temperature" +msgstr "" + msgid "Inversely affects the icon size" msgstr "" @@ -480,7 +483,7 @@ msgid "Last Used" msgstr "Último Usado" msgid "Layer Height" -msgstr "" +msgstr "Altura da Camada" msgid "Layer:" msgstr "Camada:" @@ -500,6 +503,9 @@ msgstr "Carregar" msgid "Loading..." msgstr "Carregando..." +msgid "Lock" +msgstr "" + msgid "Lost Connection to Moonraker" msgstr "Conexão Perdida com Moonraker" @@ -528,7 +534,7 @@ msgid "Max Velocity" msgstr "Velocidade máxima" msgid "Max:" -msgstr "" +msgstr "Max:" msgid "Maximum" msgstr "Máximo" @@ -546,7 +552,7 @@ msgid "Medium" msgstr "Médio" msgid "Memory" -msgstr "" +msgstr "Memória" msgid "Menu" msgstr "Menu" @@ -555,7 +561,7 @@ msgid "Minimum Cruise Ratio" msgstr "" msgid "Minimum:" -msgstr "" +msgstr "Minimo:" msgid "Modified" msgstr "Modificado" @@ -579,13 +585,13 @@ msgid "Network" msgstr "Rede" msgid "Network connected" -msgstr "" +msgstr "Conectado à rede" msgid "Network disconnected" -msgstr "" +msgstr "desconectado da rede" msgid "Network not found" -msgstr "" +msgstr "Rede não encontrada" msgid "Never" msgstr "Nunca" @@ -597,7 +603,7 @@ msgid "No elegible macros:" msgstr "Sem macros elegíveis:" msgid "No info available" -msgstr "" +msgstr "Sem informações disponíveis" msgid "No mesh has been loaded" msgstr "Nenhuma malha foi carregada" @@ -621,7 +627,7 @@ msgid "Notifications" msgstr "Notificações" msgid "Nozzle diameter" -msgstr "" +msgstr "Diâmetro do Bico" msgid "Only for the move panel" msgstr "" @@ -630,9 +636,6 @@ msgstr "" msgid "Outdated by %d" msgstr "Desatualizado por %d" -msgid "PSK for" -msgstr "PSK por" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "O pacote será atualizado" @@ -641,6 +644,9 @@ msgstr[1] "Os pacotes serão atualizados" msgid "Part Fan" msgstr "Controle da Ventoinha" +msgid "Password" +msgstr "" + msgid "Password saved" msgstr "Senha Salva" @@ -660,7 +666,7 @@ msgid "Please recompile and flash the micro-controller." msgstr "Por favor, recompile e atualize o microcontrolador." msgid "Please wait" -msgstr "" +msgstr "Por favor, aguarde" msgid "Power" msgstr "Ligar" @@ -726,7 +732,7 @@ msgid "Refresh" msgstr "Recarregar" msgid "Remove network" -msgstr "" +msgstr "Remover Rede" msgid "Rename/Move:" msgstr "Renomear/Mover:" @@ -762,7 +768,7 @@ msgid "Save" msgstr "Salvar" msgid "Save Config" -msgstr "Salvar Config." +msgstr "Salvar Configurações" msgid "Save Z" msgstr "Salvar Eixo Z" @@ -796,7 +802,7 @@ msgid "Set Temp" msgstr "Definir Temperatura" msgid "Settings" -msgstr "Definições" +msgstr "Configurações" msgid "Show" msgstr "Mostrar" @@ -807,6 +813,9 @@ msgstr "Exibir Potência do Aquecedor" msgid "Show Scrollbars Buttons" msgstr "Botões auxiliares de Rolagem" +msgid "Show cursor" +msgstr "" + msgid "Show only devices that are able to be set" msgstr "" @@ -868,14 +877,17 @@ msgid "System Shutdown" msgstr "Desligar Sistema" msgid "System:" -msgstr "" +msgstr "Sistema:" msgid "Temp (°C)" -msgstr "Temp (°C)" +msgstr "Temperatura (°C)" msgid "Temperature" msgstr "Temperatura" +msgid "Temperature too low to extrude" +msgstr "" + msgid "The system doesn't meet the minimum requirement" msgstr "" @@ -903,6 +915,12 @@ msgstr "" msgid "Unload" msgstr "Descarregar" +msgid "Unlock" +msgstr "" + +msgid "Unlock failed" +msgstr "" + msgid "Unretract Extra Length" msgstr "Comprimento Extra sem Recuar" @@ -921,6 +939,9 @@ msgstr "Atualizando" msgid "Useful for un-responsive touchscreens" msgstr "" +msgid "User" +msgstr "" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC não é suportado pela tentativa de Stream do backend" @@ -955,8 +976,8 @@ msgstr[1] "compromete" msgid "day" msgid_plural "days" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Dia" +msgstr[1] "Dias" msgid "g" msgstr "" @@ -994,8 +1015,14 @@ msgstr "" msgid "second" msgid_plural "seconds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Segundo" +msgstr[1] "Segundos" + +#~ msgid "Hide temp." +#~ msgstr "Ocultar Temp." + +#~ msgid "PSK for" +#~ msgstr "PSK por" #~ msgid "Mesh calibrate" #~ msgstr "Calibrar Malha" diff --git a/ks_includes/locales/pt_BR/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/pt_BR/LC_MESSAGES/KlipperScreen.mo index b34d3933f..e5434ac4f 100644 Binary files a/ks_includes/locales/pt_BR/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/pt_BR/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/pt_BR/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/pt_BR/LC_MESSAGES/KlipperScreen.po index 8437ca65d..a4ff3a743 100644 --- a/ks_includes/locales/pt_BR/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/pt_BR/LC_MESSAGES/KlipperScreen.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-05-07 02:10+0000\n" -"Last-Translator: Rui Menezes \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2025-01-23 05:01+0000\n" +"Last-Translator: Erick Andrade \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.5.4-dev\n" +"X-Generator: Weblate 5.10-dev\n" #, python-format msgid "%s will be updated to version" @@ -173,14 +173,14 @@ msgid "Connected" msgstr "Conectado" msgid "Connecting" -msgstr "" +msgstr "Conectando" #, python-format msgid "Connecting to %s" msgstr "Conectando a %s" msgid "Connection failed" -msgstr "" +msgstr "Conexão falhou" msgid "Console" msgstr "Console" @@ -189,10 +189,10 @@ msgid "Cooldown" msgstr "Resfriando" msgid "Couldn't add network" -msgstr "" +msgstr "Não foi possível adicionar rede" msgid "Current" -msgstr "" +msgstr "Atual" msgid "Current percentage and graph line" msgstr "Porcentagem atual e linha do gráfico" @@ -204,7 +204,7 @@ msgid "Date" msgstr "Data" msgid "Delete" -msgstr "" +msgstr "Deletar" msgid "Delete Directory?" msgstr "Deletar Diretório?" @@ -219,14 +219,14 @@ msgid "Disable for 12hs with am / pm" msgstr "Desativar por 12 horas com AM/PM" msgid "Disconnect" -msgstr "" +msgstr "Desconectar" msgid "Distance (mm)" msgstr "Distância (mm)" #, python-format msgid "Do you want to forget or disconnect %s?" -msgstr "" +msgstr "Você quer esquecer ou desconectar %s?" #, python-format msgid "Do you want to recover %s?" @@ -260,13 +260,13 @@ msgid "Error: Couldn't get a position to probe" msgstr "Erro: Não foi possível obter uma posição para sondar" msgid "Estimated Time" -msgstr "" +msgstr "Tempo estimado" msgid "Estimated Time Method" msgstr "Método de Tempo Estimado" msgid "Example" -msgstr "" +msgstr "Exemplo" msgid "Exclude Object" msgstr "Excluir Objeto" @@ -287,10 +287,10 @@ msgid "Extrusion -" msgstr "Extrusão -" msgid "Failed to delete connection" -msgstr "" +msgstr "Falha ao deletar conexão" msgid "Failed to initialize" -msgstr "" +msgstr "Falha ao inicializar" msgid "Failed, adjust position first" msgstr "Falha, primeiro ajuste a posição" @@ -299,7 +299,7 @@ msgid "Fan" msgstr "Ventilador" msgid "Filament" -msgstr "" +msgstr "Filamento" msgid "Filament Used" msgstr "Filamento Utilizado" @@ -343,17 +343,20 @@ msgstr "Taxa de fluxo:" msgid "Font Size" msgstr "Tamanho da Fonte" -msgid "Forget" +msgid "For mouse control or to verify touchscreen accuracy" msgstr "" +msgid "Forget" +msgstr "Esquecer" + msgid "Full Update" msgstr "Atualização Completa" msgid "Gcodes" -msgstr "" +msgstr "Gcodes" msgid "Getting IP address" -msgstr "" +msgstr "Obtendo endereço IP" msgid "Go Back" msgstr "Retornar" @@ -367,9 +370,6 @@ msgstr "Esconder" msgid "Hide sensors in Temp." msgstr "Esconder sensores em Temp." -msgid "Hide temp." -msgstr "Esconder temp." - msgid "Home" msgstr "Posicionar na Origem" @@ -410,7 +410,7 @@ msgid "Input Shaper" msgstr "Modelagem de Entrada (Input Shaper)" msgid "Insufficient privileges" -msgstr "" +msgstr "Privilégios insuficientes" msgid "Interface" msgstr "Interface" @@ -421,6 +421,9 @@ msgstr "Inválido" msgid "Invalid password" msgstr "Senha Inválida" +msgid "Invalid temperature" +msgstr "Temperatura inválida" + msgid "Inversely affects the icon size" msgstr "Afeta inversamente o tamanho do ícone" @@ -440,7 +443,7 @@ msgid "It's possible that the configuration is not correct" msgstr "É possível que a configuração não esteja correta" msgid "Job Status" -msgstr "" +msgstr "Status do job" msgid "Klipper Restart" msgstr "Reiniciar Klipper" @@ -473,13 +476,13 @@ msgid "Large" msgstr "Grande" msgid "Last Duration" -msgstr "" +msgstr "Última duração" msgid "Last Used" msgstr "Usado pela Última Vez" msgid "Layer Height" -msgstr "" +msgstr "Altura da camada" msgid "Layer:" msgstr "Camada:" @@ -499,6 +502,9 @@ msgstr "Carregar" msgid "Loading..." msgstr "Carregando..." +msgid "Lock" +msgstr "Trava" + msgid "Lost Connection to Moonraker" msgstr "Conexão perdida com o Moonraker" @@ -527,7 +533,7 @@ msgid "Max Velocity" msgstr "Velocidade Max." msgid "Max:" -msgstr "" +msgstr "Max:" msgid "Maximum" msgstr "Máximo" @@ -545,7 +551,7 @@ msgid "Medium" msgstr "Médio" msgid "Memory" -msgstr "" +msgstr "Memória" msgid "Menu" msgstr "Menu" @@ -554,7 +560,7 @@ msgid "Minimum Cruise Ratio" msgstr "Taxa Mínima de Deslocamento" msgid "Minimum:" -msgstr "" +msgstr "Mínimo:" msgid "Modified" msgstr "Modificado" @@ -578,13 +584,13 @@ msgid "Network" msgstr "Rede" msgid "Network connected" -msgstr "" +msgstr "Rede conectada" msgid "Network disconnected" -msgstr "" +msgstr "Rede desconectada" msgid "Network not found" -msgstr "" +msgstr "Rede não encontrada" msgid "Never" msgstr "Nunca" @@ -596,7 +602,7 @@ msgid "No elegible macros:" msgstr "Macros não aceitas:" msgid "No info available" -msgstr "" +msgstr "Sem informação disponível" msgid "No mesh has been loaded" msgstr "Nenhuma malha foi carregada" @@ -620,18 +626,15 @@ msgid "Notifications" msgstr "Notificações" msgid "Nozzle diameter" -msgstr "" +msgstr "Diâmetro do bico" msgid "Only for the move panel" -msgstr "" +msgstr "Somente para o painel de movimentação" #, python-format msgid "Outdated by %d" msgstr "Desatualizado por %d" -msgid "PSK for" -msgstr "PSK para" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "O pacote será atualizado" @@ -640,6 +643,9 @@ msgstr[1] "Os pacotes serão atualizados" msgid "Part Fan" msgstr "Ventilador da Peça" +msgid "Password" +msgstr "Senha" + msgid "Password saved" msgstr "Senha salva" @@ -659,7 +665,7 @@ msgid "Please recompile and flash the micro-controller." msgstr "Por favor recompile e grave o microcontrolador." msgid "Please wait" -msgstr "" +msgstr "Favor aguardar" msgid "Power" msgstr "Ligar" @@ -806,6 +812,9 @@ msgstr "Mostrar Potência do Aquecedor" msgid "Show Scrollbars Buttons" msgstr "Mostrar Botões das Barras de Rolagem" +msgid "Show cursor" +msgstr "Mostrar cursor" + msgid "Show only devices that are able to be set" msgstr "Mostrar apenas dispositivos que podem ser configurados" @@ -825,7 +834,7 @@ msgid "Small" msgstr "Pequeno" msgid "Smooth time" -msgstr "" +msgstr "Tempo de suavização (Smooth time)" msgid "Speed (mm/s)" msgstr "Velocidade (mm/s)" @@ -856,6 +865,7 @@ msgstr "Iniciando atualização para" msgid "Swaps buttons if they are on top of each other, affects other panels" msgstr "" +"Inverte os botões se estiverem em cima um do outro, afeta outros painéis" msgid "System" msgstr "Sistema" @@ -867,7 +877,7 @@ msgid "System Shutdown" msgstr "Desligar Sistema" msgid "System:" -msgstr "" +msgstr "Sistema:" msgid "Temp (°C)" msgstr "Temp (°C)" @@ -875,20 +885,23 @@ msgstr "Temp (°C)" msgid "Temperature" msgstr "Temperatura" +msgid "Temperature too low to extrude" +msgstr "Temperatura muito baixa para extrusão" + msgid "The system doesn't meet the minimum requirement" -msgstr "" +msgstr "O sistema não possui os requisitos mínimos" msgid "This panel supports up-to 9 screws in a 3x3 Grid" msgstr "Este painel suporta até 9 parafusos em uma grade 3x3" msgid "This will affect screw positions and mesh graph" -msgstr "" +msgstr "Isso irá afetar a posição dos parafusos e o gráfico mesh" msgid "Timeout for screen black-out or power-off" msgstr "Tempo limite para tela apagar ou desligar" msgid "Timeout for screen black-out or power-off during printing" -msgstr "" +msgstr "Timeout para escurecimento ou desligamento da tela durante a impressão" msgid "Total:" msgstr "Total:" @@ -897,11 +910,17 @@ msgid "Unknown Heater" msgstr "Aquecedor Desconhecido" msgid "Unknown security type" -msgstr "" +msgstr "Tipo de segurança desconhecido" msgid "Unload" msgstr "Descarregar" +msgid "Unlock" +msgstr "Destravar" + +msgid "Unlock failed" +msgstr "Destravamento falhou" + msgid "Unretract Extra Length" msgstr "Comprimento Extra da inversão de retração" @@ -920,11 +939,14 @@ msgstr "Atualizando" msgid "Useful for un-responsive touchscreens" msgstr "Útil para telas sensíveis ao toque não responsivas" +msgid "User" +msgstr "Usuário" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC não é suportado pelo backend de transmissão" msgid "Working" -msgstr "" +msgstr "Trabalhando" msgid "XY Move Speed (mm/s)" msgstr "Velocidade de Movimentação XY (mm/s)" @@ -954,11 +976,11 @@ msgstr[1] "comprometimentos" msgid "day" msgid_plural "days" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "dia" +msgstr[1] "dias" msgid "g" -msgstr "" +msgstr "g" msgid "hour" msgid_plural "hours" @@ -989,12 +1011,18 @@ msgid "mm³/s" msgstr "mm³/s" msgid "s" -msgstr "" +msgstr "s" msgid "second" msgid_plural "seconds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "segundo" +msgstr[1] "segundos" + +#~ msgid "Hide temp." +#~ msgstr "Esconder temp." + +#~ msgid "PSK for" +#~ msgstr "PSK para" #~ msgid "Are you sure you want to stop the calibration?" #~ msgstr "Tem certeza de que deseja interromper a calibração?" diff --git a/ks_includes/locales/ru/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/ru/LC_MESSAGES/KlipperScreen.mo index 86fc2f8b1..beead5369 100644 Binary files a/ks_includes/locales/ru/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/ru/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/ru/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/ru/LC_MESSAGES/KlipperScreen.po index 4984569a8..5c1a460b6 100644 --- a/ks_includes/locales/ru/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/ru/LC_MESSAGES/KlipperScreen.po @@ -6,18 +6,16 @@ msgid "" msgstr "" "Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-07-05 19:09+0000\n" -"Last-Translator: Артем \n" -"Language-Team: Russian \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2025-02-06 16:15+0300\n" +"Last-Translator: gfbdrgng \n" +"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 5.7-dev\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 2.0.7\n" "X-Poedit-Flags-xgettext: --add-comments\n" #, python-format @@ -63,7 +61,7 @@ msgid "Apply %s%.3f offset to Probe?" msgstr "Применить смещение %s%.3f к пробе?" msgid "Archived" -msgstr "Архивные" +msgstr "Показ. архив" msgid "Are you sure do you want to exclude the object?" msgstr "Вы уверены, что хотите исключить объект?" @@ -96,7 +94,7 @@ msgid "Auto-close notifications" msgstr "Автозакрытие уведомлений" msgid "Auto-open Extrude On Pause" -msgstr "Автооткрытие меню Extrude при паузе" +msgstr "Автооткрытие меню \"Экструзия\" при паузе" msgid "Auto-scroll" msgstr "Автопрокрутка" @@ -108,7 +106,7 @@ msgid "Bed Mesh" msgstr "Сетка стола" msgid "Both" -msgstr "" +msgstr "Оба" msgid "Calibrate" msgstr "Калибровка" @@ -140,11 +138,9 @@ msgstr "Отмена" msgid "Cannot connect to Moonraker" msgstr "Не удается подключиться к Moonraker" -#, fuzzy msgid "Changes how the interface looks" msgstr "Изменение внешнего вида интерфейса" -#, fuzzy msgid "Changes how the time remaining is calculated" msgstr "Редактировать расчет оставшегося времени" @@ -164,13 +160,13 @@ msgid "Close" msgstr "Закрыть" msgid "Close messages after a timeout" -msgstr "" +msgstr "Закрывать уведомление через время" msgid "Complete" msgstr "Готово" msgid "Confirm Emergency Stop" -msgstr "Подтвердить аварийную остановку" +msgstr "Подтверждение аварийной остановки" msgid "Connected" msgstr "Подключено" @@ -197,7 +193,6 @@ msgstr "Не удалось добавить сеть" msgid "Current" msgstr "Текущий" -#, fuzzy msgid "Current percentage and graph line" msgstr "Текущий процент и линия графика" @@ -214,7 +209,7 @@ msgid "Delete Directory?" msgstr "Удалить каталог?" msgid "Delete File?" -msgstr "Удалить Файл?" +msgstr "Удалить файл?" msgid "Disable Motors" msgstr "Отключить моторы" @@ -226,7 +221,7 @@ msgid "Disconnect" msgstr "Отключить" msgid "Distance (mm)" -msgstr "Расстояние (mm)" +msgstr "Расстояние (мм)" #, python-format msgid "Do you want to forget or disconnect %s?" @@ -243,32 +238,31 @@ msgid "Emergency Stop" msgstr "Аварийная остановка" msgid "Enable screen power management" -msgstr "" +msgstr "Включить панель управление питанием" msgid "Error" msgstr "Ошибка" -#, fuzzy msgid "Error clearing active spool" msgstr "Ошибка при очистке активной катушки" msgid "Error getting active spool" -msgstr "" +msgstr "Ошибка получения активной катушки" msgid "Error setting active spool" -msgstr "" +msgstr "Ошибка установки активной катушки" msgid "Error trying to fetch spools" -msgstr "" +msgstr "Ошибка при попытке получить катушки" msgid "Error: Couldn't get a position to probe" -msgstr "" +msgstr "Ошибка: Не удалось получить позицию для зондирования" msgid "Estimated Time" msgstr "Расчетное время" msgid "Estimated Time Method" -msgstr "Расчётное время" +msgstr "Метод расчета времени" msgid "Example" msgstr "Пример" @@ -280,10 +274,13 @@ msgid "Extra Large" msgstr "Очень большой" msgid "Extrude" -msgstr "Заправить" +msgstr "Экструзия" + +msgid "Unretract" +msgstr "Выдавить" msgid "Extruders" -msgstr "" +msgstr "Экструдеры" msgid "Extrusion +" msgstr "Поток +" @@ -292,10 +289,10 @@ msgid "Extrusion -" msgstr "Поток -" msgid "Failed to delete connection" -msgstr "" +msgstr "Не удалось удалить соединение" msgid "Failed to initialize" -msgstr "" +msgstr "Не удалось инициализировать" msgid "Failed, adjust position first" msgstr "Ошибка. Сначала измените положение" @@ -370,7 +367,7 @@ msgid "Hide" msgstr "Скрывать" msgid "Hide sensors in Temp." -msgstr "Скрыть датчики в Temp." +msgstr "Скрыть датчики в панели \"Температура\"." msgid "Hide temp." msgstr "Скрыть температуру." @@ -409,13 +406,13 @@ msgid "Initializing printer..." msgstr "Принтер запускается..." msgid "Initiate a PID calibration for:" -msgstr "Запустить калибровку ПИД-регулятора для:" +msgstr "Запустить калибровку ПИД для:" msgid "Input Shaper" -msgstr "" +msgstr "Входной шейпер" msgid "Insufficient privileges" -msgstr "" +msgstr "Недостаточно привилегий" msgid "Interface" msgstr "Интерфейс" @@ -426,8 +423,11 @@ msgstr "Неверный" msgid "Invalid password" msgstr "Неверный пароль" +msgid "Password" +msgstr "Пароль" + msgid "Inversely affects the icon size" -msgstr "" +msgstr "Обратно влияет на размер значка" msgid "Invert X" msgstr "Инверсия X" @@ -442,13 +442,13 @@ msgid "It may take more than 5 minutes depending on the heater power." msgstr "В зависимости от мощности нагревателя это может занять более 5 минут." msgid "It's possible that the configuration is not correct" -msgstr "" +msgstr "Возможно, конфигурация неверна" msgid "Job Status" -msgstr "" +msgstr "Статус работы" msgid "Klipper Restart" -msgstr "Klipper Рестарт" +msgstr "Klipper перезагружается" msgid "Klipper has disconnected" msgstr "Нет связи с Klipper" @@ -457,7 +457,7 @@ msgid "Klipper has encountered an error." msgstr "Klipper обнаружил ошибку." msgid "Klipper has shutdown" -msgstr "Klipper отключился" +msgstr "Klipper выключился" msgid "Klipper is attempting to start" msgstr "Klipper готов" @@ -465,10 +465,8 @@ msgstr "Klipper готов" msgid "Klipper will reboot" msgstr "Klipper перезагрузится" -msgid "" -"LOAD_FILAMENT/UNLOAD_FILAMENT are hidden and should be used from extrude" -msgstr "" -"LOAD_FILAMENT/UNLOAD_FILAMENT скрыты и должны использоваться из extrude" +msgid "LOAD_FILAMENT/UNLOAD_FILAMENT are hidden and should be used from extrude" +msgstr "LOAD_FILAMENT/UNLOAD_FILAMENT скрыты и должны использоваться из extrude" msgid "Language" msgstr "Язык" @@ -477,13 +475,13 @@ msgid "Large" msgstr "Большой" msgid "Last Duration" -msgstr "" +msgstr "Последняя продолжительность" msgid "Last Used" -msgstr "Последнее использование" +msgstr "Посл. использование" msgid "Layer Height" -msgstr "" +msgstr "Высота слоя" msgid "Layer:" msgstr "Слой:" @@ -498,13 +496,13 @@ msgid "Limits" msgstr "Ограничения" msgid "Load" -msgstr "Загрузить" +msgstr "Загрузить филамент" msgid "Loading..." msgstr "Загрузка..." msgid "Lost Connection to Moonraker" -msgstr "" +msgstr "Потеряно соединение с Moonraker" msgid "Lower Nozzle" msgstr "Поднять стол" @@ -530,8 +528,11 @@ msgstr "Максимальное ускорение" msgid "Max Velocity" msgstr "Максимальная скорость" +msgid "Show Lock Button" +msgstr "Показать блокировку" + msgid "Max:" -msgstr "" +msgstr "Макс:" msgid "Maximum" msgstr "Максимум" @@ -555,10 +556,10 @@ msgid "Menu" msgstr "Меню" msgid "Minimum Cruise Ratio" -msgstr "" +msgstr "Минимальный коэффициент крейсерской скорости" msgid "Minimum:" -msgstr "" +msgstr "Минимум:" msgid "Modified" msgstr "Изменено" @@ -570,7 +571,7 @@ msgid "More" msgstr "Больше" msgid "Move" -msgstr "Двигать" +msgstr "Движение" msgid "Move Distance (mm)" msgstr "Дистанция перемещения (мм)" @@ -578,6 +579,9 @@ msgstr "Дистанция перемещения (мм)" msgid "Name" msgstr "Имя" +msgid "Actions" +msgstr "Действия" + msgid "Network" msgstr "Сеть" @@ -600,7 +604,7 @@ msgid "No elegible macros:" msgstr "Нет понятных макросов:" msgid "No info available" -msgstr "" +msgstr "Информация недоступна" msgid "No mesh has been loaded" msgstr "Сетка стола не загружена" @@ -627,7 +631,7 @@ msgid "Nozzle diameter" msgstr "Диаметр сопла" msgid "Only for the move panel" -msgstr "" +msgstr "Только для панели перемещения" #, python-format msgid "Outdated by %d" @@ -643,7 +647,10 @@ msgstr[1] "Пакеты будут обновляться" msgstr[2] "Пакеты будут обновляться" msgid "Part Fan" -msgstr "Вентилятор обдува детали" +msgstr "Вентиляторы обдува детали" + +msgid "Chamber Fan" +msgstr "Вентиляторы камеры" msgid "Password saved" msgstr "Пароль сохранен" @@ -661,10 +668,10 @@ msgid "Pins" msgstr "Пины" msgid "Please recompile and flash the micro-controller." -msgstr "Прошейте заново микроконтроллер." +msgstr "Прошейте микроконтроллер заново." msgid "Please wait" -msgstr "Пожалуйста подождите" +msgstr "Ожидайте" msgid "Power" msgstr "Питание" @@ -673,13 +680,13 @@ msgid "Power On Printer" msgstr "Включить принтер" msgid "Pressure Advance" -msgstr "" +msgstr "Pressure Advance" msgid "Pressure Advance:" -msgstr "" +msgstr "Pressure Advance:" msgid "Pressure advance" -msgstr "" +msgstr "Pressure advance" msgid "Print" msgstr "Печать" @@ -730,7 +737,7 @@ msgid "Refresh" msgstr "Обновить" msgid "Remove network" -msgstr "" +msgstr "Удалить сеть" msgid "Rename/Move:" msgstr "Переименовать/переместить:" @@ -760,7 +767,7 @@ msgid "Retrying" msgstr "Повторная попытка" msgid "Rotation invalid" -msgstr "" +msgstr "Неверный переворот" msgid "Save" msgstr "Сохранить" @@ -791,7 +798,7 @@ msgid "Screws Adjust" msgstr "Настроить винты" msgid "Screws not used:" -msgstr "" +msgstr "Неиспользуемые винты:" msgid "Send" msgstr "Отправить" @@ -812,7 +819,7 @@ msgid "Show Scrollbars Buttons" msgstr "Показать полосу прокрутки" msgid "Show only devices that are able to be set" -msgstr "" +msgstr "Показывать только те , которые можно настроить" msgid "Shutdown" msgstr "Выключить" @@ -830,7 +837,7 @@ msgid "Small" msgstr "Маленький" msgid "Smooth time" -msgstr "" +msgstr "Время сглаживания" msgid "Speed (mm/s)" msgstr "Скорость (мм/с)" @@ -860,7 +867,7 @@ msgid "Starting update for" msgstr "Запуск обновления для" msgid "Swaps buttons if they are on top of each other, affects other panels" -msgstr "" +msgstr "Меняет местами кнопки, если они находятся друг над другом, влияет на другие панели" msgid "System" msgstr "Система" @@ -872,7 +879,7 @@ msgid "System Shutdown" msgstr "Выключить" msgid "System:" -msgstr "" +msgstr "Система:" msgid "Temp (°C)" msgstr "Температура (°С)" @@ -881,19 +888,19 @@ msgid "Temperature" msgstr "Tемпература" msgid "The system doesn't meet the minimum requirement" -msgstr "" +msgstr "Система не соответствует минимальным требованиям" msgid "This panel supports up-to 9 screws in a 3x3 Grid" -msgstr "" +msgstr "Эта панель поддерживает до 9 винтов в сетке 3x3" msgid "This will affect screw positions and mesh graph" -msgstr "" +msgstr "Это повлияет на положение винтов и график сетки" msgid "Timeout for screen black-out or power-off" -msgstr "" +msgstr "Время до затемнения экрана" msgid "Timeout for screen black-out or power-off during printing" -msgstr "" +msgstr "Время до затемнения экрана во время печати" msgid "Total:" msgstr "Итого:" @@ -901,11 +908,17 @@ msgstr "Итого:" msgid "Unknown Heater" msgstr "Неизвестный нагреватель" +msgid "Remaining weight" +msgstr "Оставшийся вес" + +msgid "Remaining length" +msgstr "Оставшаяся длина" + msgid "Unknown security type" -msgstr "" +msgstr "Неизвестный тип безопасности" msgid "Unload" -msgstr "Выгрузить" +msgstr "Выгрузить филамент" msgid "Unretract Extra Length" msgstr "Дополнительная длина подачи перед возобновлением печати" @@ -917,20 +930,31 @@ msgid "Up To Date" msgstr "Обновлено" msgid "Update" -msgstr "Обновить" +msgstr "Обновления" msgid "Updating" msgstr "Обновление" +msgid "Show cursor" +msgstr "Отображать курсор" + +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "Для управления мышью или для проверки точности сенсора" + +msgid "Lock" +msgstr "Заблокировать" + +msgid "Unlock" +msgstr "Разблокировать" + msgid "Useful for un-responsive touchscreens" -msgstr "" +msgstr "Полезно для неотзывчивых сенсорных экранов" msgid "WebRTC is not supported by the backend trying Stream" -msgstr "" -"Отсутствует поддержка WebRTC у бэкенда, который пытается передать поток" +msgstr "Отсутствует поддержка WebRTC у бэкенда, который пытается передать поток" msgid "Working" -msgstr "" +msgstr "Работает" msgid "XY Move Speed (mm/s)" msgstr "Скорость перемещения по осям XY (мм/с)" @@ -948,7 +972,7 @@ msgid "Z Speed (mm/s)" msgstr "Скорость оси Z (мм/с)" msgid "Z Tilt" -msgstr "Z Наклон" +msgstr "Калибр. стола" msgid "Z offset:" msgstr "Смещение Z:" @@ -961,12 +985,12 @@ msgstr[2] "изменений" msgid "day" msgid_plural "days" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "день" +msgstr[1] "дня" +msgstr[2] "дней" msgid "g" -msgstr "" +msgstr "г" msgid "hour" msgid_plural "hours" @@ -999,235 +1023,85 @@ msgid "mm³/s" msgstr "мм³/с" msgid "s" -msgstr "" +msgstr "с" msgid "second" msgid_plural "seconds" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" - -#~ msgid "Mesh calibrate" -#~ msgstr "Калибровка сетки" - -#~ msgid "Uploaded" -#~ msgstr "Загружено" - -#~ msgid "Ended official support in June 2023" -#~ msgstr "Официальная поддержка прекращена в июне 2023 г" - -#~ msgid "Hidden" -#~ msgstr "Скрытый" - -#~ msgid "KlipperScreen will drop support in June 2024" -#~ msgstr "KlipperScreen прекратит поддержку в июне 2024 г" - -#~ msgid "Print Time" -#~ msgstr "Время печати" - -#~ msgid "Starting WiFi Association" -#~ msgstr "Запуск WiFi" - -#~ msgid "Warning" -#~ msgstr "Предупреждение" - -#~ msgid "dBm" -#~ msgstr "дБм" - -#~ msgid "Deselect" -#~ msgstr "Отменить выбор" - -#~ msgid "Select" -#~ msgstr "Выбрать" - -#~ msgid "Bed screw configuration:" -#~ msgstr "Конфигурация винтов кровати:" - -#~ msgid "" -#~ "Not supported for auto-detection, it needs to be configured in " -#~ "klipperscreen.conf" -#~ msgstr "" -#~ "Не поддерживается для автоматического обнаружения, его необходимо " -#~ "настроить в klipperscreen.conf" - -#~ msgid "Unknown screw position" -#~ msgstr "Неизвестное положение винта" - -#~ msgid "Max Acceleration to Deceleration" -#~ msgstr "Ускорения торможения" - -#~ msgid "Continue" -#~ msgstr "Продолжить" - -#~ msgid "Fullscreen" -#~ msgstr "Полный экран" - -#~ msgid "Actions" -#~ msgstr "Действия" - -#~ msgid "Configuration" -#~ msgstr "Параметр" - -#~ msgid "Homing" -#~ msgstr "Парковка" - -#~ msgid "Disable XY" -#~ msgstr "Отключить XY" - -#~ msgid "Slicer Time correction (%)" -#~ msgstr "Коррекция времени Слайсер (%)" - -#~ msgid "Calibrated, save configuration to make it permanent" -#~ msgstr "Откалибровано, сохраните конфигурацию, чтобы сделать ее постоянной" - -#~ msgid "Decrease" -#~ msgstr "Уменьшить" - -#~ msgid "Increase" -#~ msgstr "Поднять" - -#, python-format -#~ msgid "Sending Power ON signal to: %s" -#~ msgstr "Отправка сигнала включения питания на: %s" - -#~ msgid "Sort:" -#~ msgstr "Сортировать:" - -#~ msgid "Calibrating..." -#~ msgstr "Калибровка..." - -#~ msgid "Z+" -#~ msgstr "Z+" - -#~ msgid "Z-" -#~ msgstr "Z-" - -#~ msgid "X+" -#~ msgstr "X+" - -#~ msgid "X-" -#~ msgstr "X-" - -#~ msgid "Y+" -#~ msgstr "Y+" - -#~ msgid "Y-" -#~ msgstr "Y-" - -#~ msgid "Add Printer" -#~ msgstr "Добавить принтер" - -#~ msgid "Initializing" -#~ msgstr "Инициализация" - -#, python-format -#~ msgid "Retry #%s" -#~ msgstr "Повторная попытка #%s" - -#~ msgid "Off" -#~ msgstr "Выкл." - -#~ msgid "View Mesh" -#~ msgstr "Смотреть сетку" - -#~ msgid "Sort by: " -#~ msgstr "Сортировать по: " - -#~ msgid "Bltouch found applied offset" -#~ msgstr "Bltouch обнаружил примененное смещение" - -#~ msgid "" -#~ "Check /tmp/KlipperScreen.log for more information.\n" -#~ "Please submit an issue on GitHub for help." -#~ msgstr "" -#~ "Проверьте /tmp/KlipperScreen.log для дополнитольной информации.\n" -#~ "Создайте issues на GitHub что-бы получить помощь." - -#~ msgid "Probe found applied offset" -#~ msgstr "Probe обнаружил примененное смещение" - -#~ msgid "Tool" -#~ msgstr "Инструмент" +msgstr[0] "секунда" +msgstr[1] "секунды" +msgstr[2] "секунд" -#~ msgid "Displayed Macros" -#~ msgstr "Показать макросы" +msgid "This function is designed to move a file to the main directory" +msgstr "Данная функция предназначена для переноса файла в главную директорию" -#~ msgid "Z Position" -#~ msgstr "Позиция Z" +msgid "Move file to main directory?" +msgstr "Переместить файл в главную директорию?" -#~ msgid "IPv4" -#~ msgstr "IPv4" +msgid "Resave" +msgstr "Перенести" -#~ msgid "IPv6" -#~ msgstr "IPv6" +msgid "A file with this name already exists" +msgstr "Файл с таким именем уже существует" -#~ msgid "Klipper Version" -#~ msgstr "Версия Klipper" +msgid "You may be trying to move a file that is already in the main directory" +msgstr "Возможно Вы пытаетесь переместить файл, который уже находится в главной директории" -#~ msgid "" -#~ "Klipper has encountered an error with the micro-controller.\n" -#~ "Please recompile and flash." -#~ msgstr "" -#~ "Klipper определил ошибку в микроконтроллере.\n" -#~ "Прошейте заново." +msgid "Replace it?" +msgstr "Заменить его?" -#~ msgid "" -#~ "Klipper has encountered an error.\n" -#~ "Issue a FIRMWARE_RESTART to attempt fixing the issue." -#~ msgstr "" -#~ "Klipper обнаружил ошибку.\n" -#~ "Выполните перезагрузку прошивки, чтобы попытаться исправить проблему." +msgid "Calibration" +msgstr "Калибровки" -#~ msgid "KlipperScreen Version" -#~ msgstr "Версия KlipperScreen" +msgid "Bed calibrate" +msgstr "Калибр. карты" -#~ msgid "Show Only Heaters in Temp." -#~ msgstr "Показать только нагреватели в темп." +msgid "Temperature too low to extrude" +msgstr "Слишком низкая температура для экструзии" -#~ msgid "Temp" -#~ msgstr "Температура" +msgid "Autocalibration of PID hotend" +msgstr "Калибр. PID хотенда" -#~ msgid "Number Pad" -#~ msgstr "Клавиатура" +msgid "Autocalibration of PID 1st head" +msgstr "Калибр. PID 1-й головы" -#~ msgid "Preheat" -#~ msgstr "Преднагрев" +msgid "Autocalibration of PID 2nd head" +msgstr "Калибр. PID 2-й головы" -#~ msgid "Screen will show in less than one second" -#~ msgstr "Экран отобразится через одну секунду" +msgid "Autocalibration of PID bed" +msgstr "Калибр. PID стола" -#~ msgid "Medium (default)" -#~ msgstr "Средний (по умолчанию)" +msgid "Autocalibration of Z-offset of the 2nd head" +msgstr "Z-офсет 2-й головы" -#~ msgid "File Estimation (default)" -#~ msgstr "По файлу (по умолчанию)" +msgid "Make sure that moving the bed 10mm down will be safe for the printer!" +msgstr "Убедитесь, что перемещение стола на 10 мм вниз безопасно для принтера!" -#~ msgid "..." -#~ msgstr "..." +msgid "Bed Up" +msgstr "Стол вверх" -#~ msgid "Change Printer" -#~ msgstr "Сменить принтер" +msgid "Bed Down" +msgstr "Стол вниз" -#~ msgid "Fan Off" -#~ msgstr "Bыключить" +msgid "Bed Down 10mm" +msgstr "Стол вниз на 10мм" -#~ msgid "Fan On" -#~ msgstr "Bключи" +msgid "After confirmation, the autocalibration of the 2nd head offset will begin" +msgstr "После подтверждения начнется автокалибровка z-офсета 2-й головы" -#~ msgid "Fast" -#~ msgstr "Быстро" +msgid "After confirmation, the PID bed autocalibration will begin" +msgstr "После подтверждения начнется автокалибровка PID стола" -#~ msgid "Slow" -#~ msgstr "Mедленно" +msgid "After confirmation, the PID hotend autocalibration will begin" +msgstr "После подтверждения начнется автокалибровка PID хотенда" -#~ msgid "?" -#~ msgstr "?" +msgid "After confirmation, the autocalibration of PID 1st head will begin" +msgstr "После подтверждения начнется автокалибровка PID 1-й головы" -#~ msgid "Cancel Change" -#~ msgstr "Отменить изменения" +msgid "After confirmation, the autocalibration of PID 2nd head will begin" +msgstr "После подтверждения начнется автокалибровка PID 2-й головы" -#~ msgid "Control" -#~ msgstr "Управление" +msgid "Are you sure want to unload the current filament spool?" +msgstr "Вы уверены, что хотите выгрузить текущую катушку филамента?" -#~ msgid "Load Average" -#~ msgstr "Средняя нагрузка" +msgid "Are you sure want to load a NEW reel of filament?" +msgstr "Вы уверены, что хотите загрузить НОВУЮ катушку филамента?" diff --git a/ks_includes/locales/sl/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/sl/LC_MESSAGES/KlipperScreen.mo index 8d7275c44..dd6eedd38 100644 Binary files a/ks_includes/locales/sl/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/sl/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/sl/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/sl/LC_MESSAGES/KlipperScreen.po index 5f8b3cd77..4759044a5 100644 --- a/ks_includes/locales/sl/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/sl/LC_MESSAGES/KlipperScreen.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" "PO-Revision-Date: 2024-04-13 16:48+0000\n" "Last-Translator: Dominik \n" "Language-Team: Slovenian \n" "Language-Team: Swedish \n" "Language-Team: Turkish \n" @@ -17,11 +17,11 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.10-dev\n" #, python-format msgid "%s will be updated to version" -msgstr "%s şu sürüme güncellenecektir:" +msgstr "%s bu sürüme güncellenecektir:" msgid "(default)" msgstr "(varsayılan)" @@ -55,17 +55,17 @@ msgstr "Uygula" #, python-format msgid "Apply %s%.3f offset to Endstop?" -msgstr "Endstop'a %s%.3f telafi uygulansın mı?" +msgstr "Endstop'a %s%.3f telafisi uygulansın mı?" #, python-format msgid "Apply %s%.3f offset to Probe?" -msgstr "Ölçme Çubuğu'na %s%.3f telafi uygulansın mı?" +msgstr "Ölçme Çubuğu'na %s%.3f telafisi uygulansın mı?" msgid "Archived" msgstr "Arşivlenen" msgid "Are you sure do you want to exclude the object?" -msgstr "Nesneyi hariç tutmak istediğinizden emin misiniz?" +msgstr "Nesneyi çıkarmak istediğinizden emin misiniz?" msgid "Are you sure you want to run Emergency Stop?" msgstr "Acil Durdurmak istediğinizden emin misiniz?" @@ -83,7 +83,7 @@ msgid "Are you sure you wish to shutdown the system?" msgstr "Sistemi kapatmak istediğinizden emin misiniz?" msgid "Asks for confirmation before stopping" -msgstr "Durmadan önce onay ister" +msgstr "Durmadan önce onay için sorar" msgid "Auto" msgstr "Otomatik" @@ -343,6 +343,9 @@ msgstr "Akış oranı:" msgid "Font Size" msgstr "Yazı boyutu" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "Fare yada dokunmatik ekranın kesinliğini doğrulamak için" + msgid "Forget" msgstr "Unut" @@ -367,9 +370,6 @@ msgstr "Gizle" msgid "Hide sensors in Temp." msgstr "Sıcaklıktaki sensörleri gizleyin." -msgid "Hide temp." -msgstr "Sıcaklığı gizle." - msgid "Home" msgstr "Ana Konum" @@ -421,6 +421,9 @@ msgstr "Geçersiz" msgid "Invalid password" msgstr "Geçersiz şifre" +msgid "Invalid temperature" +msgstr "Geçersiz Sıcaklık" + msgid "Inversely affects the icon size" msgstr "Simge boyutunu ters yönde etkiler" @@ -497,6 +500,9 @@ msgstr "Yükle" msgid "Loading..." msgstr "Yükleniyor..." +msgid "Lock" +msgstr "Kilitle" + msgid "Lost Connection to Moonraker" msgstr "Moonraker ile Bağlantı Koptu" @@ -627,9 +633,6 @@ msgstr "Sadece paneli taşımak için" msgid "Outdated by %d" msgstr "Güncelliğini yitiren %d" -msgid "PSK for" -msgstr "PSK için" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "Paket yükseltilecek" @@ -638,6 +641,9 @@ msgstr[1] "Paketler yükseltilecek" msgid "Part Fan" msgstr "Parça Fanı" +msgid "Password" +msgstr "Şifre" + msgid "Password saved" msgstr "Şifre kaydedildi" @@ -804,6 +810,9 @@ msgstr "Isıtıcı Gücünü Göster" msgid "Show Scrollbars Buttons" msgstr "Kaydırma çubuklarında düğmeleri göster" +msgid "Show cursor" +msgstr "İmleci göster" + msgid "Show only devices that are able to be set" msgstr "Yalnızca ayarlanabilecek cihazları göster" @@ -873,6 +882,9 @@ msgstr "Sıcaklık (°C)" msgid "Temperature" msgstr "Sıcaklık" +msgid "Temperature too low to extrude" +msgstr "Sıcaklık ekstrüzyon için çok düşük" + msgid "The system doesn't meet the minimum requirement" msgstr "Sistem minimum gereksinimi karşılamıyor" @@ -900,6 +912,12 @@ msgstr "Bilinmeyen güvenlik türü" msgid "Unload" msgstr "Çıkart" +msgid "Unlock" +msgstr "Kilidi Aç" + +msgid "Unlock failed" +msgstr "Kilit açma başarısız" + msgid "Unretract Extra Length" msgstr "İleri İtme Ekstra Uzunluk" @@ -918,6 +936,9 @@ msgstr "Güncelleniyor" msgid "Useful for un-responsive touchscreens" msgstr "Yanıt vermeyen dokunmatik ekranlar için kullanışlıdır" +msgid "User" +msgstr "Kullanıcı" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC, Stream deneyin tarafından desteklenmez" @@ -994,6 +1015,12 @@ msgid_plural "seconds" msgstr[0] "saniye" msgstr[1] "saniyeler" +#~ msgid "Hide temp." +#~ msgstr "Sıcaklığı gizle." + +#~ msgid "PSK for" +#~ msgstr "PSK için" + #~ msgid "Are you sure you want to stop the calibration?" #~ msgstr "Kalibrasyonu durdurmak istediğinizden emin misiniz?" diff --git a/ks_includes/locales/uk/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/uk/LC_MESSAGES/KlipperScreen.mo index 8a2e45caf..24f634f4b 100644 Binary files a/ks_includes/locales/uk/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/uk/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/uk/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/uk/LC_MESSAGES/KlipperScreen.po index 214a92db0..72ce7361b 100644 --- a/ks_includes/locales/uk/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/uk/LC_MESSAGES/KlipperScreen.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: 24-05-17 16.20\n" +"Project-Id-Version: 24-11-26 10.00\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-05-12 16:39+0300\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-11-26 22:47+0200\n" "Last-Translator: Andrii Komarovskyi\n" "Language-Team: Andrii Komarovskyi\n" "Language: uk\n" @@ -16,8 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 3.4.1\n" +"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"X-Generator: Poedit 3.5\n" #, python-format msgid "%s will be updated to version" @@ -173,14 +173,14 @@ msgid "Connected" msgstr "Підключено" msgid "Connecting" -msgstr "Відбувається підключення" +msgstr "Підключення" #, python-format msgid "Connecting to %s" msgstr "Підключення до %s" msgid "Connection failed" -msgstr "Підключення невдале" +msgstr "Помилка підключення" msgid "Console" msgstr "Консоль" @@ -189,7 +189,7 @@ msgid "Cooldown" msgstr "Охолодження" msgid "Couldn't add network" -msgstr "Неможливо додати мережу" +msgstr "Не вдалося додати мережу" msgid "Current" msgstr "Поточний" @@ -219,14 +219,14 @@ msgid "Disable for 12hs with am / pm" msgstr "Вимкнути на 12 годин за допомогою am / pm" msgid "Disconnect" -msgstr "Від'єднатись" +msgstr "Відключати" msgid "Distance (mm)" msgstr "Відстань (мм)" #, python-format msgid "Do you want to forget or disconnect %s?" -msgstr "Забути або від'єднатись від %s?" +msgstr "Ви хочете забути чи відключити %s?" #, python-format msgid "Do you want to recover %s?" @@ -260,7 +260,7 @@ msgid "Error: Couldn't get a position to probe" msgstr "Помилка: не вдалося отримати позицію для проби" msgid "Estimated Time" -msgstr "Розрахований час" +msgstr "Розрахунковий Час" msgid "Estimated Time Method" msgstr "Метод розрахунку часу" @@ -275,19 +275,21 @@ msgid "Extra Large" msgstr "Дуже Великий" msgid "Extrude" -msgstr "Видавити" +msgstr "" +"Заміна пластику\n" +"Продавлювити" msgid "Extruders" msgstr "Екструдери" msgid "Extrusion +" -msgstr "Видавити +" +msgstr "Екструзія +" msgid "Extrusion -" -msgstr "Втягнути -" +msgstr "Екструзія -" msgid "Failed to delete connection" -msgstr "Не вдалося видалити з'єднання" +msgstr "Не вдалося видалити з’єднання" msgid "Failed to initialize" msgstr "Не вдалося ініціалізувати" @@ -299,7 +301,7 @@ msgid "Fan" msgstr "Вентилятор" msgid "Filament" -msgstr "Пруток" +msgstr "Профиль прутка" msgid "Filament Used" msgstr "Використання Прутка" @@ -343,17 +345,22 @@ msgstr "Швидкість потоку:" msgid "Font Size" msgstr "Розмір шрифту" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "Для керування мишею або для перевірки точності сенсорного екрана" + msgid "Forget" msgstr "Забути" msgid "Full Update" -msgstr "Повне оновлення" +msgstr "" +"Повне\n" +"Оновлення" msgid "Gcodes" -msgstr "G-коди" +msgstr "G-код" msgid "Getting IP address" -msgstr "Отримання IP адреси" +msgstr "Отримання IP-адреси" msgid "Go Back" msgstr "Назад" @@ -367,11 +374,8 @@ msgstr "Сховати" msgid "Hide sensors in Temp." msgstr "Сховати датчик t°." -msgid "Hide temp." -msgstr "Приховати темп." - msgid "Home" -msgstr "Домашня сторінка" +msgstr "Дім" msgid "Home All" msgstr "Дім Всі" @@ -398,7 +402,7 @@ msgid "ID" msgstr "ID" msgid "Icon Theme" -msgstr "Тема оформлення" +msgstr "Іконка тема" msgid "Initializing printer..." msgstr "Ініціалізація принтера..." @@ -410,7 +414,7 @@ msgid "Input Shaper" msgstr "Input Shaper" msgid "Insufficient privileges" -msgstr "Недостатні привілеї" +msgstr "Недостатньо прав" msgid "Interface" msgstr "Інтерфейс" @@ -421,6 +425,9 @@ msgstr "Недійсний" msgid "Invalid password" msgstr "Недійсний пароль" +msgid "Invalid temperature" +msgstr "Недійсна температура" + msgid "Inversely affects the icon size" msgstr "Зворотно впливає на розмір іконки" @@ -440,10 +447,12 @@ msgid "It's possible that the configuration is not correct" msgstr "Можливо, конфігурація неправильна" msgid "Job Status" -msgstr "Стан завдання" +msgstr "Статус роботи" msgid "Klipper Restart" -msgstr "Перезапуск Klipper" +msgstr "" +"Перезапуск\n" +"Klipper" msgid "Klipper has disconnected" msgstr "Klipper загубив зв'язок" @@ -463,8 +472,8 @@ msgstr "Klipper перезавантажиться" msgid "" "LOAD_FILAMENT/UNLOAD_FILAMENT are hidden and should be used from extrude" msgstr "" -"LOAD_FILAMENT/UNLOAD_FILAMENT приховані, і їх слід використовувати з меню " -"Заміна пластику" +"LOAD_FILAMENT/UNLOAD_FILAMENT приховані, і їх слід використовувати під час " +"видавлювання" msgid "Language" msgstr "Мова" @@ -473,7 +482,7 @@ msgid "Large" msgstr "Великий" msgid "Last Duration" -msgstr "Остання тривалість" +msgstr "Остання Тривалість" msgid "Last Used" msgstr "Останнє Використання" @@ -485,7 +494,7 @@ msgid "Layer:" msgstr "Шар:" msgid "Leds" -msgstr "Освітлення" +msgstr "Світлодіоди" msgid "Left:" msgstr "Залишилось:" @@ -499,6 +508,9 @@ msgstr "Завантажити" msgid "Loading..." msgstr "Завантаження..." +msgid "Lock" +msgstr "Заблоковано" + msgid "Lost Connection to Moonraker" msgstr "Втрачено з’єднання з Moonraker" @@ -578,13 +590,13 @@ msgid "Network" msgstr "Мережа" msgid "Network connected" -msgstr "Під'єднано до мережі" +msgstr "Підключено до мережі" msgid "Network disconnected" -msgstr "Від'єднано від мережі" +msgstr "Мережа відключена" msgid "Network not found" -msgstr "Мережу не знайдено" +msgstr "Мережа не знайдена" msgid "Never" msgstr "Ніколи" @@ -599,7 +611,7 @@ msgid "No info available" msgstr "Немає інформації" msgid "No mesh has been loaded" -msgstr "Не завантажено жодної сітки" +msgstr "Жодна сітка не завантажена" msgid "No wireless interface has been found" msgstr "Бездротовий інтерфейс не знайдено" @@ -620,18 +632,15 @@ msgid "Notifications" msgstr "Сповіщення" msgid "Nozzle diameter" -msgstr "Діаметр сопла" +msgstr "Диаметр сопла" msgid "Only for the move panel" -msgstr "Лише для панелі переміщення" +msgstr "Тільки для панелі переміщення" #, python-format msgid "Outdated by %d" msgstr "Застаріло на %d" -msgid "PSK for" -msgstr "PSK для" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "Пакет буде оновлено" @@ -641,6 +650,9 @@ msgstr[2] "Пакети будуть оновлені" msgid "Part Fan" msgstr "Охолодження моделі" +msgid "Password" +msgstr "Пароль" + msgid "Password saved" msgstr "Пароль збережено" @@ -654,13 +666,15 @@ msgid "Perform a full upgrade?" msgstr "Виконати повне оновлення?" msgid "Pins" -msgstr "Піни" +msgstr "" +"Керування\n" +"контактами" msgid "Please recompile and flash the micro-controller." msgstr "Будь ласка, перекомпілюйте та перепрошійте мікроконтролер." msgid "Please wait" -msgstr "Очікуйте, будь ласка" +msgstr "Будь ласка, зачекайте" msgid "Power" msgstr "Живлення" @@ -669,10 +683,10 @@ msgid "Power On Printer" msgstr "Увімкнути принтер" msgid "Pressure Advance" -msgstr "Випередження тиску" +msgstr "Випередження Тиску" msgid "Pressure Advance:" -msgstr "Випередження тиску:" +msgstr "Випередження Тиску:" msgid "Pressure advance" msgstr "Випередження тиску" @@ -726,7 +740,7 @@ msgid "Refresh" msgstr "Оновити" msgid "Remove network" -msgstr "Вийняти мережу" +msgstr "Видалити мережу" msgid "Rename/Move:" msgstr "Перейменувати/перемістити:" @@ -807,6 +821,9 @@ msgstr "Показати Потужність Нагрівача" msgid "Show Scrollbars Buttons" msgstr "Показати кнопку смуги прокрутки" +msgid "Show cursor" +msgstr "Відображати курсор" + msgid "Show only devices that are able to be set" msgstr "Показувати лише пристрої, які можна налаштувати" @@ -856,7 +873,9 @@ msgid "Starting update for" msgstr "Початок оновлення для" msgid "Swaps buttons if they are on top of each other, affects other panels" -msgstr "Міняти місцями кнопки, якщо вони розташовані одна поверх іншої. Впливає на решту панелей" +msgstr "" +"Міняти місцями кнопки, якщо вони розташовані одна поверх іншої. \n" +"Впливає нарешту панелей" msgid "System" msgstr "Системна" @@ -876,6 +895,9 @@ msgstr "Teмп (°C)" msgid "Temperature" msgstr "Температура" +msgid "Temperature too low to extrude" +msgstr "Занизька температура для видавлювання" + msgid "The system doesn't meet the minimum requirement" msgstr "Система не відповідає мінімальним вимогам" @@ -903,6 +925,12 @@ msgstr "Невідомий тип безпеки" msgid "Unload" msgstr "Вийняти" +msgid "Unlock" +msgstr "Розблокувати" + +msgid "Unlock failed" +msgstr "Помилка розблокування" + msgid "Unretract Extra Length" msgstr "Додаткова довжина втягування" @@ -913,7 +941,7 @@ msgid "Up To Date" msgstr "Актуально" msgid "Update" -msgstr "Оновити" +msgstr "Оновлення" msgid "Updating" msgstr "Оновлення" @@ -921,6 +949,9 @@ msgstr "Оновлення" msgid "Useful for un-responsive touchscreens" msgstr "Корисно для сенсорних екранів, які не реагують" +msgid "User" +msgstr "Користувач" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "WebRTC не підтримується бекендом, який намагається використати Stream" @@ -991,7 +1022,7 @@ msgid "mm/s²" msgstr "мм/с²" msgid "mm³/s" -msgstr "мм/с³" +msgstr "мм³/с" msgid "s" msgstr "с" @@ -1002,145 +1033,151 @@ msgstr[0] "секунда" msgstr[1] "секунди" msgstr[2] "секунд" -#~ msgid "Are you sure you want to stop the calibration?" -#~ msgstr "Ви впевнені, що хочете припинити калібрування?" +msgid "Hide temp." +msgstr "Приховати темп." + +msgid "PSK for" +msgstr "PSK для" + +msgid "Are you sure you want to stop the calibration?" +msgstr "Ви впевнені, що хочете припинити калібрування?" -#~ msgid "Mesh calibrate" -#~ msgstr "Калібрування сітки столу" +msgid "Mesh calibrate" +msgstr "Калібрування сітки столу" -#~ msgid "Uploaded" -#~ msgstr "Завантажено" +msgid "Uploaded" +msgstr "Завантажено" -#~ msgid "Ended official support in June 2023" -#~ msgstr "Офіційна підтримка припинена в червні 2023 року" +msgid "Ended official support in June 2023" +msgstr "Офіційна підтримка припинена в червні 2023 року" -#~ msgid "Hidden" -#~ msgstr "Прихований" +msgid "Hidden" +msgstr "Прихований" -#~ msgid "KlipperScreen will drop support in June 2024" -#~ msgstr "KlipperScreen припинить підтримку в червні 2024 року" +msgid "KlipperScreen will drop support in June 2024" +msgstr "KlipperScreen припинить підтримку в червні 2024 року" -#~ msgid "Print Time" -#~ msgstr "Час друку" +msgid "Print Time" +msgstr "Час друку" -#~ msgid "Starting WiFi Association" -#~ msgstr "Запуск асоціації WiFi" +msgid "Starting WiFi Association" +msgstr "Запуск асоціації WiFi" -#~ msgid "Warning" -#~ msgstr "Попередження" +msgid "Warning" +msgstr "Попередження" -#~ msgid "dBm" -#~ msgstr "dBm" +msgid "dBm" +msgstr "dBm" -#~ msgid "Deselect" -#~ msgstr "Скасувати вибір" +msgid "Deselect" +msgstr "Скасувати вибір" -#~ msgid "Select" -#~ msgstr "Вибрати" +msgid "Select" +msgstr "Вибрати" -#~ msgid "Bed screw configuration:" -#~ msgstr "Конфігурація гвинтів ліжка:" +msgid "Bed screw configuration:" +msgstr "Конфігурація гвинтів ліжка:" -#~ msgid "" -#~ "Not supported for auto-detection, it needs to be configured in " -#~ "klipperscreen.conf" -#~ msgstr "" -#~ "Автоматичне визначення не підтримується, його потрібно налаштувати у " -#~ "klipperscreen.conf" +msgid "" +"Not supported for auto-detection, it needs to be configured in klipperscreen." +"conf" +msgstr "" +"Автоматичне визначення не підтримується, його потрібно налаштувати у " +"klipperscreen.conf" -#~ msgid "Unknown screw position" -#~ msgstr "Невідоме положення гвинта" +msgid "Unknown screw position" +msgstr "Невідоме положення гвинта" -#~ msgid "Max Acceleration to Deceleration" -#~ msgstr "Макс. прискорення до гальмування" +msgid "Max Acceleration to Deceleration" +msgstr "Макс. прискорення до гальмування" -#~ msgid "Continue" -#~ msgstr "Продовжити" +msgid "Continue" +msgstr "Продовжити" -#~ msgid "Fullscreen" -#~ msgstr "Повноекранний режим" +msgid "Fullscreen" +msgstr "Повноекранний режим" -#~ msgid "Actions" -#~ msgstr "Дії" +msgid "Actions" +msgstr "Дії" -#~ msgid "Configuration" -#~ msgstr "Конфігурація" +msgid "Configuration" +msgstr "Конфігурація" -#~ msgid "Homing" -#~ msgstr "До дому" +msgid "Homing" +msgstr "До дому" -#~ msgid "Disable XY" -#~ msgstr "Вимкнути XY" +msgid "Disable XY" +msgstr "Вимкнути XY" -#~ msgid "Slicer Time correction (%)" -#~ msgstr "Виправлення часу слайсера (%)" +msgid "Slicer Time correction (%)" +msgstr "Виправлення часу слайсера (%)" -#~ msgid "Calibrated, save configuration to make it permanent" -#~ msgstr "Відкалібровано, збережіть конфігурацію, щоб зробити її постійною" +msgid "Calibrated, save configuration to make it permanent" +msgstr "Відкалібровано, збережіть конфігурацію, щоб зробити її постійною" -#~ msgid "Decrease" -#~ msgstr "Зменшити" +msgid "Decrease" +msgstr "Зменшити" -#~ msgid "Increase" -#~ msgstr "Збільшити" +msgid "Increase" +msgstr "Збільшити" #, python-format -#~ msgid "Sending Power ON signal to: %s" -#~ msgstr "Надсилання сигналу увімкнення живлення на: %s" +msgid "Sending Power ON signal to: %s" +msgstr "Надсилання сигналу увімкнення живлення на: %s" -#~ msgid "Sort:" -#~ msgstr "Сортувати:" +msgid "Sort:" +msgstr "Сортувати:" -#~ msgid "Calibrating..." -#~ msgstr "Калібрування..." +msgid "Calibrating..." +msgstr "Калібрування..." -#~ msgid "Z+" -#~ msgstr "Бебістеп Z+" +msgid "Z+" +msgstr "Бебістеп Z+" -#~ msgid "Z-" -#~ msgstr "Бебістеп Z-" +msgid "Z-" +msgstr "Бебістеп Z-" -#~ msgid "X+" -#~ msgstr "X+" +msgid "X+" +msgstr "X+" -#~ msgid "X-" -#~ msgstr "X-" +msgid "X-" +msgstr "X-" -#~ msgid "Y+" -#~ msgstr "Y+" +msgid "Y+" +msgstr "Y+" -#~ msgid "Y-" -#~ msgstr "Y-" +msgid "Y-" +msgstr "Y-" #, python-format -#~ msgid "Retry #%s" -#~ msgstr "Повторіть #%s" +msgid "Retry #%s" +msgstr "Повторіть #%s" -#~ msgid "Add Printer" -#~ msgstr "Додати принтер" +msgid "Add Printer" +msgstr "Додати принтер" -#~ msgid "Initializing" -#~ msgstr "Ініціалізація" +msgid "Initializing" +msgstr "Ініціалізація" -#~ msgid "Off" -#~ msgstr "Вимк" +msgid "Off" +msgstr "Вимк" -#~ msgid "View Mesh" -#~ msgstr "Показати сітку" +msgid "View Mesh" +msgstr "Показати сітку" -#~ msgid "Machine" -#~ msgstr "Машина" +msgid "Machine" +msgstr "Машина" -#~ msgid "Sort by: " -#~ msgstr "Сортувати за: " +msgid "Sort by: " +msgstr "Сортувати за: " -#~ msgid "Auto Calibration" -#~ msgstr "Автоматичне калібрування" +msgid "Auto Calibration" +msgstr "Автоматичне калібрування" -#~ msgid "Manual Calibration" -#~ msgstr "Ручне калібрування" +msgid "Manual Calibration" +msgstr "Ручне калібрування" -#~ msgid "NOTE: Edit your printer.cfg to save manual calibration changes." -#~ msgstr "" -#~ "ПРИМІТКА. Відредагуйте файл printer.cfg, щоб зберегти зміни калібрування " -#~ "вручну." +msgid "NOTE: Edit your printer.cfg to save manual calibration changes." +msgstr "" +"ПРИМІТКА. Відредагуйте файл printer.cfg, щоб зберегти зміни калібрування " +"вручну." diff --git a/ks_includes/locales/vi/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/vi/LC_MESSAGES/KlipperScreen.mo index 85445ef6d..8f9c0ea46 100644 Binary files a/ks_includes/locales/vi/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/vi/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/vi/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/vi/LC_MESSAGES/KlipperScreen.po index 0cdb3ffaf..c1cafd6c7 100644 --- a/ks_includes/locales/vi/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/vi/LC_MESSAGES/KlipperScreen.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" "PO-Revision-Date: 2024-08-12 07:09+0000\n" "Last-Translator: Hiep Nguyen \n" "Language-Team: Vietnamese \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-11-27 21:00+0000\n" +"Last-Translator: Sun Zheng <123456789sunzheng@gmail.com>\n" +"Language-Team: Chinese (Simplified Han script) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.7-dev\n" +"X-Generator: Weblate 5.9-dev\n" #, python-format msgid "%s will be updated to version" @@ -27,7 +27,7 @@ msgid "(default)" msgstr "(默认)" msgid "24 Hour Time" -msgstr "24小时制" +msgstr "使用24小时制" msgid "A FIRMWARE_RESTART may fix the issue." msgstr "重启Klipper固件可能会解决这个问题。" @@ -104,7 +104,7 @@ msgid "Bed Level" msgstr "热床调平" msgid "Bed Mesh" -msgstr "网床" +msgstr "床网" msgid "Both" msgstr "两个都" @@ -140,7 +140,7 @@ msgid "Cannot connect to Moonraker" msgstr "无法连接到Moonraker" msgid "Changes how the interface looks" -msgstr "调整用户界面皮肤" +msgstr "调整用户界面外观" msgid "Changes how the time remaining is calculated" msgstr "调整剩余时间计算方法" @@ -149,7 +149,7 @@ msgid "Channel" msgstr "群组" msgid "Check ADXL Wiring" -msgstr "请检查加速度计的连线" +msgstr "请检查加速度计的接线" msgid "Checking for updates, please wait..." msgstr "正在检查更新,请稍等..." @@ -161,7 +161,7 @@ msgid "Close" msgstr "关闭" msgid "Close messages after a timeout" -msgstr "超时自动关闭通知" +msgstr "超时后自动关闭通知" msgid "Complete" msgstr "完成" @@ -216,7 +216,7 @@ msgid "Disable Motors" msgstr "关闭电机" msgid "Disable for 12hs with am / pm" -msgstr "禁用以启用12小时制 (AM/PM)" +msgstr "禁用以使用12小时制 (AM/PM)" msgid "Disconnect" msgstr "断开" @@ -248,19 +248,19 @@ msgid "Error clearing active spool" msgstr "退出当前耗材时出错" msgid "Error getting active spool" -msgstr "获取当前耗材时出错" +msgstr "加载当前耗材时出错" msgid "Error setting active spool" -msgstr "设置当前耗材时出错" +msgstr "激活当前耗材时出错" msgid "Error trying to fetch spools" msgstr "尝试获取耗材时出错" msgid "Error: Couldn't get a position to probe" -msgstr "错误: 不能获取位置来探测" +msgstr "错误: 无法获取用来探测的位置" msgid "Estimated Time" -msgstr "预估时间" +msgstr "预估剩余时间" msgid "Estimated Time Method" msgstr "估算剩余时间方式" @@ -338,11 +338,14 @@ msgid "Flow:" msgstr "流量:" msgid "Flowrate:" -msgstr "流速:" +msgstr "流量:" msgid "Font Size" msgstr "字体大小" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "用于鼠标控制或验证触摸屏的准确性" + msgid "Forget" msgstr "忘记" @@ -367,26 +370,23 @@ msgstr "隐藏" msgid "Hide sensors in Temp." msgstr "在温度显示中隐藏传感器的温度" -msgid "Hide temp." -msgstr "隐藏温度" - msgid "Home" -msgstr "归零" +msgstr "归位" msgid "Home All" -msgstr "全部归零" +msgstr "全部归位" msgid "Home X" -msgstr "X轴归零" +msgstr "X轴归位" msgid "Home XY" -msgstr "XY轴归零" +msgstr "XY轴归位" msgid "Home Y" -msgstr "Y轴归零" +msgstr "Y轴归位" msgid "Home Z" -msgstr "Z轴归零" +msgstr "Z轴归位" msgid "Host" msgstr "主机" @@ -398,7 +398,7 @@ msgid "ID" msgstr "ID" msgid "Icon Theme" -msgstr "主题" +msgstr "外观" msgid "Initializing printer..." msgstr "正在初始化打印机..." @@ -421,6 +421,9 @@ msgstr "无效" msgid "Invalid password" msgstr "密码无效" +msgid "Invalid temperature" +msgstr "无效的温度" + msgid "Inversely affects the icon size" msgstr "与预览图大小成反比" @@ -440,7 +443,7 @@ msgid "It's possible that the configuration is not correct" msgstr "设置文件可能存在错误" msgid "Job Status" -msgstr "工作状态" +msgstr "任务状态" msgid "Klipper Restart" msgstr "重启Klipper" @@ -471,7 +474,7 @@ msgid "Large" msgstr "大" msgid "Last Duration" -msgstr "上一次的持续时间" +msgstr "上次用时" msgid "Last Used" msgstr "上次使用" @@ -497,6 +500,9 @@ msgstr "载入耗材" msgid "Loading..." msgstr "加载中..." +msgid "Lock" +msgstr "锁定" + msgid "Lost Connection to Moonraker" msgstr "与 Moonraker 失去连接" @@ -627,9 +633,6 @@ msgstr "仅适用于移动面板" msgid "Outdated by %d" msgstr "已落后 %d" -msgid "PSK for" -msgstr "PSK" - msgid "Package will be updated" msgid_plural "Packages will be updated" msgstr[0] "软件包将被更新" @@ -637,6 +640,9 @@ msgstr[0] "软件包将被更新" msgid "Part Fan" msgstr "模型风扇" +msgid "Password" +msgstr "密码" + msgid "Password saved" msgstr "密码已保存" @@ -803,11 +809,14 @@ msgstr "显示加热器功率(%)" msgid "Show Scrollbars Buttons" msgstr "显示滚动条按钮" +msgid "Show cursor" +msgstr "显示光标" + msgid "Show only devices that are able to be set" -msgstr "只显示可以主动控制温度的设备" +msgstr "只显示可以设置温度的设备" msgid "Shutdown" -msgstr "关闭" +msgstr "关机" msgid "Size" msgstr "大小" @@ -837,7 +846,7 @@ msgid "Speed:" msgstr "速度:" msgid "Square Corner Velocity" -msgstr "直角速度" +msgstr "直角拐弯速度" msgid "Standby" msgstr "待机" @@ -852,7 +861,7 @@ msgid "Starting update for" msgstr "开始更新" msgid "Swaps buttons if they are on top of each other, affects other panels" -msgstr "交换Z轴按钮位置,同时会改变其他的控制面板" +msgstr "交换Z轴按钮位置,此设置影响其他的控制面板" msgid "System" msgstr "系统" @@ -872,6 +881,9 @@ msgstr "温度 (°C)" msgid "Temperature" msgstr "温度" +msgid "Temperature too low to extrude" +msgstr "温度过低无法挤出" + msgid "The system doesn't meet the minimum requirement" msgstr "当前系统不满足最低要求" @@ -899,6 +911,12 @@ msgstr "未知的安全类型" msgid "Unload" msgstr "卸载耗材" +msgid "Unlock" +msgstr "解锁" + +msgid "Unlock failed" +msgstr "解锁失败" + msgid "Unretract Extra Length" msgstr "回料长度" @@ -917,6 +935,9 @@ msgstr "正在更新" msgid "Useful for un-responsive touchscreens" msgstr "帮助控制触摸响应不良的屏幕" +msgid "User" +msgstr "用户" + msgid "WebRTC is not supported by the backend trying Stream" msgstr "不支持传送WebRTC至后台" @@ -988,6 +1009,12 @@ msgid "second" msgid_plural "seconds" msgstr[0] "秒" +#~ msgid "Hide temp." +#~ msgstr "隐藏温度" + +#~ msgid "PSK for" +#~ msgstr "PSK" + #~ msgid "Are you sure you want to stop the calibration?" #~ msgstr "您确定要停止校准吗?" diff --git a/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.mo b/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.mo index fb9feb595..426c05a43 100644 Binary files a/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.mo and b/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.mo differ diff --git a/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.po b/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.po index 26852460a..a754352b1 100644 --- a/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.po +++ b/ks_includes/locales/zh_TW/LC_MESSAGES/KlipperScreen.po @@ -7,17 +7,17 @@ msgid "" msgstr "" "Project-Id-Version: KlipperScreen\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-27 18:24-0300\n" -"PO-Revision-Date: 2024-06-01 12:09+0000\n" -"Last-Translator: 峻瑜哥 \n" -"Language-Team: Chinese (Traditional) \n" +"POT-Creation-Date: 2024-11-26 12:31-0300\n" +"PO-Revision-Date: 2024-11-27 21:00+0000\n" +"Last-Translator: Sun Zheng <123456789sunzheng@gmail.com>\n" +"Language-Team: Chinese (Traditional Han script) \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.6-dev\n" +"X-Generator: Weblate 5.9-dev\n" #, python-format msgid "%s will be updated to version" @@ -36,10 +36,10 @@ msgid "ADXL Not Configured" msgstr "未設定ADXL" msgid "Abort" -msgstr "取消" +msgstr "中止" msgid "Acceleration:" -msgstr "加速度" +msgstr "加速度:" msgid "Accept" msgstr "接受" @@ -51,18 +51,18 @@ msgid "All" msgstr "全部" msgid "Apply" -msgstr "應用" +msgstr "套用" #, python-format msgid "Apply %s%.3f offset to Endstop?" -msgstr "將 %s%.3f 偏移量應用於限位?" +msgstr "將 %s%.3f 偏移套用於限位?" #, python-format msgid "Apply %s%.3f offset to Probe?" -msgstr "將 %s%.3f 偏移量應用於探針?" +msgstr "將 %s%.3f 偏移套用於探針?" msgid "Archived" -msgstr "歸檔" +msgstr "已封存" msgid "Are you sure do you want to exclude the object?" msgstr "你確定要排除該目標嗎?" @@ -98,7 +98,7 @@ msgid "Auto-open Extrude On Pause" msgstr "暫停時自動打開擠出" msgid "Auto-scroll" -msgstr "自動滾屏" +msgstr "自動捲動" msgid "Bed Level" msgstr "熱床調平" @@ -119,7 +119,7 @@ msgid "Calibrating" msgstr "正在校準" msgid "Camera" -msgstr "相機" +msgstr "攝影機" msgid "Can't set above the maximum:" msgstr "設定值超出最大值:" @@ -128,7 +128,7 @@ msgid "Cancel" msgstr "取消" msgid "Cancel Print" -msgstr "取消列印" +msgstr "取消打印" msgid "Cancelled" msgstr "已取消" @@ -137,10 +137,10 @@ msgid "Cancelling" msgstr "正在取消" msgid "Cannot connect to Moonraker" -msgstr "無法連線到Moonraker" +msgstr "無法連接到Moonraker" msgid "Changes how the interface looks" -msgstr "改變介面的外觀" +msgstr "變更介面外觀" msgid "Changes how the time remaining is calculated" msgstr "更改剩餘時間的計算方式" @@ -173,14 +173,14 @@ msgid "Connected" msgstr "已連線" msgid "Connecting" -msgstr "" +msgstr "連接中" #, python-format msgid "Connecting to %s" msgstr "連線到 %s" msgid "Connection failed" -msgstr "" +msgstr "連接失敗" msgid "Console" msgstr "控制台" @@ -189,10 +189,10 @@ msgid "Cooldown" msgstr "冷卻" msgid "Couldn't add network" -msgstr "" +msgstr "無法新增網路" msgid "Current" -msgstr "" +msgstr "目前" msgid "Current percentage and graph line" msgstr "當前百分比和折線圖" @@ -219,14 +219,14 @@ msgid "Disable for 12hs with am / pm" msgstr "在十二小時顯示模式中不顯示AM/PM" msgid "Disconnect" -msgstr "断开" +msgstr "斷開連線" msgid "Distance (mm)" msgstr "擠出長度(mm)" #, python-format msgid "Do you want to forget or disconnect %s?" -msgstr "" +msgstr "您想忘記或斷開%s嗎?" #, python-format msgid "Do you want to recover %s?" @@ -239,34 +239,34 @@ msgid "Emergency Stop" msgstr "緊急停止" msgid "Enable screen power management" -msgstr "開啟螢幕功率管理功能" +msgstr "開啟螢幕電源管理功能" msgid "Error" msgstr "錯誤" msgid "Error clearing active spool" -msgstr "" +msgstr "清除使用中的線盤時發生錯誤" msgid "Error getting active spool" -msgstr "" +msgstr "取得使用中的線盤時發生錯誤" msgid "Error setting active spool" -msgstr "" +msgstr "設定使用中的線盤時發生錯誤" msgid "Error trying to fetch spools" -msgstr "" +msgstr "嘗試獲取線盤時發生錯誤" msgid "Error: Couldn't get a position to probe" msgstr "錯誤:無法取得要探測的位置" msgid "Estimated Time" -msgstr "" +msgstr "預計時間" msgid "Estimated Time Method" msgstr "估算剩餘時間方式" msgid "Example" -msgstr "" +msgstr "範例" msgid "Exclude Object" msgstr "排除目標" @@ -287,10 +287,10 @@ msgid "Extrusion -" msgstr "擠壓 -" msgid "Failed to delete connection" -msgstr "" +msgstr "刪除連線失敗" msgid "Failed to initialize" -msgstr "" +msgstr "初始化失敗" msgid "Failed, adjust position first" msgstr "失敗,請先調整位置" @@ -299,19 +299,19 @@ msgid "Fan" msgstr "風扇" msgid "Filament" -msgstr "" +msgstr "線材" msgid "Filament Used" -msgstr "已消耗耗材" +msgstr "已用線材" msgid "Filament total:" -msgstr "使用耗材總數:" +msgstr "使用線材總數:" msgid "Filament used:" -msgstr "使用耗材:" +msgstr "已用線材:" msgid "Filament:" -msgstr "耗材:" +msgstr "線材:" msgid "File" msgstr "檔案" @@ -323,7 +323,7 @@ msgid "Filter" msgstr "過濾器" msgid "Finding ADXL" -msgstr "查詢ADXL" +msgstr "尋找ADXL中" msgid "Fine Tuning" msgstr "微調" @@ -343,17 +343,20 @@ msgstr "流速:" msgid "Font Size" msgstr "字型大小" +msgid "For mouse control or to verify touchscreen accuracy" +msgstr "用於滑鼠控制或驗證觸控螢幕的準確性" + msgid "Forget" -msgstr "" +msgstr "忘記" msgid "Full Update" msgstr "全部更新" msgid "Gcodes" -msgstr "" +msgstr "Gcode" msgid "Getting IP address" -msgstr "" +msgstr "取得IP位址" msgid "Go Back" msgstr "返回" @@ -365,28 +368,25 @@ msgid "Hide" msgstr "隱藏" msgid "Hide sensors in Temp." -msgstr "在溫度顯示中隱藏其他感測器" - -msgid "Hide temp." -msgstr "隱藏溫度" +msgstr "在溫度顯示中隱藏感測器" msgid "Home" -msgstr "歸零" +msgstr "歸位" msgid "Home All" -msgstr "全部歸零" +msgstr "全部歸位" msgid "Home X" -msgstr "X軸歸零" +msgstr "歸位X軸" msgid "Home XY" -msgstr "XY軸歸零" +msgstr "歸位XY軸" msgid "Home Y" -msgstr "Y軸歸零" +msgstr "歸位Y軸" msgid "Home Z" -msgstr "Z軸歸零" +msgstr "歸位Z軸" msgid "Host" msgstr "主機" @@ -407,10 +407,10 @@ msgid "Initiate a PID calibration for:" msgstr "啟動PID校準:" msgid "Input Shaper" -msgstr "共振補償" +msgstr "輸入整形" msgid "Insufficient privileges" -msgstr "" +msgstr "權限不足" msgid "Interface" msgstr "介面" @@ -421,8 +421,11 @@ msgstr "無效" msgid "Invalid password" msgstr "密碼無效" +msgid "Invalid temperature" +msgstr "無效的溫度" + msgid "Inversely affects the icon size" -msgstr "" +msgstr "反轉圖示大小效果" msgid "Invert X" msgstr "反轉X軸" @@ -437,10 +440,10 @@ msgid "It may take more than 5 minutes depending on the heater power." msgstr "這可能需要5分鐘以上的時間,這取決於加熱器的功率。" msgid "It's possible that the configuration is not correct" -msgstr "" +msgstr "配置可能不正確" msgid "Job Status" -msgstr "" +msgstr "工作狀態" msgid "Klipper Restart" msgstr "重啟Klipper" @@ -462,28 +465,28 @@ msgstr "Klipper將重新啟動" msgid "" "LOAD_FILAMENT/UNLOAD_FILAMENT are hidden and should be used from extrude" -msgstr "" +msgstr "LOAD_FILAMENT/UNLOAD_FILAMENT 已被隱藏,應從擠出功能中使用" msgid "Language" -msgstr "介面語言" +msgstr "語言" msgid "Large" msgstr "大" msgid "Last Duration" -msgstr "" +msgstr "上次耗時" msgid "Last Used" msgstr "最後使用" msgid "Layer Height" -msgstr "" +msgstr "層高" msgid "Layer:" -msgstr "層:" +msgstr "層數:" msgid "Leds" -msgstr "" +msgstr "LED" msgid "Left:" msgstr "剩餘時間:" @@ -492,10 +495,13 @@ msgid "Limits" msgstr "列印機限制" msgid "Load" -msgstr "載入耗材" +msgstr "裝載線材" msgid "Loading..." -msgstr "載入中..." +msgstr "裝載中..." + +msgid "Lock" +msgstr "鎖定" msgid "Lost Connection to Moonraker" msgstr "與Moonraker失去連接" @@ -525,7 +531,7 @@ msgid "Max Velocity" msgstr "最大速度" msgid "Max:" -msgstr "" +msgstr "最大:" msgid "Maximum" msgstr "最大" @@ -549,10 +555,10 @@ msgid "Menu" msgstr "選單" msgid "Minimum Cruise Ratio" -msgstr "" +msgstr "最小巡航率" msgid "Minimum:" -msgstr "" +msgstr "最小:" msgid "Modified" msgstr "已修改" @@ -561,7 +567,7 @@ msgid "Moonraker: connected" msgstr "Moonraker:已連線" msgid "More" -msgstr "更多設定" +msgstr "更多" msgid "Move" msgstr "移動" @@ -576,13 +582,13 @@ msgid "Network" msgstr "網路" msgid "Network connected" -msgstr "" +msgstr "網路已連線" msgid "Network disconnected" -msgstr "" +msgstr "網路已斷線" msgid "Network not found" -msgstr "" +msgstr "未找到網路" msgid "Never" msgstr "從不" @@ -594,48 +600,48 @@ msgid "No elegible macros:" msgstr "無可用巨集:" msgid "No info available" -msgstr "" +msgstr "沒有可用的資訊" msgid "No mesh has been loaded" -msgstr "未載入網床" +msgstr "未載入網格" msgid "No wireless interface has been found" -msgstr "未找到wifi介面" +msgstr "未找到WiFi介面" msgid "Not all screens support this" -msgstr "" +msgstr "並非所有螢幕都支援此功能" msgid "Not working or not configured" -msgstr "" +msgstr "無法運作或未配置" msgid "Nothing selected" msgstr "未選擇任何內容" msgid "Notification log empty" -msgstr "" +msgstr "通知紀錄為空" msgid "Notifications" -msgstr "" +msgstr "通知" msgid "Nozzle diameter" -msgstr "" +msgstr "噴嘴直徑" msgid "Only for the move panel" -msgstr "" +msgstr "僅用於移動面板" #, python-format msgid "Outdated by %d" msgstr "已過時 %d" -msgid "PSK for" -msgstr "PSK" - msgid "Package will be updated" msgid_plural "Packages will be updated" -msgstr[0] "軟體包將被更新" +msgstr[0] "套件將被更新" msgid "Part Fan" -msgstr "模型風扇" +msgstr "列印件風扇" + +msgid "Password" +msgstr "密碼" msgid "Password saved" msgstr "密碼已儲存" @@ -656,7 +662,7 @@ msgid "Please recompile and flash the micro-controller." msgstr "請重新編譯並燒錄微控制器。" msgid "Please wait" -msgstr "" +msgstr "請稍候" msgid "Power" msgstr "電源" @@ -665,13 +671,13 @@ msgid "Power On Printer" msgstr "啟動列印機" msgid "Pressure Advance" -msgstr "壓力推進" +msgstr "壓力提前" msgid "Pressure Advance:" -msgstr "壓力推進:" +msgstr "壓力提前:" msgid "Pressure advance" -msgstr "" +msgstr "壓力提前" msgid "Print" msgstr "列印" @@ -698,7 +704,7 @@ msgid "Profile Name:" msgstr "設定檔名稱:" msgid "Provide KlipperScreen.log when asking for help.\n" -msgstr "" +msgstr "在尋求幫助時,請提供 KlipperScreen.log。\n" msgid "Quad Gantry Level" msgstr "龍門架調平" @@ -707,7 +713,7 @@ msgid "Raise Nozzle" msgstr "升高噴嘴" msgid "Recover" -msgstr "恢復" +msgstr "還原" msgid "Recover Hard" msgstr "硬恢復(git recover hard)" @@ -722,7 +728,7 @@ msgid "Refresh" msgstr "重新整理" msgid "Remove network" -msgstr "" +msgstr "移除網路" msgid "Rename/Move:" msgstr "重新命名/移動:" @@ -734,7 +740,7 @@ msgid "Resume" msgstr "繼續" msgid "Retract" -msgstr "抽回" +msgstr "回抽" msgid "Retraction" msgstr "回抽" @@ -752,7 +758,7 @@ msgid "Retrying" msgstr "正在重試" msgid "Rotation invalid" -msgstr "" +msgstr "旋轉無效" msgid "Save" msgstr "儲存" @@ -783,7 +789,7 @@ msgid "Screws Adjust" msgstr "螺絲調整" msgid "Screws not used:" -msgstr "" +msgstr "未使用的螺絲:" msgid "Send" msgstr "發送" @@ -801,13 +807,16 @@ msgid "Show Heater Power" msgstr "顯示加熱器功率" msgid "Show Scrollbars Buttons" -msgstr "" +msgstr "顯示捲軸按鈕" + +msgid "Show cursor" +msgstr "顯示游標" msgid "Show only devices that are able to be set" -msgstr "" +msgstr "僅顯示可以設置的設備" msgid "Shutdown" -msgstr "關閉" +msgstr "關機" msgid "Size" msgstr "大小" @@ -822,7 +831,7 @@ msgid "Small" msgstr "小" msgid "Smooth time" -msgstr "" +msgstr "平滑時間" msgid "Speed (mm/s)" msgstr "速度(mm/s)" @@ -840,7 +849,7 @@ msgid "Square Corner Velocity" msgstr "直角速度" msgid "Standby" -msgstr "" +msgstr "待機" msgid "Start" msgstr "開始" @@ -852,7 +861,7 @@ msgid "Starting update for" msgstr "開始更新" msgid "Swaps buttons if they are on top of each other, affects other panels" -msgstr "" +msgstr "交換按鈕位置,此選項將影響其他面板" msgid "System" msgstr "系統" @@ -864,7 +873,7 @@ msgid "System Shutdown" msgstr "關閉系統" msgid "System:" -msgstr "" +msgstr "系統:" msgid "Temp (°C)" msgstr "溫度 (°C)" @@ -872,33 +881,42 @@ msgstr "溫度 (°C)" msgid "Temperature" msgstr "溫度" +msgid "Temperature too low to extrude" +msgstr "溫度過低無法擠出" + msgid "The system doesn't meet the minimum requirement" -msgstr "" +msgstr "系統不符合最低要求" msgid "This panel supports up-to 9 screws in a 3x3 Grid" -msgstr "" +msgstr "此面板最多支援 9 顆調平螺絲排列於 3x3 格網中" msgid "This will affect screw positions and mesh graph" -msgstr "" +msgstr "這將影響螺絲位置和網格圖表" msgid "Timeout for screen black-out or power-off" -msgstr "" +msgstr "螢幕轉黑或關機的超時設定" msgid "Timeout for screen black-out or power-off during printing" -msgstr "" +msgstr "列印過程中螢幕轉黑或關機的超時設定" msgid "Total:" -msgstr "合計:" +msgstr "總計:" msgid "Unknown Heater" -msgstr "未知加熱器" +msgstr "未知的加熱器" msgid "Unknown security type" -msgstr "" +msgstr "未知的安全類型" msgid "Unload" msgstr "解除安裝" +msgid "Unlock" +msgstr "解鎖" + +msgid "Unlock failed" +msgstr "解鎖失敗" + msgid "Unretract Extra Length" msgstr "回料長度" @@ -915,13 +933,16 @@ msgid "Updating" msgstr "正在更新" msgid "Useful for un-responsive touchscreens" -msgstr "" +msgstr "對於無回應的觸控螢幕很有幫助" + +msgid "User" +msgstr "使用者" msgid "WebRTC is not supported by the backend trying Stream" -msgstr "" +msgstr "WebRTC 不被目前後端支持,請嘗試使用其他串流媒體方式" msgid "Working" -msgstr "" +msgstr "工作中" msgid "XY Move Speed (mm/s)" msgstr "XY軸移動速度(mm/s)" @@ -950,27 +971,27 @@ msgstr[0] "更改" msgid "day" msgid_plural "days" -msgstr[0] "" +msgstr[0] "天" msgid "g" -msgstr "" +msgstr "g" msgid "hour" msgid_plural "hours" msgstr[0] "小時" msgid "macros that use 'rename_existing' are hidden" -msgstr "" +msgstr "使用 rename_existing 的巨集將會被隱藏" msgid "macros with a name starting with '_' are hidden" -msgstr "" +msgstr "以 ' _ '開頭的巨集將會被隱藏" msgid "minute" msgid_plural "minutes" msgstr[0] "分" msgid "mm" -msgstr "秒" +msgstr "mm" msgid "mm/s" msgstr "mm/s" @@ -982,11 +1003,17 @@ msgid "mm³/s" msgstr "mm³/s" msgid "s" -msgstr "" +msgstr "s" msgid "second" msgid_plural "seconds" -msgstr[0] "" +msgstr[0] "秒" + +#~ msgid "Hide temp." +#~ msgstr "隱藏溫度" + +#~ msgid "PSK for" +#~ msgstr "PSK" #~ msgid "Are you sure you want to stop the calibration?" #~ msgstr "您確定要停止校準嗎?" diff --git a/ks_includes/printer.py b/ks_includes/printer.py index 55ac106bb..dc4d30ceb 100644 --- a/ks_includes/printer.py +++ b/ks_includes/printer.py @@ -1,4 +1,5 @@ import logging + import gi gi.require_version("Gtk", "3.0") @@ -257,6 +258,7 @@ def get_printer_status_data(self): "gcode_macros": {"count": len(self.get_gcode_macros()), "list": self.get_gcode_macros()}, "leds": {"count": self.ledcount}, "config_sections": list(self.config.keys()), + "available_commands": self.available_commands, } } @@ -303,6 +305,15 @@ def get_stat(self, stat, substat=None): else: return self.data.get(stat, {}) + def set_stat(self, stat, data): + if self.data is None: + logging.error("Data is not initialized") + return + if stat not in self.data: + logging.error(f"Stat '{stat}' not found in data") + return + self.data[stat].update(data) + def get_fan_speed(self, fan="fan"): speed = 0 if fan not in self.config or fan not in self.data: diff --git a/ks_includes/screen_panel.py b/ks_includes/screen_panel.py index a5b01c11b..f753be1b5 100644 --- a/ks_includes/screen_panel.py +++ b/ks_includes/screen_panel.py @@ -1,5 +1,6 @@ -import logging import datetime +import logging + import gi gi.require_version("Gtk", "3.0") diff --git a/ks_includes/sdbus_nm.py b/ks_includes/sdbus_nm.py index 4c9f906eb..e0e148b4b 100644 --- a/ks_includes/sdbus_nm.py +++ b/ks_includes/sdbus_nm.py @@ -1,8 +1,9 @@ # This is the backend of the UI panel that communicates to sdbus-networkmanager # TODO device selection/swtichability # Alfredo Monclus (alfrix) 2024 -import subprocess import logging +import subprocess +from uuid import uuid4 import sdbus from sdbus_block.networkmanager import ( @@ -18,8 +19,6 @@ enums, exceptions, ) -from gi.repository import GLib -from uuid import uuid4 NONE = 0 # The access point has no special security requirements. PAIR_WEP40 = 1 # 40/64-bit WEP is supported for pairwise/unicast encryption. @@ -272,10 +271,13 @@ def add_network(self, ssid, psk, eap_method, identity="", phase2=None): "key-mgmt": ("s", "wpa-eap"), "eap": ("as", [eap_method]), "identity": ("s", identity), - "password": ("s", psk), + "password": ("s", psk.encode("utf-8")), } if phase2: - properties["802-11-wireless-security"]["phase2_auth"] = ("s", phase2) + if eap_method == "ttls": + properties["802-11-wireless-security"]["phase2_autheap"] = ("s", phase2) + else: + properties["802-11-wireless-security"]["phase2_auth"] = ("s", phase2) elif "WEP" in security_type: properties["802-11-wireless-security"] = { "key-mgmt": ("s", "none"), diff --git a/ks_includes/widgets/bedmap.py b/ks_includes/widgets/bedmap.py index 1da45561a..8f7ec4063 100644 --- a/ks_includes/widgets/bedmap.py +++ b/ks_includes/widgets/bedmap.py @@ -1,4 +1,3 @@ -import logging import gi gi.require_version("Gtk", "3.0") diff --git a/ks_includes/widgets/heatergraph.py b/ks_includes/widgets/heatergraph.py index 253dc8245..9cd24a105 100644 --- a/ks_includes/widgets/heatergraph.py +++ b/ks_includes/widgets/heatergraph.py @@ -22,7 +22,7 @@ def __init__(self, screen, printer, font_size, fullscreen=False, store=None): self.connect('draw', self.draw_graph) self.add_events(Gdk.EventMask.TOUCH_MASK) self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) - self.connect('button_press_event', screen.reset_screensaver_timeout) + self.connect('button_press_event', screen.screensaver.reset_timeout) self.connect('button_press_event', self.event_cb) self.font_size = round(font_size * 0.75) self.fullscreen = fullscreen @@ -69,9 +69,11 @@ def get_max_num(self, data_points=0): mnum = [0] for device in self.store: if self.store[device]['show']: - if temp := self.printer.get_temp_store(device, "temperatures", data_points): + temp = self.printer.get_temp_store(device, "temperatures", data_points) + if isinstance(temp, list): mnum.append(max(temp)) - if target := self.printer.get_temp_store(device, "targets", data_points): + target = self.printer.get_temp_store(device, "targets", data_points) + if isinstance(target, list): mnum.append(max(target)) return max(mnum) diff --git a/ks_includes/widgets/keyboard.py b/ks_includes/widgets/keyboard.py index e9b72cf20..580a78b67 100644 --- a/ks_includes/widgets/keyboard.py +++ b/ks_includes/widgets/keyboard.py @@ -1,4 +1,3 @@ -import logging import os import gi @@ -10,7 +9,7 @@ class Keyboard(Gtk.Box): langs = ["de", "en", "fr", "es"] - def __init__(self, screen, close_cb, entry=None): + def __init__(self, screen, close_cb, entry=None, box=None): super().__init__(orientation=Gtk.Orientation.VERTICAL) self.shift = [] self.shift_active = False @@ -19,11 +18,30 @@ def __init__(self, screen, close_cb, entry=None): self.keyboard.set_direction(Gtk.TextDirection.LTR) self.timeout = self.clear_timeout = None self.entry = entry + self.purpose = self.entry.get_input_purpose() + self.box = box or None language = self.detect_language(screen._config.get_main_config().get("language", None)) - logging.info(f"Keyboard {language}") - if language == "de": + if self.purpose == Gtk.InputPurpose.DIGITS: + self.keys = [ + [ + ["7", "8", "9"], + ["4", "5", "6"], + ["1", "2", "3"], + ["↓", "0", "⌫"] + ] + ] + elif self.purpose == Gtk.InputPurpose.NUMBER: + self.keys = [ + [ + ["7", "8", "9", "⌫"], + ["4", "5", "6", "+"], + ["1", "2", "3", "-"], + ["↓", "0", ".", "↓"] + ] + ] + elif language == "de": self.keys = [ [ ["q", "w", "e", "r", "t", "z", "u", "i", "o", "p", "ü"], @@ -145,6 +163,17 @@ def set_pallet(self, p): self.keyboard.remove_row(0) self.pallet_nr = p columns = 0 + + if self.purpose in (Gtk.InputPurpose.DIGITS, Gtk.InputPurpose.NUMBER): + for r, row in enumerate(self.keys[p]): + for k, key in enumerate(row): + x = k * 2 + self.keyboard.attach(self.buttons[p][r][k], x, r, 2, 1) + if x > columns: + columns = x + self.show_all() + return + for r, row in enumerate(self.keys[p][:-1]): for k, key in enumerate(row): x = k * 2 + 1 if r == 1 else k * 2 @@ -189,7 +218,7 @@ def update_entry(self, widget, key): if key == "⌫": Gtk.Entry.do_backspace(self.entry) elif key == "↓": - self.close_cb() + self.close_cb(entry=self.entry, box=self.box) return elif key == "↑": self.toggle_shift() diff --git a/ks_includes/widgets/lockscreen.py b/ks_includes/widgets/lockscreen.py new file mode 100644 index 000000000..4b201a92a --- /dev/null +++ b/ks_includes/widgets/lockscreen.py @@ -0,0 +1,97 @@ +import logging + +import gi + +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + + +class LockScreen: + def __init__(self, screen): + self.screen = screen + self.lock_box = None + self.unlock_box = None + + def lock(self, widget): + self.screen._menu_go_back(None, True) + logging.info("Locked the screen") + close = Gtk.Button() + close.connect("clicked", self.unlock) + self.lock_box = Gtk.Box( + width_request=self.screen.width, height_request=self.screen.height, + halign=Gtk.Align.CENTER + ) + self.lock_box.pack_start(close, True, True, 0) + self.lock_box.get_style_context().add_class("lock") + self.screen.overlay.add_overlay(self.lock_box) + close.grab_focus() + self.lock_box.show_all() + + def unlock(self, widget): + if not self.unlock_box: + self.unlock_box = self.create_unlock_box() + self.screen.overlay.add_overlay(self.unlock_box) + self.unlock_box.show_all() + self.screen.overlay.get_children()[0].hide() + + def create_unlock_box(self): + box = Gtk.Box( + orientation=Gtk.Orientation.VERTICAL, + width_request=self.screen.width, height_request=self.screen.height, + valign=Gtk.Align.CENTER + ) + entry = Gtk.Entry(hexpand=True, vexpand=False, placeholder_text=_("Password")) + entry.set_input_purpose(Gtk.InputPurpose.PASSWORD) + entry.set_visibility(False) + entry.connect("focus-in-event", self.screen.show_keyboard, box, self.relock) + entry.connect("activate", self.unlock_attempt, entry) + entry.get_style_context().add_class("lockscreen_entry") + entry.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, "view-reveal-symbolic") + entry.connect("icon-press", self.show_pass) + ok = Gtk.Button(label=_("Unlock")) + ok.connect("clicked", self.unlock_attempt, entry) + ok.get_style_context().add_class("lockscreen_button") + entry_row = Gtk.Box(hexpand=True, vexpand=True, valign=Gtk.Align.CENTER) + entry_row.pack_start(entry, True, True, 0) + entry_row.pack_start(ok, False, True, 0) + box.pack_start(entry_row, True, True, 0) + return box + + @staticmethod + def show_pass(entry, icon_pos, event): + entry.grab_focus() + visible = not entry.get_visibility() + entry.set_visibility(visible) + if visible: + entry.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, "view-conceal-symbolic") + entry.get_style_context().add_class("active") + else: + entry.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, "view-reveal-symbolic") + entry.get_style_context().remove_class("active") + + def relock(self, entry=None, box=None): + if not self.lock_box: + return + if self.unlock_box: + self.screen.overlay.remove(self.unlock_box) + self.unlock_box = None + self.lock_box.get_children()[0].grab_focus() + self.screen.overlay.get_children()[0].show_all() + + def unlock_attempt(self, widget, entry): + if entry.get_text() != self.screen._config.get_main_config().get("lock_password", ""): + logging.info("Failed unlock") + self.screen.show_popup_message(_("Unlock failed")) + return + self.clear_lock() + + def clear_lock(self): + if self.lock_box: + self.screen.overlay.remove(self.lock_box) + if self.unlock_box: + self.screen.overlay.remove(self.unlock_box) + self.lock_box = None + self.unlock_box = None + self.screen.remove_keyboard() + self.screen.overlay.get_children()[0].show() + logging.info("Unlocked") diff --git a/ks_includes/widgets/prompts.py b/ks_includes/widgets/prompts.py index 9d4daf08a..1c7cf9050 100644 --- a/ks_includes/widgets/prompts.py +++ b/ks_includes/widgets/prompts.py @@ -1,4 +1,5 @@ import logging + import gi gi.require_version("Gtk", "3.0") @@ -113,7 +114,7 @@ def show(self): scroll.add(self.scroll_box) content = Gtk.Grid() - if not self.screen.windowed: + if not self.screen.get_resizable(): content.attach(title, 0, 0, 1, 1) content.attach(close, 1, 0, 1, 1) content.attach(scroll, 0, 1, 2, 1) @@ -126,7 +127,7 @@ def show(self): ) self.prompt.connect("key-press-event", self._key_press_event) self.prompt.connect("delete-event", self.close) - self.screen.wake_screen() + self.screen.screensaver.close() def response(self, dialog, response_id): for button in self.buttons: diff --git a/ks_includes/widgets/screensaver.py b/ks_includes/widgets/screensaver.py new file mode 100644 index 000000000..64ceb0183 --- /dev/null +++ b/ks_includes/widgets/screensaver.py @@ -0,0 +1,87 @@ +import logging + +import gi + +gi.require_version("Gtk", "3.0") +from gi.repository import GLib, Gtk + + +class ScreenSaver: + def __init__(self, screen): + self.screen = screen + self.printer = screen.printer + self.config = screen._config + self.screensaver_timeout = None + self.blackbox = None + + def is_showing(self): + return self.blackbox is not None + + def reset_timeout(self, *args): + if self.screensaver_timeout is not None: + GLib.source_remove(self.screensaver_timeout) + self.screensaver_timeout = None + if self.screen.use_dpms: + return + if self.printer and self.printer.state in ("printing", "paused"): + use_screensaver = self.config.get_main_config().get('screen_blanking_printing') != "off" + else: + use_screensaver = self.config.get_main_config().get('screen_blanking') != "off" + if use_screensaver: + self.screensaver_timeout = GLib.timeout_add_seconds( + self.screen.blanking_time, self.show) + + def show(self): + if self.blackbox is not None: + logging.debug("Screensaver active") + return + logging.debug("Showing Screensaver") + if self.screensaver_timeout is not None: + GLib.source_remove(self.screensaver_timeout) + self.screensaver_timeout = None + if self.screen.blanking_time == 0: + return False + self.screen.remove_keyboard() + self.screen.close_popup_message() + for dialog in self.screen.dialogs: + logging.debug("Hiding dialog") + dialog.hide() + + close = Gtk.Button() + close.connect("clicked", self.close) + + box = Gtk.Box( + halign=Gtk.Align.CENTER, width_request=self.screen.width, height_request=self.screen.height) + box.pack_start(close, True, True, 0) + box.get_style_context().add_class("screensaver") + self.blackbox = box + for child in self.screen.overlay.get_children(): + child.hide() + self.screen.overlay.add(self.blackbox) + + # Avoid leaving a cursor-handle + close.grab_focus() + self.screen.gtk.set_cursor(False, window=self.screen.get_window()) + + self.blackbox.show_all() + self.screen.power_devices(None, self.config.get_main_config().get("screen_off_devices", ""), on=False) + return False + + def close(self, widget=None): + if self.blackbox is None: + return False + logging.debug("Closing Screensaver") + self.screen.overlay.remove(self.blackbox) + self.blackbox = None + for child in self.screen.overlay.get_children(): + child.show() + if self.screen.use_dpms: + self.screen.wake_screen() + else: + self.reset_timeout() + for dialog in self.screen.dialogs: + logging.info(f"Restoring Dialog {dialog}") + dialog.show() + self.screen.gtk.set_cursor(self.screen.show_cursor, window=self.screen.get_window()) + self.screen.power_devices(None, self.config.get_main_config().get("screen_on_devices", ""), on=True) + self.screen.lock_screen.relock() diff --git a/mkdocs.yml b/mkdocs.yml index 40e481702..dc0a6682d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -22,6 +22,7 @@ nav: - Remote screens: - VNC.md - Xserver-XSDL (Android): Android.md + - Multi_instance.md - Troubleshooting: - First Steps/Log: Troubleshooting.md - Network: Troubleshooting/Network.md diff --git a/panels/base_panel.py b/panels/base_panel.py index d4d953350..2e67034c2 100644 --- a/panels/base_panel.py +++ b/panels/base_panel.py @@ -10,6 +10,13 @@ from math import log from ks_includes.screen_panel import ScreenPanel +try: + import psutil + psutil_available = True +except ImportError: + psutil_available = False + logging.debug("psutil is not installed. Unable to do battery check.") + class BasePanel(ScreenPanel): def __init__(self, screen, title=None): @@ -18,29 +25,30 @@ def __init__(self, screen, title=None): self.time_min = -1 self.time_format = self._config.get_main_config().getboolean("24htime", True) self.time_update = None + self.battery_update = None self.titlebar_items = [] self.titlebar_name_type = None self.current_extruder = None self.last_usage_report = datetime.now() self.usage_report = 0 # Action bar buttons - abscale = self.bts * 1.1 - self.control['back'] = self._gtk.Button('back', scale=abscale) + self.abscale = self.bts * 1.1 + self.control['back'] = self._gtk.Button('back', scale=self.abscale) self.control['back'].connect("clicked", self.back) - self.control['home'] = self._gtk.Button('main', scale=abscale) + self.control['home'] = self._gtk.Button('main', scale=self.abscale) self.control['home'].connect("clicked", self._screen._menu_go_back, True) for control in self.control: self.set_control_sensitive(False, control) - self.control['estop'] = self._gtk.Button('emergency', scale=abscale) + self.control['estop'] = self._gtk.Button('emergency', scale=self.abscale) self.control['estop'].connect("clicked", self.emergency_stop) - self.control['estop'].set_no_show_all(True) + # self.control['estop'].set_no_show_all(True) self.shutdown = { "panel": "shutdown", } - self.control['shutdown'] = self._gtk.Button('shutdown', scale=abscale) + self.control['shutdown'] = self._gtk.Button('shutdown', scale=self.abscale) self.control['shutdown'].connect("clicked", self.menu_item_clicked, self.shutdown) - self.control['shutdown'].set_no_show_all(True) - self.control['printer_select'] = self._gtk.Button('shuffle', scale=abscale) + # self.control['shutdown'].set_no_show_all(True) + self.control['printer_select'] = self._gtk.Button('shuffle', scale=self.abscale) self.control['printer_select'].connect("clicked", self._screen.show_printer_select) self.control['printer_select'].set_no_show_all(True) @@ -48,7 +56,7 @@ def __init__(self, screen, title=None): "panel": "gcode_macros", "icon": "custom-script", } - self.control['shortcut'] = self._gtk.Button(self.shorcut['icon'], scale=abscale) + self.control['shortcut'] = self._gtk.Button(self.shorcut['icon'], scale=self.abscale) self.control['shortcut'].connect("clicked", self.menu_item_clicked, self.shorcut) self.control['shortcut'].set_no_show_all(True) @@ -85,11 +93,23 @@ def __init__(self, screen, title=None): self.control['time_box'] = Gtk.Box(halign=Gtk.Align.END) self.control['time_box'].pack_end(self.control['time'], True, True, 10) + self.battery_icons = self.load_battery_icons() + self.labels['battery'] = Gtk.Label() + self.labels['battery_icon'] = self._gtk.Image() + self.labels['battery_icon'].set_from_pixbuf(self.battery_icons['unknown']) + self.control['battery_box'] = Gtk.Box(halign=Gtk.Align.END) + self.control['battery_box'].set_no_show_all(True) + self.control['battery_box'].add(self.labels['battery']) + self.control['battery_box'].add(self.labels['battery_icon']) + for widget in self.control['battery_box']: + widget.show() + self.titlebar = Gtk.Box(spacing=5, valign=Gtk.Align.CENTER) self.titlebar.get_style_context().add_class("title_bar") self.titlebar.add(self.control['temp_box']) self.titlebar.add(self.titlelbl) self.titlebar.add(self.control['time_box']) + self.titlebar.add(self.control['battery_box']) self.set_title(title) # Main layout @@ -108,24 +128,44 @@ def __init__(self, screen, title=None): self.update_time() + def load_battery_icons(self): + img_size = self._gtk.img_scale * self.bts + return { + 'charging': self._gtk.PixbufFromIcon('battery-charging', img_size, img_size), + '100': self._gtk.PixbufFromIcon('battery-100', img_size, img_size), + '75': self._gtk.PixbufFromIcon('battery-75', img_size, img_size), + '50': self._gtk.PixbufFromIcon('battery-50', img_size, img_size), + '25': self._gtk.PixbufFromIcon('battery-25', img_size, img_size), + '0': self._gtk.PixbufFromIcon('battery-0', img_size, img_size), + 'unknown': self._gtk.PixbufFromIcon('battery-unknown', img_size, img_size), + } + def reload_icons(self): button: Gtk.Button for button in self.action_bar.get_children(): img = button.get_image() name = button.get_name() pixbuf = img.get_pixbuf() - width = pixbuf.get_width() - height = pixbuf.get_height() - button.set_image(self._gtk.Image(name, width, height)) + if pixbuf is not None: + size = pixbuf.get_width() + else: + logging.error(f"Couldn't get pixbuf for {name}," + f"a custom theme may have caused this") + size = self._gtk.img_scale * self.abscale * 1.4 + button.set_image(self._gtk.Image(name, size, size)) + + self.battery_icons = self.load_battery_icons() + self.battery_percentage() def show_heaters(self, show=True): + for child in self.control['temp_box'].get_children(): + self.control['temp_box'].remove(child) + if self._printer is None or not show: + return try: - for child in self.control['temp_box'].get_children(): - self.control['temp_box'].remove(child) devices = self._printer.get_temp_devices() - if not show or not devices: + if not devices: return - img_size = self._gtk.img_scale * self.bts for device in devices: self.labels[device] = Gtk.Label(ellipsize=Pango.EllipsizeMode.START) @@ -153,6 +193,9 @@ def show_heaters(self, show=True): elif device.startswith("heater"): self.control['temp_box'].add(self.labels[f"{device}_box"]) n += 1 + elif device.startswith("temperature"): + self.control['temp_box'].add(self.labels[f"{device}_box"]) + n += 1 for device in devices: # Users can fill the bar if they want if n >= nlimit + 1: @@ -191,14 +234,17 @@ def get_icon(self, device, img_size): def activate(self): if self.time_update is None: self.time_update = GLib.timeout_add_seconds(1, self.update_time) + if self.battery_update is None: + self.battery_update = GLib.timeout_add_seconds(60, self.battery_percentage) def add_content(self, panel): printing = self._printer and self._printer.state in {"printing", "paused"} connected = self._printer and self._printer.state not in {'disconnected', 'startup', 'shutdown', 'error'} + printer_select = 'printer_select' not in self._screen._cur_panels self.control['estop'].set_visible(printing) - self.control['shutdown'].set_visible(not printing) - self.show_shortcut(connected) - self.show_heaters(connected) + self.control['shutdown'].set_visible(printing) + self.show_shortcut(connected and printer_select) + self.show_heaters(connected and printer_select) self.show_printer_select(len(self._config.get_printers()) > 1) for control in ('back', 'home'): self.set_control_sensitive(len(self._screen._cur_panels) > 1, control=control) @@ -259,10 +305,12 @@ def process_update(self, action, data): for dialog in self._screen.dialogs: self._gtk.remove_dialog(dialog) return - if action != "notify_status_update" or self._screen.printer is None: return - for device in self._printer.get_temp_devices(): + devices = self._printer.get_temp_devices() + if not devices: + return + for device in devices: temp = self._printer.get_stat(device, "temperature") if temp and device in self.labels: name = "" @@ -309,7 +357,10 @@ def show_printer_select(self, show=True): def set_title(self, title): self.titlebar.get_style_context().remove_class("message_popup_error") - if self._screen.connecting_to_printer != "Printer": + if ( + self._screen.connecting_to_printer != "Printer" + and 'printer_select' not in self._screen._cur_panels + ): printer = self._screen.connecting_to_printer else: printer = "" @@ -338,6 +389,39 @@ def update_time(self): self.time_format = confopt return True + def get_battery_icon(self, charge: float, plugged: bool): + if plugged: + return self.battery_icons['charging'] + elif charge > 75: + return self.battery_icons['100'] + elif charge > 50: + return self.battery_icons['75'] + elif charge > 25: + return self.battery_icons['50'] + elif charge > 10: + return self.battery_icons['25'] + elif charge >= 0: + return self.battery_icons['0'] + else: + return self.battery_icons['unknown'] + + def battery_percentage(self): + if not psutil_available: + return False + battery = psutil.sensors_battery() + if battery and battery.percent: + self.labels['battery_icon'].set_from_pixbuf( + self.get_battery_icon(battery.percent, battery.power_plugged) + ) + self.labels['battery'].set_text(f'{battery.percent:.0f}%') + logging.debug(f"Battery: {battery.percent}% Power plugged in: {'Yes' if battery.power_plugged else 'No'}") + self.control['battery_box'].show() + return True + else: + logging.debug("Battery information not available.") + self.control['battery_box'].hide() + return False + def set_ks_printer_cfg(self, printer): ScreenPanel.ks_printer_cfg = self._config.get_printer_config(printer) if self.ks_printer_cfg is not None: diff --git a/panels/bed_level.py b/panels/bed_level.py index 9820b8890..81f7c5110 100644 --- a/panels/bed_level.py +++ b/panels/bed_level.py @@ -1,6 +1,7 @@ import logging -import re import math +import re + import gi gi.require_version("Gtk", "3.0") diff --git a/panels/bed_mesh.py b/panels/bed_mesh.py index a153c5015..dd63ed25b 100644 --- a/panels/bed_mesh.py +++ b/panels/bed_mesh.py @@ -1,5 +1,6 @@ import contextlib import logging + import gi gi.require_version("Gtk", "3.0") @@ -241,6 +242,16 @@ def calibrate_mesh(self, widget): self._screen.show_popup_message(_("Calibrating"), level=1) if self._printer.get_stat("toolhead", "homed_axes") != "xyz": self._screen._ws.klippy.gcode_script("G28") + if ( + "Z_TILT_ADJUST" in self._printer.available_commands + and not bool(self._printer.get_stat("z_tilt", "applied")) + ): + self._screen._ws.klippy.gcode_script("Z_TILT_ADJUST") + if ( + "QUAD_GANTRY_LEVEL" in self._printer.available_commands + and not bool(self._printer.get_stat("quad_gantry_level", "applied")) + ): + self._screen._ws.klippy.gcode_script("QUAD_GANTRY_LEVEL") self._screen._send_action(widget, "printer.gcode.script", {"script": "BED_MESH_CALIBRATE"}) def send_clear_mesh(self, widget): diff --git a/panels/camera.py b/panels/camera.py index e1e8bd65c..b41e3a80d 100644 --- a/panels/camera.py +++ b/panels/camera.py @@ -1,5 +1,6 @@ -import mpv import logging +import mpv + import gi gi.require_version("Gtk", "3.0") @@ -54,19 +55,20 @@ def play(self, widget, cam): if '/webrtc' in url: self._screen.show_popup_message(_('WebRTC is not supported by the backend trying Stream')) url = url.replace('/webrtc', '/stream') - vf = "" + vf_list = [] if cam["flip_horizontal"]: - vf += "hflip," + vf_list.append("hflip") if cam["flip_vertical"]: - vf += "vflip," - vf += f"rotate:{cam['rotation'] * 3.14159 / 180}" - logging.info(f"video filters: {vf}") + vf_list.append("vflip") + if cam["rotation"] != 0: + vf_list.append(f"rotate:{cam['rotation'] * 3.14159 / 180}") + logging.info(f"video filters: {vf_list}") if self.mpv: self.mpv.terminate() self.mpv = mpv.MPV(fullscreen=True, log_handler=self.log, vo='gpu,wlshm,xv,x11') - self.mpv.vf = vf + self.mpv.vf = ','.join(vf_list) with suppress(Exception): self.mpv.profile = 'sw-fast' @@ -96,6 +98,14 @@ def clicked(): self._screen._menu_go_back() def log(self, loglevel, component, message): - logging.debug(f'[{loglevel}] {component}: {message}') - if loglevel == 'error' and 'No Xvideo support found' not in message and 'youtube-dl' not in message: + if ( + 'unable to decode' in message # skip proprietary app fields errors + or 'No Xvideo support found' in message # will fall back to other vo automatically + or 'GBM' in message # will fall back to other vo automatically + or 'open TTY for VT control' in message # not important to notify in the UI + or 'youtube-dl' in message # needed for some streams, not relevant for our case + ): + return + if loglevel == 'error': self._screen.show_popup_message(f'{message}') + logging.debug(f'[{loglevel}] {component}: {message}') diff --git a/panels/console.py b/panels/console.py index 6fbe631cd..a30e26615 100644 --- a/panels/console.py +++ b/panels/console.py @@ -1,5 +1,6 @@ -import time import re +import time + import gi gi.require_version("Gtk", "3.0") diff --git a/panels/exclude.py b/panels/exclude.py index 93c89acd8..f4d0314a3 100644 --- a/panels/exclude.py +++ b/panels/exclude.py @@ -1,4 +1,5 @@ import logging + import gi gi.require_version("Gtk", "3.0") @@ -75,7 +76,10 @@ def exclude_object(self, widget, name): ) def exclude_current(self, widget): - self.exclude_object(widget, f"{self.current_object.get_label()}") + current = self._printer.data["exclude_object"]["current_object"] + if current is None: + return + self.exclude_object(widget, f"{current}") def process_update(self, action, data): if action == "notify_status_update": diff --git a/panels/extrude.py b/panels/extrude.py index 75dea68ec..41d3ba2a7 100644 --- a/panels/extrude.py +++ b/panels/extrude.py @@ -1,5 +1,6 @@ import logging import re + import gi gi.require_version("Gtk", "3.0") @@ -20,8 +21,8 @@ def __init__(self, screen, title): self.load_filament = any("LOAD_FILAMENT" in macro.upper() for macro in macros) self.unload_filament = any("UNLOAD_FILAMENT" in macro.upper() for macro in macros) - self.speeds = ['1', '2', '5', '25'] - self.distances = ['5', '10', '15', '25'] + self.speeds = ['2', '6', '9', '25'] + self.distances = ['5', '15', '30', '50'] if self.ks_printer_cfg is not None: dis = self.ks_printer_cfg.get("extrude_distances", '') if re.match(r'^[0-9,\s]+$', dis): @@ -36,7 +37,7 @@ def __init__(self, screen, title): self.distance = int(self.distances[1]) self.speed = int(self.speeds[1]) self.buttons = { - 'extrude': self._gtk.Button("extrude", _("Extrude"), "color4"), + 'extrude': self._gtk.Button("extrude", _("Unretract"), "color4"), 'load': self._gtk.Button("arrow-down", _("Load"), "color3"), 'unload': self._gtk.Button("arrow-up", _("Unload"), "color2"), 'retract': self._gtk.Button("retract", _("Retract"), "color1"), @@ -295,14 +296,14 @@ def load_unload(self, widget, direction): if not self.unload_filament: self._screen.show_popup_message("Macro UNLOAD_FILAMENT not found") else: - self._screen._send_action(widget, "printer.gcode.script", - {"script": f"UNLOAD_FILAMENT SPEED={self.speed * 60}"}) + self._screen._confirm_send_action(widget, _("Are you sure want to unload the current filament spool?"), "printer.gcode.script", + {"script": f"UNLOAD_FILAMENT"}) if direction == "+": if not self.load_filament: self._screen.show_popup_message("Macro LOAD_FILAMENT not found") else: - self._screen._send_action(widget, "printer.gcode.script", - {"script": f"LOAD_FILAMENT SPEED={self.speed * 60}"}) + self._screen._confirm_send_action(widget, _("Are you sure want to load a NEW reel of filament?"), "printer.gcode.script", + {"script": f"LOAD_FILAMENT"}) def enable_disable_fs(self, switch, gparams, name, x): if switch.get_active(): diff --git a/panels/fan.py b/panels/fan.py index 8e1abe321..e6348c75d 100644 --- a/panels/fan.py +++ b/panels/fan.py @@ -1,4 +1,5 @@ import logging + import gi gi.require_version("Gtk", "3.0") @@ -56,7 +57,8 @@ def add_fan(self, fan): changeable = any(fan.startswith(x) or fan == x for x in CHANGEABLE_FANS) name = Gtk.Label(halign=Gtk.Align.START, valign=Gtk.Align.CENTER, hexpand=True, vexpand=True, wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR) - fan_name = _("Part Fan") if fan == "fan" else fan.split()[1] + fan_name = _("Part Fan") if fan == "fan" else _("Chamber Fan") + # fan_name = _("Part Fan") if fan == "fan" else fan.split()[1] name.set_markup(f"\n{fan_name}\n") fan_col = Gtk.Box(spacing=5) diff --git a/panels/fine_tune.py b/panels/fine_tune.py index 7d48f2c3a..0ab43644a 100644 --- a/panels/fine_tune.py +++ b/panels/fine_tune.py @@ -1,5 +1,6 @@ import logging import re + import gi gi.require_version("Gtk", "3.0") diff --git a/panels/gcode_macros.py b/panels/gcode_macros.py index 9465d6459..f7e6efb77 100644 --- a/panels/gcode_macros.py +++ b/panels/gcode_macros.py @@ -1,5 +1,6 @@ import logging import re + import gi gi.require_version("Gtk", "3.0") @@ -79,25 +80,68 @@ def add_gcode_macro(self, macro): "row": row, "params": {}, } - pattern = r'params\.(?P[a-zA-Z0-9_]+)(?:\s*\|.*\s*default\(\s*(?P[^\)]+)\))?' + + pattern = re.compile(r'params\.(?P[a-zA-Z0-9_]+)' + r'(?:\s*\|\s*default\(\s*(?P[^\)]+)\s*\))?' + r'(?:\s*\|\s*(?P[a-zA-Z]+))?') for line in gcode: if line.startswith("{") and "params." in line: result = re.search(pattern, line) if result: result = result.groupdict() - default = result["default"] if "default" in result else "" + default = result.get("default", "") + type_hint = result.get("type_hint", "") entry = Gtk.Entry(placeholder_text=default) + if type_hint == "int": + entry.set_input_purpose(Gtk.InputPurpose.DIGITS) + entry.set_input_hints(Gtk.InputHints.NO_EMOJI) + entry.get_style_context().add_class("active") + elif type_hint == "float": + entry.set_input_purpose(Gtk.InputPurpose.NUMBER) + entry.set_input_hints(Gtk.InputHints.EMOJI) + entry.get_style_context().add_class("active") + else: + entry.set_input_purpose(Gtk.InputPurpose.ALPHA) + entry.set_input_hints(Gtk.InputHints.NONE) + icon = self._gtk.PixbufFromIcon("hashtag") + entry.set_icon_from_pixbuf(Gtk.EntryIconPosition.SECONDARY, icon) + entry.connect("icon-press", self.on_icon_pressed) self.macros[macro]["params"].update({result["param"]: entry}) for param in self.macros[macro]["params"]: labels.add(Gtk.Label(param)) - self.macros[macro]["params"][param].connect("focus-in-event", self._screen.show_keyboard) + self.macros[macro]["params"][param].connect("focus-in-event", self.show_keyboard) self.macros[macro]["params"][param].connect("focus-out-event", self._screen.remove_keyboard) labels.add(self.macros[macro]["params"][param]) + def show_keyboard(self, entry, event): + self._screen.show_keyboard(entry, event) + GLib.timeout_add(100, self.scroll_to_entry, entry) + + def scroll_to_entry(self, entry): + self.labels['macros_list'].get_vadjustment().set_value( + entry.get_allocation().y - 50 + ) + + def on_icon_pressed(self, entry, icon_pos, event): + entry.grab_focus() + self._screen.remove_keyboard() + if entry.get_input_purpose() == Gtk.InputPurpose.ALPHA: + if entry.get_input_hints() in (Gtk.InputHints.NONE, Gtk.InputHints.EMOJI): + entry.set_input_purpose(Gtk.InputPurpose.NUMBER) + else: + entry.set_input_purpose(Gtk.InputPurpose.DIGITS) + entry.get_style_context().add_class("active") + else: + entry.set_input_purpose(Gtk.InputPurpose.ALPHA) + entry.get_style_context().remove_class("active") + self.show_keyboard(entry, event) + def run_gcode_macro(self, widget, macro): params = "" for param in self.macros[macro]["params"]: + self.macros[macro]["params"][param].set_sensitive(False) # Move focus to prevent + self.macros[macro]["params"][param].set_sensitive(True) # reopening the osk value = self.macros[macro]["params"][param].get_text() if value: if re.findall(r'[G|M]\d{1,3}', macro): diff --git a/panels/gcodes.py b/panels/gcodes.py index a369e3316..973f1840a 100644 --- a/panels/gcodes.py +++ b/panels/gcodes.py @@ -1,5 +1,6 @@ import logging import os + import gi gi.require_version("Gtk", "3.0") @@ -69,7 +70,7 @@ def __init__(self, screen, title): self.labels['path'] = Gtk.Label(label=self.loading_msg, vexpand=True, no_show_all=True) self.labels['path'].show() self.thumbsize = self._gtk.img_scale * self._gtk.button_image_scale * 2.5 - logging.info(f"Thumbsize: {self.thumbsize}") + logging.info(f"Thumbsize: {self.thumbsize:.1f}") self.flowbox = Gtk.FlowBox(selection_mode=Gtk.SelectionMode.NONE, column_spacing=0, row_spacing=0) @@ -155,6 +156,9 @@ def create_item(self, item): rename = Gtk.Button(hexpand=False, vexpand=False, can_focus=False, always_show_image=True) rename.get_style_context().add_class("color2") rename.set_image(self._gtk.Image("files", self.list_button_size, self.list_button_size)) + move = Gtk.Button(hexpand=False, vexpand=False, can_focus=False, always_show_image=True) + move.get_style_context().add_class("color3") + move.set_image(self._gtk.Image("sd", self.list_button_size, self.list_button_size)) itemname = Gtk.Label(hexpand=True, halign=Gtk.Align.START, ellipsize=Pango.EllipsizeMode.END) itemname.get_style_context().add_class("print-filename") itemname.set_markup(f"{basename}") @@ -171,6 +175,7 @@ def create_item(self, item): icon.connect("clicked", self.confirm_print, path) image_args = (path, icon, self.thumbsize / 2, True, "file") delete.connect("clicked", self.confirm_delete_file, f"gcodes/{path}") + move.connect("clicked", self.confirm_move_file, f"gcodes/{path}") rename.connect("clicked", self.show_rename, f"gcodes/{path}") action_icon = "printer" if self._printer.extrudercount > 0 else "load" action = self._gtk.Button(action_icon, style="color3") @@ -237,6 +242,29 @@ def confirm_delete_file(self, widget, filepath): params ) + def confirm_move_file(self, widget, filepath): + logging.debug(f"Sending move_file {filepath}") + filename = filepath.split("/")[-1] + dest = "gcodes/" + filename + params = {"source": f"{filepath}", + "dest": f"{dest}"} + gcodes_path = "/home/pi/printer_data/" + check_file = os.path.exists(gcodes_path + dest) + if check_file: + self._screen._confirm_send_action( + None, + _("A file with this name already exists") + "\n\n" + _("You may be trying to move a file that is already in the main directory") + "\n\n" + _("Replace it?") + "\n\n" + filepath, + "server.files.move", + params + ) + else: + self._screen._confirm_send_action( + None, + _("This function is designed to move a file to the main directory") + "\n\n"+ _("Move file to main directory?") + "\n\n" + filepath, + "server.files.move", + params + ) + def confirm_delete_directory(self, widget, dirpath): logging.debug(f"Sending delete_directory {dirpath}") params = {"path": f"{dirpath}", "force": True} @@ -323,6 +351,13 @@ def confirm_print(self, widget, filename): {"name": _("Cancel"), "response": Gtk.ResponseType.CANCEL, "style": 'dialog-secondary'} ] + buttons_usb = [ + {"name": _("Delete"), "response": Gtk.ResponseType.REJECT, "style": 'dialog-error'}, + {"name": _("Resave"), "response": Gtk.ResponseType.APPLY, "style": 'dialog-secondary'}, + {"name": action, "response": Gtk.ResponseType.OK, "style": 'dialog-primary'}, + {"name": _("Cancel"), "response": Gtk.ResponseType.CANCEL, "style": 'dialog-secondary'} + ] + label = Gtk.Label( hexpand=True, vexpand=True, lines=2, wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR, @@ -358,7 +393,13 @@ def confirm_print(self, widget, filename): inside_box.pack_start(info_box, True, True, 0) main_box.pack_start(inside_box, True, True, 0) - self._gtk.Dialog(f'{action} {filename}', buttons, main_box, self.confirm_print_response, filename) + # self._gtk.Dialog(f'{action} {filename}', buttons, main_box, self.confirm_print_response, filename) + + dir_path = "/home/pi/printer_data/gcodes/" + if os.path.isfile(f"{dir_path} + {filename}"): + self._gtk.Dialog(f'{action} {filename}', buttons, main_box, self.confirm_print_response, filename) + else: + self._gtk.Dialog(f'{action} {filename}', buttons_usb, main_box, self.confirm_print_response, filename) def confirm_print_response(self, dialog, response_id, filename): self._gtk.remove_dialog(dialog) @@ -367,6 +408,9 @@ def confirm_print_response(self, dialog, response_id, filename): elif response_id == Gtk.ResponseType.OK: logging.info(f"Starting print: {filename}") self._screen._ws.klippy.print_start(filename) + elif response_id == Gtk.ResponseType.APPLY: + logging.info(f"Move file {filename} to internal storage") + self.confirm_move_file(self, f"gcodes/{filename}") elif response_id == Gtk.ResponseType.REJECT: self.confirm_delete_file(None, f"gcodes/{filename}") diff --git a/panels/gcodes_old.py b/panels/gcodes_old.py new file mode 100644 index 000000000..808ea28f0 --- /dev/null +++ b/panels/gcodes_old.py @@ -0,0 +1,611 @@ +import logging +import os +import gi + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, Pango +from datetime import datetime +from ks_includes.screen_panel import ScreenPanel +from ks_includes.KlippyGtk import find_widget +from ks_includes.widgets.flowboxchild_extended import PrintListItem + + +def format_label(widget): + label = find_widget(widget, Gtk.Label) + if label is not None: + label.set_line_wrap_mode(Pango.WrapMode.CHAR) + label.set_line_wrap(True) + label.set_ellipsize(Pango.EllipsizeMode.END) + label.set_lines(3) + + +class Panel(ScreenPanel): + def __init__(self, screen, title): + title = title or (_("Print") if self._printer.extrudercount > 0 else _("Gcodes")) + super().__init__(screen, title) + sortdir = self._config.get_main_config().get("print_sort_dir", "name_asc") + sortdir = sortdir.split('_') + self.sort_items = { + "name": _("Name"), + "date": _("Date"), + "size": _("Size"), + } + if sortdir[0] not in self.sort_items or sortdir[1] not in ["asc", "desc"]: + sortdir = ["name", "asc"] + self.sort_current = [sortdir[0], 0 if sortdir[1] == "asc" else 1] # 0 for asc, 1 for desc + self.sort_icon = ["arrow-up", "arrow-down"] + self.source = "" + self.time_24 = self._config.get_main_config().getboolean("24htime", True) + self.showing_rename = False + self.loading = False + self.cur_directory = 'gcodes' + self.list_button_size = self._gtk.img_scale * self.bts + + self.headerbox = Gtk.Box(hexpand=True, vexpand=False) + n = 0 + for name, val in self.sort_items.items(): + s = self._gtk.Button(None, val, f"color{n % 4 + 1}", .5, Gtk.PositionType.RIGHT, 1) + s.get_style_context().add_class("buttons_slim") + if name == self.sort_current[0]: + s.set_image(self._gtk.Image(self.sort_icon[self.sort_current[1]], self._gtk.img_scale * self.bts)) + s.connect("clicked", self.change_sort, name) + self.labels[f'sort_{name}'] = s + self.headerbox.add(s) + n += 1 + + self.refresh = self._gtk.Button("refresh", style=f"color{n % 4 + 1}", scale=self.bts) + self.refresh.get_style_context().add_class("buttons_slim") + self.refresh.connect('clicked', self._refresh_files) + n += 1 + self.headerbox.add(self.refresh) + + self.switch_mode = self._gtk.Button("fine-tune", style=f"color{n % 4 + 1}", scale=self.bts) + self.switch_mode.get_style_context().add_class("buttons_slim") + self.switch_mode.connect('clicked', self.switch_view_mode) + n += 1 + self.headerbox.add(self.switch_mode) + + self.loading_msg = _('Loading...') + self.labels['path'] = Gtk.Label(label=self.loading_msg, vexpand=True, no_show_all=True) + self.labels['path'].show() + self.thumbsize = self._gtk.img_scale * self._gtk.button_image_scale * 2.5 + logging.info(f"Thumbsize: {self.thumbsize}") + + self.flowbox = Gtk.FlowBox(selection_mode=Gtk.SelectionMode.NONE, + column_spacing=0, row_spacing=0) + list_mode = self._config.get_main_config().get("print_view", 'thumbs') + logging.info(list_mode) + self.list_mode = list_mode == 'list' + if self.list_mode: + self.flowbox.set_min_children_per_line(1) + self.flowbox.set_max_children_per_line(1) + else: + columns = 3 if self._screen.vertical_mode else 4 + self.flowbox.set_min_children_per_line(columns) + self.flowbox.set_max_children_per_line(columns) + + self.scroll = self._gtk.ScrolledWindow() + self.scroll.add(self.flowbox) + + self.main = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, vexpand=True) + self.main.add(self.headerbox) + self.main.add(self.labels['path']) + self.main.add(self.scroll) + self.content.add(self.main) + self.set_loading(True) + self._screen._ws.klippy.get_dir_info(self.load_files, self.cur_directory) + + def switch_view_mode(self, widget): + self.list_mode ^= True + logging.info(f"lista {self.list_mode}") + if self.list_mode: + self.flowbox.set_min_children_per_line(1) + self.flowbox.set_max_children_per_line(1) + else: + columns = 3 if self._screen.vertical_mode else 4 + self.flowbox.set_min_children_per_line(columns) + self.flowbox.set_max_children_per_line(columns) + self._config.set("main", "print_view", 'list' if self.list_mode else 'thumbs') + self._config.save_user_config_options() + self._refresh_files() + + def activate(self): + if self.cur_directory != "gcodes": + self.change_dir() + self._screen.files.add_callback(self._callback) + + def deactivate(self): + self._screen.files.remove_callback(self._callback) + + def create_item(self, item): + fbchild = PrintListItem() + fbchild.set_date(item['modified']) + fbchild.set_size(item['size']) + if 'dirname' in item: + if item['dirname'].startswith("."): + return + name = item['dirname'] + path = f"{self.cur_directory}/{name}" + fbchild.set_as_dir(True) + elif 'filename' in item: + if (item['filename'].startswith(".") or + os.path.splitext(item['filename'])[1] not in {'.gcode', '.gco', '.g'}): + return + name = item['filename'] + path = f"{self.cur_directory}/{name}" + path = path.replace('gcodes/', '') + else: + logging.error(f"Unknown item {item}") + return + basename = os.path.splitext(name)[0] + fbchild.set_path(path) + fbchild.set_name(basename.casefold()) + if self.list_mode: + label = Gtk.Label(label=basename, hexpand=True, vexpand=False) + format_label(label) + info = Gtk.Label( + hexpand=True, halign=Gtk.Align.START, xalign=0, + wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR, + ) + info.get_style_context().add_class("print-info") + info.set_markup(self.get_info_str(item, path)) + delete = Gtk.Button(hexpand=False, vexpand=False, can_focus=False, always_show_image=True) + delete.get_style_context().add_class("color1") + delete.set_image(self._gtk.Image("delete", self.list_button_size, self.list_button_size)) + rename = Gtk.Button(hexpand=False, vexpand=False, can_focus=False, always_show_image=True) + rename.get_style_context().add_class("color2") + rename.set_image(self._gtk.Image("files", self.list_button_size, self.list_button_size)) + move = Gtk.Button(hexpand=False, vexpand=False, can_focus=False, always_show_image=True) + move.get_style_context().add_class("color3") + move.set_image(self._gtk.Image("sd", self.list_button_size, self.list_button_size)) + itemname = Gtk.Label(hexpand=True, halign=Gtk.Align.START, ellipsize=Pango.EllipsizeMode.END) + itemname.get_style_context().add_class("print-filename") + itemname.set_markup(f"{basename}") + icon = Gtk.Button() + row = Gtk.Grid(hexpand=True, vexpand=False, valign=Gtk.Align.CENTER) + row.get_style_context().add_class("frame-item") + if self._screen.width >= 400: + row.attach(icon, 0, 0, 1, 2) + row.attach(itemname, 1, 0, 3, 1) + row.attach(info, 1, 1, 1, 1) + row.attach(rename, 2, 1, 1, 1) + row.attach(delete, 3, 1, 1, 1) + # row.attach(move, 4, 1, 1, 1) + if 'filename' in item: + icon.connect("clicked", self.confirm_print, path) + image_args = (path, icon, self.thumbsize / 2, True, "file") + delete.connect("clicked", self.confirm_delete_file, f"gcodes/{path}") + move.connect("clicked", self.confirm_move_file, f"gcodes/{path}") + rename.connect("clicked", self.show_rename, f"gcodes/{path}") + action_icon = "printer" if self._printer.extrudercount > 0 else "load" + action = self._gtk.Button(action_icon, style="color3") + action.connect("clicked", self.confirm_print, path) + action.set_hexpand(False) + action.set_vexpand(False) + action.set_halign(Gtk.Align.END) + if self._screen.width >= 400: + row.attach(action, 4, 0, 1, 2) + else: + icon.get_style_context().add_class("color3") + row.attach(icon, 4, 0, 1, 2) + elif 'dirname' in item: + icon.connect("clicked", self.change_dir, path) + image_args = (None, icon, self.thumbsize / 2, True, "folder") + delete.connect("clicked", self.confirm_delete_directory, path) + rename.connect("clicked", self.show_rename, path) + action = self._gtk.Button("load", style="color3") + action.connect("clicked", self.change_dir, path) + action.set_hexpand(False) + action.set_vexpand(False) + action.set_halign(Gtk.Align.END) + row.attach(action, 4, 0, 1, 2) + else: + return + fbchild.add(row) + else: # Thumbnail view + icon = self._gtk.Button(label=basename) + if 'filename' in item: + icon.connect("clicked", self.confirm_print, path) + image_args = (path, icon, self.thumbsize, False, "file") + elif 'dirname' in item: + icon.connect("clicked", self.change_dir, path) + image_args = (None, icon, self.thumbsize, False, "folder") + else: + return + fbchild.add(icon) + self.image_load(*image_args) + return fbchild + + def show_path(self): + self.labels['path'].set_vexpand(False) + if self.cur_directory == 'gcodes': + self.labels['path'].hide() + else: + self.labels['path'].set_text(self.cur_directory) + self.labels['path'].show() + + def image_load(self, filepath, widget, size=-1, small=True, iconname=None): + pixbuf = self.get_file_image(filepath, size, size, small) + if pixbuf is not None: + widget.set_image(Gtk.Image.new_from_pixbuf(pixbuf)) + elif iconname is not None: + widget.set_image(self._gtk.Image(iconname, size, size)) + format_label(widget) + + def confirm_delete_file(self, widget, filepath): + logging.debug(f"Sending delete_file {filepath}") + params = {"path": f"{filepath}"} + self._screen._confirm_send_action( + None, + _("Delete File?") + "\n\n" + filepath, + "server.files.delete_file", + params + ) + + def confirm_move_file(self, widget, filepath): + logging.debug(f"Sending move_file {filepath}") + filename = filepath.split("/")[-1] + dest = "gcodes/" + filename + params = {"source": f"{filepath}", + "dest": f"{dest}"} + gcodes_path = "/home/pi/printer_data/" + check_file = os.path.exists(gcodes_path + dest) + if check_file: + self._screen._confirm_send_action( + None, + _("A file with this name already exists") + "\n\n" + _("You may be trying to move a file that is already in the main directory") + "\n\n" + _("Replace it?") + "\n\n" + filepath, + "server.files.move", + params + ) + else: + self._screen._confirm_send_action( + None, + _("This function is designed to move a file to the main directory") + "\n\n"+ _("Move file to main directory?") + "\n\n" + filepath, + "server.files.move", + params + ) + + def confirm_delete_directory(self, widget, dirpath): + logging.debug(f"Sending delete_directory {dirpath}") + params = {"path": f"{dirpath}", "force": True} + self._screen._confirm_send_action( + None, + _("Delete Directory?") + "\n\n" + dirpath, + "server.files.delete_directory", + params + ) + + def back(self): + if self.showing_rename: + self.hide_rename() + return True + if self.cur_directory != 'gcodes': + self.change_dir(None, os.path.dirname(self.cur_directory)) + return True + return False + + def change_dir(self, widget=None, directory='gcodes'): + if directory == '': + directory = 'gcodes' + if directory != self.cur_directory: + logging.info(f'Changing directory to: {directory}') + self.cur_directory = directory + self.show_path() + self._refresh_files() + + def change_sort(self, widget, key): + if self.sort_current[0] == key: + self.sort_current[1] = (self.sort_current[1] + 1) % 2 + else: + oldkey = self.sort_current[0] + logging.info(f"Changing from {oldkey} to {key}") + self.labels[f'sort_{oldkey}'].set_image(None) + self.labels[f'sort_{oldkey}'].show_all() + self.sort_current = [key, 0] + self.labels[f'sort_{key}'].set_image(self._gtk.Image(self.sort_icon[self.sort_current[1]], + self._gtk.img_scale * self.bts)) + self.labels[f'sort_{key}'].show() + + self.set_sort() + + self._config.set("main", "print_sort_dir", f'{key}_{"asc" if self.sort_current[1] == 0 else "desc"}') + self._config.save_user_config_options() + + def set_sort(self): + reverse = self.sort_current[1] != 0 + if self.sort_current[0] == "name": + self.flowbox.set_sort_func(self.sort_names, reverse) + elif self.sort_current[0] == "date": + self.flowbox.set_sort_func(self.sort_dates, reverse) + elif self.sort_current[0] == "size": + self.flowbox.set_sort_func(self.sort_sizes, reverse) + + @staticmethod + def sort_names(a: PrintListItem, b: PrintListItem, reverse): + if a.get_is_dir() - b.get_is_dir() != 0: + return a.get_is_dir() - b.get_is_dir() + if a.get_name() < b.get_name(): + return 1 if reverse else -1 + if a.get_name() > b.get_name(): + return -1 if reverse else 1 + return 0 + + @staticmethod + def sort_sizes(a: PrintListItem, b: PrintListItem, reverse): + if a.get_is_dir() - b.get_is_dir() != 0: + return a.get_is_dir() - b.get_is_dir() + return b.get_size() - a.get_size() if reverse else a.get_size() - b.get_size() + + @staticmethod + def sort_dates(a: PrintListItem, b: PrintListItem, reverse): + if a.get_is_dir() - b.get_is_dir() != 0: + return a.get_is_dir() - b.get_is_dir() + return b.get_date() - a.get_date() if reverse else a.get_date() - b.get_date() + + def confirm_print(self, widget, filename): + action = _("Print") if self._printer.extrudercount > 0 else _("Start") + + buttons = [ + {"name": _("Delete"), "response": Gtk.ResponseType.REJECT, "style": 'dialog-error'}, + {"name": action, "response": Gtk.ResponseType.OK, "style": 'dialog-primary'}, + {"name": _("Cancel"), "response": Gtk.ResponseType.CANCEL, "style": 'dialog-secondary'} + ] + + buttons_usb = [ + {"name": _("Delete"), "response": Gtk.ResponseType.REJECT, "style": 'dialog-error'}, + {"name": _("Resave"), "response": Gtk.ResponseType.APPLY, "style": 'dialog-secondary'}, + {"name": action, "response": Gtk.ResponseType.OK, "style": 'dialog-primary'}, + {"name": _("Cancel"), "response": Gtk.ResponseType.CANCEL, "style": 'dialog-secondary'} + ] + + label = Gtk.Label( + hexpand=True, vexpand=True, lines=2, + wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR, + ellipsize=Pango.EllipsizeMode.END + ) + label.set_markup(f"{filename}") + + main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, vexpand=True) + main_box.pack_start(label, False, False, 0) + + orientation = Gtk.Orientation.VERTICAL if self._screen.vertical_mode else Gtk.Orientation.HORIZONTAL + inside_box = Gtk.Box(orientation=orientation, vexpand=True) + + if self._screen.vertical_mode: + width = self._screen.width * .9 + height = (self._screen.height - self._gtk.dialog_buttons_height - self._gtk.font_size * 5) * .45 + else: + width = self._screen.width * .5 + height = (self._screen.height - self._gtk.dialog_buttons_height - self._gtk.font_size * 6) + pixbuf = self.get_file_image(filename, width, height) + if pixbuf is not None: + image = Gtk.Image.new_from_pixbuf(pixbuf) + image_button = self._gtk.Button() + image_button.set_image(image) + image_button.connect("clicked", self.show_fullscreen_thumbnail, filename) + inside_box.pack_start(image_button, True, True, 0) + + info_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, vexpand=True) + fileinfo = Gtk.Label( + label=self.get_file_info_extended(filename), use_markup=True, ellipsize=Pango.EllipsizeMode.END + ) + info_box.pack_start(fileinfo, True, True, 0) + + inside_box.pack_start(info_box, True, True, 0) + main_box.pack_start(inside_box, True, True, 0) + + dir_path = "/home/pi/printer_data/gcodes/" + if os.path.isfile(f"{dir_path} + {filename}"): + self._gtk.Dialog(f'{action} {filename}', buttons, main_box, self.confirm_print_response, filename) + else: + self._gtk.Dialog(f'{action} {filename}', buttons_usb, main_box, self.confirm_print_response, filename) + + def confirm_print_response(self, dialog, response_id, filename): + self._gtk.remove_dialog(dialog) + if response_id == Gtk.ResponseType.CANCEL: + return + elif response_id == Gtk.ResponseType.OK: + logging.info(f"Starting print: {filename}") + self._screen._ws.klippy.print_start(filename) + elif response_id == Gtk.ResponseType.APPLY: + logging.info(f"Move file {filename} to internal storage") + self.confirm_move_file(self, f"gcodes/{filename}") + elif response_id == Gtk.ResponseType.REJECT: + self.confirm_delete_file(None, f"gcodes/{filename}") + + def get_info_str(self, item, path): + info = "" + if "modified" in item: + info += _("Modified") + if self.time_24: + info += f': {datetime.fromtimestamp(item["modified"]):%Y/%m/%d %H:%M}\n' + else: + info += f': {datetime.fromtimestamp(item["modified"]):%Y/%m/%d %I:%M %p}\n' + if "size" in item: + info += _("Size") + f': {self.format_size(item["size"])}\n' + if 'filename' in item: + info += self.get_file_info(path) + return info + + def get_file_info(self, path): + info = "" + fileinfo = self._screen.files.get_file_info(path) + if "layer_height" in fileinfo: + info += _("Layer Height") + f': {fileinfo["layer_height"]} ' + _("mm") + '\n' + if "filament_type" in fileinfo: + info += _("Filament") + f': {fileinfo["filament_type"]}\n' + if "filament_name" in fileinfo: + info += f'{fileinfo["filament_name"]}\n' + if "estimated_time" in fileinfo: + info += _("Estimated Time") + f': {self.format_time(fileinfo["estimated_time"])}' + return info + + def get_file_info_extended(self, filename): + fileinfo = self._screen.files.get_file_info(filename) + info = "" + if "modified" in fileinfo: + info += _("Modified") + if self.time_24: + info += f': {datetime.fromtimestamp(fileinfo["modified"]):%Y/%m/%d %H:%M}\n' + else: + info += f': {datetime.fromtimestamp(fileinfo["modified"]):%Y/%m/%d %I:%M %p}\n' + if "layer_height" in fileinfo: + info += _("Layer Height") + f': {fileinfo["layer_height"]} ' + _("mm") + '\n' + if "filament_type" in fileinfo or "filament_name" in fileinfo: + info += _("Filament") + ':\n' + if "filament_type" in fileinfo: + info += f' {fileinfo["filament_type"]}\n' + if "filament_name" in fileinfo: + info += f' {fileinfo["filament_name"]}\n' + if "filament_weight_total" in fileinfo: + info += f' {fileinfo["filament_weight_total"]:.2f} ' + _("g") + '\n' + if "nozzle_diameter" in fileinfo: + info += _("Nozzle diameter") + f': {fileinfo["nozzle_diameter"]} ' + _("mm") + '\n' + if "slicer" in fileinfo: + info += ( + _("Slicer") + + f': {fileinfo["slicer"]} ' + f'{fileinfo["slicer_version"] if "slicer_version" in fileinfo else ""}\n' + ) + if "size" in fileinfo: + info += _("Size") + f': {self.format_size(fileinfo["size"])}\n' + if "estimated_time" in fileinfo: + info += _("Estimated Time") + f': {self.format_time(fileinfo["estimated_time"])}\n' + if "job_id" in fileinfo: + history = self._screen.apiclient.send_request(f"server/history/job?uid={fileinfo['job_id']}") + if history and history['job']['status'] == "completed": + info += _("Last Duration") + f": {self.format_time(history['job']['print_duration'])}" + return info + + def load_files(self, result, method, params): + start = datetime.now() + self.set_loading(True) + if not result.get("result") or not isinstance(result["result"], dict): + logging.info(result) + return + items = [self.create_item(item) for item in [*result["result"]["dirs"], *result["result"]["files"]]] + for item in filter(None, items): + self.flowbox.add(item) + self.set_sort() + self.set_loading(False) + logging.info(f"Loaded in {(datetime.now() - start).total_seconds():.3f} seconds") + + def delete_from_list(self, path): + logging.info(f"deleting {path}") + for item in self.flowbox.get_children(): + if item.get_path() in {path, f"gcodes/{path}"}: + logging.info("found removing") + self.flowbox.remove(item) + return True + + def add_item_from_callback(self, action, data): + item = data['item'] + if 'source_item' in data: + self.delete_from_list(data['source_item']['path']) + else: + self.delete_from_list(item['path']) + path = os.path.join("gcodes", item["path"]) + if self.cur_directory != os.path.dirname(path): + return + if action in {"create_dir", "move_dir"}: + item.update({"path": path, "dirname": os.path.split(item["path"])[1]}) + else: + item.update({"path": path, "filename": os.path.split(item["path"])[1]}) + fbchild = self.create_item(item) + if fbchild: + self.flowbox.add(fbchild) + self.flowbox.invalidate_sort() + self.flowbox.show_all() + + def _callback(self, action, data): + logging.info(f"{action}: {data}") + if action in {"create_dir", "create_file"}: + self.add_item_from_callback(action, data) + elif action == "delete_file": + self.delete_from_list(data['item']["path"]) + elif action == "delete_dir": + self.delete_from_list(os.path.join("gcodes", data['item']["path"])) + elif action in {"modify_file", "move_file", "move_dir"}: + if "path" in data['item'] and data['item']["path"].startswith("gcodes/"): + data['item']["path"] = data['item']["path"][7:] + self.add_item_from_callback(action, data) + + def _refresh_files(self, *args): + logging.info("Refreshing") + self.set_loading(True) + for child in self.flowbox.get_children(): + self.flowbox.remove(child) + self._screen._ws.klippy.get_dir_info(self.load_files, self.cur_directory) + + def set_loading(self, loading): + self.loading = loading + for child in self.headerbox.get_children(): + child.set_sensitive(not loading) + self._gtk.Button_busy(self.refresh, loading) + if loading: + self.labels['path'].set_text(self.loading_msg) + self.labels['path'].show() + return + self.show_path() + self.content.show_all() + + def show_rename(self, widget, fullpath): + self.source = fullpath + logging.info(self.source) + + for child in self.content.get_children(): + self.content.remove(child) + + if "rename_file" not in self.labels: + self._create_rename_box(fullpath) + self.content.add(self.labels['rename_file']) + self.labels['new_name'].set_text(fullpath[7:]) + self.labels['new_name'].grab_focus_without_selecting() + self.showing_rename = True + + def _create_rename_box(self, fullpath): + lbl = Gtk.Label(label=_("Rename/Move:"), halign=Gtk.Align.START, hexpand=False) + self.labels['new_name'] = Gtk.Entry(text=fullpath, hexpand=True) + self.labels['new_name'].connect("activate", self.rename) + self.labels['new_name'].connect("focus-in-event", self._screen.show_keyboard) + + save = self._gtk.Button("complete", _("Save"), "color3") + save.set_hexpand(False) + save.connect("clicked", self.rename) + + box = Gtk.Box() + box.pack_start(self.labels['new_name'], True, True, 5) + box.pack_start(save, False, False, 5) + + self.labels['rename_file'] = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5, + hexpand=True, vexpand=True, valign=Gtk.Align.CENTER) + self.labels['rename_file'].pack_start(lbl, True, True, 5) + self.labels['rename_file'].pack_start(box, True, True, 5) + + def hide_rename(self): + self._screen.remove_keyboard() + for child in self.content.get_children(): + self.content.remove(child) + self.content.add(self.main) + self.content.show() + self.showing_rename = False + + def rename(self, widget): + params = {"source": self.source, "dest": f"gcodes/{self.labels['new_name'].get_text()}"} + self._screen._send_action( + widget, + "server.files.move", + params + ) + self.back() + + def show_fullscreen_thumbnail(self, widget, filename): + pixbuf = self.get_file_image(filename, self._screen.width * .9, self._screen.height * .75) + if pixbuf is None: + return + image = Gtk.Image.new_from_pixbuf(pixbuf) + image.set_vexpand(True) + self._gtk.Dialog(filename, None, image, self.close_fullscreen_thumbnail) + + def close_fullscreen_thumbnail(self, dialog, response_id): + self._gtk.remove_dialog(dialog) \ No newline at end of file diff --git a/panels/input_shaper.py b/panels/input_shaper.py index e5c3bd7d1..871a431b3 100644 --- a/panels/input_shaper.py +++ b/panels/input_shaper.py @@ -1,4 +1,5 @@ import re + import gi gi.require_version("Gtk", "3.0") diff --git a/panels/job_status.py b/panels/job_status.py index 9ee487ae1..af17af908 100644 --- a/panels/job_status.py +++ b/panels/job_status.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import logging import os + import gi gi.require_version("Gtk", "3.0") @@ -16,6 +17,7 @@ class Panel(ScreenPanel): def __init__(self, screen, title): title = title or _("Job Status") super().__init__(screen, title) + self.thumb_dialog = None self.grid = Gtk.Grid(column_homogeneous=True) self.pos_z = 0.0 self.extrusion = 100 @@ -25,19 +27,29 @@ def __init__(self, screen, title): self.oheight = 0.0 self.current_extruder = None self.fila_section = pi * ((1.75 / 2) ** 2) - self.filename_label = self.filename = self.prev_pos = self.prev_gpos = None + self.filename_label = {'complete': "Filename"} + self.filename = "" + self.prev_pos = None + self.prev_gpos = None self.can_close = False - self.flow_timeout = self.animation_timeout = None + self.flow_timeout = None + self.animation_timeout = None self.file_metadata = self.fans = {} self.state = "standby" self.timeleft_type = "auto" - self.progress = self.zoffset = self.flowrate = self.vel = 0.0 + self.progress = 0.0 + self.zoffset = 0.0 + self.flowrate = 0.0 + self.vel = 0.0 self.flowstore = [] self.mm = _("mm") self.mms = _("mm/s") self.mms2 = _("mm/s²") self.mms3 = _("mm³/s") - self.status_grid = self.move_grid = self.time_grid = self.extrusion_grid = None + self.status_grid = None + self.move_grid = None + self.time_grid = None + self.extrusion_grid = None data = ['pos_x', 'pos_y', 'pos_z', 'time_left', 'duration', 'slicer_time', 'file_time', 'filament_time', 'est_time', 'speed_factor', 'req_speed', 'max_accel', 'extrude_factor', 'zoffset', @@ -328,11 +340,16 @@ def on_draw(self, da, ctx): def activate(self): if self.flow_timeout is None: self.flow_timeout = GLib.timeout_add_seconds(2, self.update_flow) + if self.animation_timeout is None: + self.animation_timeout = GLib.timeout_add(500, self.animate_label) def deactivate(self): if self.flow_timeout is not None: GLib.source_remove(self.flow_timeout) self.flow_timeout = None + if self.animation_timeout is not None: + GLib.source_remove(self.animation_timeout) + self.animation_timeout = None def create_buttons(self): @@ -449,11 +466,12 @@ def disable_button(self, *args): self.buttons[arg].set_sensitive(False) def new_print(self): - self._screen.close_screensaver() + self._screen.screensaver.close() if "virtual_sdcard" in self._printer.data: logging.info("reseting progress") self._printer.data["virtual_sdcard"]["progress"] = 0 self.update_progress(0.0) + self.set_state("printing") def process_update(self, action, data): if action == "notify_gcode_response": @@ -700,10 +718,12 @@ def set_state(self, state, msg=""): if self.state != state: logging.debug(f"Changing job_status state from '{self.state}' to '{state}'") self.state = state + if self.thumb_dialog: + self.close_dialog(self.thumb_dialog) self.show_buttons_for_state() def _add_timeout(self, timeout): - self._screen.close_screensaver() + self._screen.screensaver.close() if timeout != 0: GLib.timeout_add_seconds(timeout, self.close_panel) @@ -775,17 +795,15 @@ def show_fullscreen_thumbnail(self, widget): return image = Gtk.Image.new_from_pixbuf(pixbuf) image.set_vexpand(True) - self._gtk.Dialog(self.filename, None, image, self.close_fullscreen_thumbnail) + self.thumb_dialog = self._gtk.Dialog(self.filename, None, image, self.close_dialog) - def close_fullscreen_thumbnail(self, dialog, response_id): + def close_dialog(self, dialog=None, response_id=None): self._gtk.remove_dialog(dialog) + self.thumb_dialog = None def update_filename(self, filename): if not filename or filename == self.filename: return - if self.animation_timeout is not None: - GLib.source_remove(self.animation_timeout) - self.animation_timeout = None self.filename = filename logging.debug(f"Updating filename to {filename}") @@ -794,18 +812,9 @@ def update_filename(self, filename): "complete": self.labels['file'].get_label(), "current": self.labels['file'].get_label(), } - - if ellipsized := self.labels['file'].get_layout().is_ellipsized(): - self.animation_timeout = GLib.timeout_add(500, self.animate_label) - else: - self.animation_timeout = None - self.get_file_metadata() def animate_label(self): - if not self.filename_label or self.animation_timeout is None: - return False - if ellipsized := self.labels['file'].get_layout().is_ellipsized(): self.filename_label['current'] = self.filename_label['current'][1:] self.labels['file'].set_label(self.filename_label['current'] + " " * 6) @@ -833,7 +842,7 @@ def _update_file_metadata(self): self.labels["slicer_time"].set_label(self.format_time(self.file_metadata['estimated_time'])) if "object_height" in self.file_metadata: self.oheight = float(self.file_metadata['object_height']) - self.labels['height'].set_label(f"{self.oheight} {self.mm}") + self.labels['height'].set_label(f"{self.oheight:.2f} {self.mm}") if "filament_total" in self.file_metadata: self.labels['filament_total'].set_label(f"{float(self.file_metadata['filament_total']) / 1000:.1f} m") if "job_id" in self.file_metadata and self.file_metadata['job_id']: diff --git a/panels/led.py b/panels/led.py index ee7d5e592..788433328 100644 --- a/panels/led.py +++ b/panels/led.py @@ -1,4 +1,5 @@ import logging + import gi gi.require_version("Gtk", "3.0") @@ -8,15 +9,32 @@ from ks_includes.screen_panel import ScreenPanel +def rgb_to_hex(color): + hex_color = '#' + for value in color: + int_value = round(value * 255) + hex_color += hex(int_value)[2:].zfill(2) + return hex_color.upper() + + +def rgbw_to_rgb(color): + # The idea here is to use the white channel as a saturation control + # The white channel 'washes' the color + return ( + [color[3] for i in range(3)] # Special case of only white channel + if color[0] == 0 and color[1] == 0 and color[2] == 0 + else [color[i] + (1 - color[i]) * color[3] / 3 for i in range(3)] + ) + + class Panel(ScreenPanel): def __init__(self, screen, title): title = title or _("Leds") super().__init__(screen, title) self.da_size = self._gtk.img_scale * 2 - self.preview = Gtk.DrawingArea(width_request=self.da_size, height_request=self.da_size) + self.preview = ColorPreviewArea(size=self.da_size) self.preview.set_size_request(-1, self.da_size * 2) - self.preview.connect("draw", self.on_draw) self.preview_label = Gtk.Label() self.preset_list = Gtk.Grid(row_homogeneous=True, column_homogeneous=True) self.color_data = [0, 0, 0, 0] @@ -91,8 +109,8 @@ def color_selector(self, led): color = [0, 0, 0, 0] color[idx] = 1 button = self._gtk.Button() - preview = Gtk.DrawingArea(width_request=self.da_size, height_request=self.da_size) - preview.connect("draw", self.on_draw, color) + preview = ColorPreviewArea(size=self.da_size) + preview.set_color(color) button.set_image(preview) button.connect("clicked", self.apply_preset, color) button.set_hexpand(False) @@ -103,7 +121,7 @@ def color_selector(self, led): scale.set_has_origin(True) scale.get_style_context().add_class("fan_slider") scale.connect("button-release-event", self.apply_scales) - scale.connect("value_changed", self.update_preview) + scale.connect("value_changed", self.update_preview_label) self.scales[idx] = scale scale_grid.attach(button, 0, idx, 1, 1) scale_grid.attach(scale, 1, idx, 3, 1) @@ -118,8 +136,8 @@ def color_selector(self, led): self.presets.update(self.parse_presets(presets_data)) for i, key in enumerate(self.presets): logging.info(f'Adding preset: {key}') - preview = Gtk.DrawingArea(width_request=self.da_size, height_request=self.da_size) - preview.connect("draw", self.on_draw, self.presets[key]) + preview = ColorPreviewArea(size=self.da_size) + preview.set_color(self.presets[key]) button = self._gtk.Button() button.set_image(preview) button.connect("clicked", self.apply_preset, self.presets[key]) @@ -139,33 +157,15 @@ def color_selector(self, led): grid.attach(box, 3, 0, 2, 1) return grid - def on_draw(self, da, ctx, color=None): - if color is None: - color = self.color_data - ctx.set_source_rgb(*self.rgbw_to_rgb(color)) - # Set the size of the rectangle - width = height = da.get_allocated_width() * .9 - x = da.get_allocated_width() * .05 - # Set the radius of the corners - radius = width / 2 * 0.2 - ctx.arc(x + radius, radius, radius, pi, 3 * pi / 2) - ctx.arc(x + width - radius, radius, radius, 3 * pi / 2, 0) - ctx.arc(x + width - radius, height - radius, radius, 0, pi / 2) - ctx.arc(x + radius, height - radius, radius, pi / 2, pi) - ctx.close_path() - ctx.fill() - - def update_preview(self, args): - self.update_color_data() - self.preview.queue_draw() - self.preview_label.set_label(self.rgb_to_hex(self.rgbw_to_rgb(self.color_data))) + def update_preview_label(self, args): + self.preview_label.set_label(rgb_to_hex(rgbw_to_rgb(self.color_data))) def process_update(self, action, data): if action != 'notify_status_update': return if self.current_led in data and "color_data" in data[self.current_led]: self.update_scales(data[self.current_led]["color_data"][0]) - self.preview.queue_draw() + self.preview.set_color(self.color_data) def update_scales(self, color_data): for idx in self.scales: @@ -175,6 +175,7 @@ def update_scales(self, color_data): def update_color_data(self): for idx in self.scales: self.color_data[idx] = self.scales[idx].get_value() / 255 + self.preview.set_color(self.color_data) def apply_preset(self, widget, color_data): self.update_scales(color_data) @@ -202,20 +203,30 @@ def parse_presets(presets_data) -> {}: parsed[name].append(preset[color] / 255) return parsed - @staticmethod - def rgb_to_hex(color): - hex_color = '#' - for value in color: - int_value = round(value * 255) - hex_color += hex(int_value)[2:].zfill(2) - return hex_color.upper() - @staticmethod - def rgbw_to_rgb(color): - # The idea here is to use the white channel as a saturation control - # The white channel 'washes' the color - return ( - [color[3] for i in range(3)] # Special case of only white channel - if color[0] == 0 and color[1] == 0 and color[2] == 0 - else [color[i] + (1 - color[i]) * color[3] / 3 for i in range(3)] - ) +class ColorPreviewArea(Gtk.DrawingArea): + color = [0, 0, 0] + + def __init__(self, size=-1): + super().__init__(width_request=size, height_request=size) + self.connect("draw", self.on_draw) + + def set_color(self, value): + logging.debug(f"color: {value}") + self.color = rgbw_to_rgb(value) + self.queue_draw() + + def on_draw(self, da, ctx): + ctx.set_source_rgb(*self.color) + # Set the size of the rectangle + width = da.get_allocated_width() * .9 + height = da.get_allocated_height() * .9 + x = da.get_allocated_width() * .05 + # Set the radius of the corners + radius = width / 2 * 0.2 + ctx.arc(x + radius, radius, radius, pi, 3 * pi / 2) + ctx.arc(x + width - radius, radius, radius, 3 * pi / 2, 0) + ctx.arc(x + width - radius, height - radius, radius, 0, pi / 2) + ctx.arc(x + radius, height - radius, radius, pi / 2, pi) + ctx.close_path() + ctx.fill() diff --git a/panels/limits.py b/panels/limits.py index 91501b8c1..b8c8f8c88 100644 --- a/panels/limits.py +++ b/panels/limits.py @@ -1,4 +1,5 @@ import logging + import gi gi.require_version("Gtk", "3.0") diff --git a/panels/main_menu.py b/panels/main_menu.py index d2cce29c0..645a187c7 100644 --- a/panels/main_menu.py +++ b/panels/main_menu.py @@ -1,4 +1,5 @@ import logging + import gi gi.require_version("Gtk", "3.0") @@ -192,6 +193,7 @@ def change_target_temp(self, temp): else: logging.info(f"Unknown heater: {self.active_heater}") self._screen.show_popup_message(_("Unknown Heater") + " " + self.active_heater) + self._printer.set_stat(name, {"target": temp}) def verify_max_temp(self, temp): temp = int(temp) diff --git a/panels/menu.py b/panels/menu.py index 2ef1ef7b2..97761849e 100644 --- a/panels/menu.py +++ b/panels/menu.py @@ -1,5 +1,6 @@ -import logging import json +import logging + import gi gi.require_version("Gtk", "3.0") diff --git a/panels/move.py b/panels/move.py index 7814039d2..4da8e3c70 100644 --- a/panels/move.py +++ b/panels/move.py @@ -1,5 +1,6 @@ -import re import logging +import re + import gi gi.require_version("Gtk", "3.0") @@ -33,7 +34,7 @@ def __init__(self, screen, title): "y-": self._gtk.Button("arrow-down", "Y-", "color2"), "z+": self._gtk.Button("z-farther", "Z+", "color3"), "z-": self._gtk.Button("z-closer", "Z-", "color3"), - "home": self._gtk.Button("home", _("Home"), "color4"), + "home": self._gtk.Button("main", _("Actions"), "color4"), "motors_off": self._gtk.Button("motor-off", _("Disable Motors"), "color4"), } self.buttons["x+"].connect("clicked", self.move, "X", "+") diff --git a/panels/network.py b/panels/network.py index 7db0415da..2a99fd422 100644 --- a/panels/network.py +++ b/panels/network.py @@ -1,12 +1,13 @@ -import subprocess import logging import os + import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GLib, Pango from ks_includes.screen_panel import ScreenPanel from ks_includes.sdbus_nm import SdbusNm +from datetime import datetime class Panel(ScreenPanel): @@ -14,6 +15,8 @@ class Panel(ScreenPanel): def __init__(self, screen, title): title = title or _("Network") super().__init__(screen, title) + self.filename = "/home/pi/qrcode.png" + self.last_drop_time = datetime.now() self.show_add = False try: self.sdbus_nm = SdbusNm(self.popup_callback) @@ -132,6 +135,11 @@ def add_network(self, bssid): delete.set_hexpand(False) delete.set_halign(Gtk.Align.END) + qrcode = self._gtk.Button("qrcode", None, "color1", .88) + qrcode.connect("clicked", self.show_fullscreen_qrcode) + qrcode.set_hexpand(False) + qrcode.set_halign(Gtk.Align.END) + buttons = Gtk.Box(spacing=5) name = Gtk.Label(hexpand=True, halign=Gtk.Align.START, wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR) @@ -142,6 +150,7 @@ def add_network(self, bssid): name.set_markup(f"{ssid}") if net['known']: buttons.add(delete) + buttons.add(qrcode) buttons.add(connect) info = Gtk.Label(halign=Gtk.Align.START) @@ -238,7 +247,8 @@ def close_add_network(self): def connect_network(self, widget, ssid, showadd=True): self.deactivate() if showadd and not self.sdbus_nm.is_known(ssid): - if self.sdbus_nm.get_security_type(ssid) in ("Open", "OWE"): + sec_type = self.sdbus_nm.get_security_type(ssid) + if sec_type == "Open" or "OWE" in sec_type: logging.debug("Network is Open do not show psk") result = self.sdbus_nm.add_network(ssid, '') if "error" in result: @@ -262,6 +272,18 @@ def remove_network_from_list(self, bssid): del self.networks[bssid] return + def on_popup_shown(self, combo_box, params): + if combo_box.get_property("popup-shown"): + logging.debug("Dropdown popup show") + self.last_drop_time = datetime.now() + else: + elapsed = (datetime.now() - self.last_drop_time).total_seconds() + if elapsed < 0.2: + logging.debug(f"Dropdown closed too fast ({elapsed}s)") + GLib.timeout_add(50, combo_box.popup) + return + logging.debug("Dropdown popup close") + def show_add_network(self, widget, ssid): if self.show_add: return @@ -273,12 +295,14 @@ def show_add_network(self, widget, ssid): del self.labels['add_network'] eap_method = Gtk.ComboBoxText(hexpand=True) + eap_method.connect("notify::popup-shown", self.on_popup_shown) for method in ("peap", "ttls", "pwd", "leap", "md5"): eap_method.append(method, method.upper()) self.labels['network_eap_method'] = eap_method eap_method.set_active(0) phase2 = Gtk.ComboBoxText(hexpand=True) + phase2.connect("notify::popup-shown", self.on_popup_shown) for method in ("mschapv2", "gtc", "pap", "chap", "mschap", "disabled"): phase2.append(method, method.upper()) self.labels['network_phase2'] = phase2 @@ -307,7 +331,7 @@ def show_add_network(self, widget, ssid): auth_grid.attach(self.labels['network_psk'], 1, 1, 1, 1) auth_grid.attach(save, 2, 0, 1, 2) - if self.sdbus_nm.get_security_type(ssid) == "802.1x": + if "802.1x" in self.sdbus_nm.get_security_type(ssid): user_label.show() self.labels['network_eap_method'].show() self.labels['network_phase2'].show() @@ -358,10 +382,11 @@ def update_network_info(self, net): self.networks[net['BSSID']]['info'].set_markup( "" f"{info}" - f"{net['security']}\n" + # f"{net['security']}\n" f"{max_bitrate}\n" - f"{net['frequency']} Ghz {chan} {net['signal_level']} %\n" - f"{net['BSSID']}" + f"{net['frequency']} Ghz" + # f"{net['frequency']} Ghz {chan} {net['signal_level']} %\n" + # f"{net['BSSID']}" "" ) @@ -431,3 +456,24 @@ def toggle_wifi(self, switch, gparams): self.reload_networks() else: self.reload_button.hide() + + def show_fullscreen_qrcode(self, widget): + + curr_ip = self.sdbus_nm.get_ip_address() + logging.info(f"Generate QR-code with IP: {curr_ip}") + os.system(f'qrencode -s 10 -l H -o "{self.filename}" "{curr_ip}"') + logging.info(f"Generate QR-code") + + buttons = [ + {"name": _("Close"), "response": Gtk.ResponseType.CANCEL} + ] + + image = Gtk.Image.new_from_file(self.filename) + box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + box.add(image) + box.set_vexpand(True) + self._gtk.Dialog(self.filename, buttons, box, self._gtk.remove_dialog) + logging.info(f"Show QR-code") + + def close_fullscreen_qrcode(self, dialog): + self._gtk.remove_dialog \ No newline at end of file diff --git a/panels/pins.py b/panels/pins.py index 0e2cef3b8..88f3593e0 100644 --- a/panels/pins.py +++ b/panels/pins.py @@ -1,4 +1,5 @@ import logging + import gi gi.require_version("Gtk", "3.0") diff --git a/panels/power.py b/panels/power.py index a1c9255b3..141525f8a 100644 --- a/panels/power.py +++ b/panels/power.py @@ -1,4 +1,5 @@ import logging + import gi gi.require_version("Gtk", "3.0") diff --git a/panels/pressure_advance.py b/panels/pressure_advance.py index a478d9dfa..d4de88e60 100644 --- a/panels/pressure_advance.py +++ b/panels/pressure_advance.py @@ -1,8 +1,9 @@ import logging + import gi gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, Pango +from gi.repository import Gtk from ks_includes.screen_panel import ScreenPanel # TODO multi-extruder support diff --git a/panels/printer_select.py b/panels/printer_select.py index cce2c4e9b..087bbc994 100644 --- a/panels/printer_select.py +++ b/panels/printer_select.py @@ -1,8 +1,9 @@ import logging + import gi gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, GLib +from gi.repository import Gtk from ks_includes.screen_panel import ScreenPanel from ks_includes.widgets.autogrid import AutoGrid from ks_includes.KlippyGtk import find_widget diff --git a/panels/retraction.py b/panels/retraction.py index ddefc43bb..22466572c 100644 --- a/panels/retraction.py +++ b/panels/retraction.py @@ -1,4 +1,5 @@ import logging + import gi gi.require_version("Gtk", "3.0") diff --git a/panels/shutdown.py b/panels/shutdown.py index ab0f2cffb..9d1086e1c 100644 --- a/panels/shutdown.py +++ b/panels/shutdown.py @@ -1,5 +1,6 @@ import logging import os + import gi gi.require_version("Gtk", "3.0") @@ -24,13 +25,27 @@ def __init__(self, screen, title): restart_ks = self._gtk.Button("refresh", _("Restart") + " KlipperScreen", "color3") restart_ks.connect("clicked", self._screen.restart_ks) + lock_screen = self._gtk.Button("lock", _("Lock"), "color3") + lock_screen.connect("clicked", self._screen.lock_screen.lock) + + self._show_lock_button = self._config.get_main_config().getboolean('show_lock_button', False) + self.main = Gtk.Grid(row_homogeneous=True, column_homogeneous=True) - if self._printer and self._printer.state not in {'disconnected', 'startup', 'shutdown', 'error'}: - self.main.attach(estop, 0, 0, 1, 1) - self.main.attach(restart_ks, 1, 0, 1, 1) - self.main.attach(poweroff, 0, 1, 1, 1) - self.main.attach(restart, 1, 1, 1, 1) - self.content.add(self.main) + if self._show_lock_button: + if self._printer and self._printer.state not in {'disconnected', 'startup', 'shutdown', 'error'}: + self.main.attach(estop, 1, 0, 1, 1) + self.main.attach(restart_ks, 2, 0, 1, 1) + self.main.attach(lock_screen,0, 0, 1, 2) + self.main.attach(poweroff, 1, 1, 1, 1) + self.main.attach(restart, 2, 1, 1, 1) + self.content.add(self.main) + else: + if self._printer and self._printer.state not in {'disconnected', 'startup', 'shutdown', 'error'}: + self.main.attach(estop, 0, 0, 1, 1) + self.main.attach(restart_ks, 1, 0, 1, 1) + self.main.attach(poweroff, 0, 1, 1, 1) + self.main.attach(restart, 1, 1, 1, 1) + self.content.add(self.main) def reboot_poweroff(self, widget, method): label = Gtk.Label(wrap=True, hexpand=True, vexpand=True) @@ -41,11 +56,14 @@ def reboot_poweroff(self, widget, method): label.set_label(_("Are you sure you wish to shutdown the system?")) title = _("Shutdown") buttons = [] - logging.info(self._screen.apiclient.endpoint) - local = {"127.0.0.1", "localhost"} - if any(endpoint in self._screen.apiclient.endpoint for endpoint in local): + if ( + self._screen.apiclient is None + or "127.0.0.1" in self._screen.apiclient.endpoint + or "localhost" in self._screen.apiclient.endpoint + ): buttons.append({"name": _("Accept"), "response": Gtk.ResponseType.ACCEPT, "style": 'dialog-primary'}) else: + logging.info(self._screen.apiclient.endpoint) buttons.extend([ {"name": _("Host"), "response": Gtk.ResponseType.OK, "style": 'dialog-info'}, {"name": _("Printer"), "response": Gtk.ResponseType.APPLY, "style": 'dialog-warning'}, @@ -72,4 +90,12 @@ def reboot_poweroff_confirm(self, dialog, response_id, method): if method == "reboot": self._screen._ws.send_method("machine.reboot") else: + self.turn_off_power_devices() self._screen._ws.send_method("machine.shutdown") + + def turn_off_power_devices(self): + if self.ks_printer_cfg is not None and self._screen._ws.connected: + power_devices = self.ks_printer_cfg.get("power_devices", "") + if power_devices and self._printer.get_power_devices(): + logging.info(f"Turning off associated power devices: {power_devices}") + self._screen.power_devices(widget=None, devices=power_devices, on=False) diff --git a/panels/splash_screen.py b/panels/splash_screen.py index 100531d16..8349855b8 100644 --- a/panels/splash_screen.py +++ b/panels/splash_screen.py @@ -1,5 +1,6 @@ import logging import os + import gi gi.require_version("Gtk", "3.0") diff --git a/panels/spoolman.py b/panels/spoolman.py index 1174b7207..3c3e6cb65 100644 --- a/panels/spoolman.py +++ b/panels/spoolman.py @@ -1,6 +1,7 @@ +import logging import os.path import pathlib -import logging + import gi gi.require_version("Gtk", "3.0") @@ -16,13 +17,26 @@ def format_date(date): - try: - return datetime.strptime(date, '%Y-%m-%dT%H:%M:%S.%f').replace(tzinfo=ZoneInfo('UTC')) - except ValueError: + if date.endswith('Z'): + date = f'{date[:-1]}+00:00' + + formats = [ + '%Y-%m-%dT%H:%M:%S.%f%z', + '%Y-%m-%dT%H:%M:%S%z', + '%Y-%m-%dT%H:%M:%S' + ] + for fmt in formats: try: - return datetime.strptime(date, '%Y-%m-%dT%H:%M:%S').replace(tzinfo=ZoneInfo('UTC')) + parsed_date = datetime.strptime(date, fmt) + # If there's no timezone info, assume UTC + if parsed_date.tzinfo is None: + parsed_date = parsed_date.replace(tzinfo=ZoneInfo('UTC')) + return parsed_date except ValueError: - return None + continue + + logging.error(f"Date parsing failed for: {date}") + return None class SpoolmanVendor: @@ -322,6 +336,8 @@ def _get_filament_formated(self, spool: SpoolmanSpool): result = f'{spool.name}\n' else: result = f'{spool.name}\n' + if hasattr(spool, "comment"): + result += f'{_("Comment")}: {spool.comment}\n' if spool.last_used: result += f'{_("Last used")}: {spool.last_used.astimezone():{self.timeFormat}}\n' if hasattr(spool, "remaining_weight"): diff --git a/panels/system.py b/panels/system.py index 92d95296d..ae301b19d 100644 --- a/panels/system.py +++ b/panels/system.py @@ -1,4 +1,5 @@ import logging + import gi gi.require_version("Gtk", "3.0") diff --git a/panels/temperature.py b/panels/temperature.py index 1c6dacc88..889f9cec2 100644 --- a/panels/temperature.py +++ b/panels/temperature.py @@ -1,4 +1,5 @@ import logging + import gi gi.require_version("Gtk", "3.0") @@ -169,6 +170,7 @@ def change_target_temp_incremental(self, widget, direction): else: logging.info(f"Unknown heater: {heater}") self._screen.show_popup_message(_("Unknown Heater") + " " + heater) + self._printer.set_stat(heater, {"target": target}) logging.info(f"Setting {heater} to {target}") def update_graph_visibility(self, force_hide=False): @@ -478,6 +480,7 @@ def change_target_temp(self, temp): self._screen.show_popup_message( _("Unknown Heater") + " " + self.active_heater ) + self._printer.set_stat(name, {"target": temp}) def verify_max_temp(self, temp): temp = int(temp) diff --git a/panels/zcalibrate.py b/panels/zcalibrate.py index 6bf2f5b15..410dde7c2 100644 --- a/panels/zcalibrate.py +++ b/panels/zcalibrate.py @@ -1,10 +1,10 @@ import logging + import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Pango, GLib from ks_includes.screen_panel import ScreenPanel -from ks_includes.KlippyGtk import find_widget from datetime import datetime @@ -216,7 +216,8 @@ def start_calibration(self, widget): self.dropdown.set_sensitive(False) self._screen._ws.klippy.gcode_script("SET_GCODE_OFFSET Z=0") - self._screen._ws.klippy.gcode_script("BED_MESH_CLEAR") + if self._printer.config_section_exists("bed_mesh"): + self._screen._ws.klippy.gcode_script("BED_MESH_CLEAR") if self._printer.get_stat("toolhead", "homed_axes") != "xyz": self._screen._ws.klippy.gcode_script("G28") self._move_to_position(*self._get_calibration_location()) diff --git a/screen.py b/screen.py index 14a32e09e..afb65de0f 100755 --- a/screen.py +++ b/screen.py @@ -1,5 +1,6 @@ #!/usr/bin/python +import ast import argparse import gc import json @@ -28,9 +29,12 @@ from ks_includes.printer import Printer from ks_includes.widgets.keyboard import Keyboard from ks_includes.widgets.prompts import Prompt +from ks_includes.widgets.lockscreen import LockScreen +from ks_includes.widgets.screensaver import ScreenSaver from ks_includes.config import KlipperScreenConfig from panels.base_panel import BasePanel + logging.getLogger("urllib3").setLevel(logging.WARNING) klipperscreendir = pathlib.Path(__file__).parent.resolve() @@ -60,20 +64,20 @@ class KlipperScreen(Gtk.Window): keyboard = None panels = {} popup_message = None - screensaver = None - printers = printer = None + printers = None + printer = None updating = False _ws = None - screensaver_timeout = None reinit_count = 0 max_retries = 4 - initialized = initializing = False + initialized = False + initializing = False popup_timeout = None wayland = False - windowed = False notification_log = [] prompt = None tempstore_timeout = None + check_dpms_timeout = None def __init__(self, args): self.server_info = None @@ -101,7 +105,12 @@ def __init__(self, args): self.connect("key-press-event", self._key_press_event) self.connect("configure_event", self.update_size) display = Gdk.Display.get_default() + self.display_number = os.environ.get('DISPLAY') or ':0' + logging.debug(f"Display for xset: {self.display_number}") monitor_amount = Gdk.Display.get_n_monitors(display) + for i in range(monitor_amount): + m = display.get_monitor(i) + logging.info(f"Screen {i}: {m.get_geometry().width}x{m.get_geometry().height}") try: mon_n = int(args.monitor) if not (-1 < mon_n < monitor_amount): @@ -125,7 +134,6 @@ def __init__(self, args): if mon_n > 0: logging.error("Monitor selection is only supported for fullscreen") self.set_resizable(True) - self.windowed = True else: self.width = monitor.get_geometry().width self.height = monitor.get_geometry().height @@ -138,14 +146,18 @@ def __init__(self, args): self.show_cursor = self._config.get_main_config().getboolean("show_cursor", fallback=False) self.setup_gtk_settings() self.style_provider = Gtk.CssProvider() + self.screensaver = ScreenSaver(self) self.gtk = KlippyGtk(self) self.base_css = "" self.load_base_styles() self.set_icon_from_file(os.path.join(klipperscreendir, "styles", "icon.svg")) self.base_panel = BasePanel(self) self.change_theme(self.theme) - self.add(self.base_panel.main_grid) + self.overlay = Gtk.Overlay() + self.add(self.overlay) + self.overlay.add_overlay(self.base_panel.main_grid) self.show_all() + self.update_cursor(self.show_cursor) min_ver = (3, 8) if sys.version_info < min_ver: self.show_error_modal( @@ -158,21 +170,18 @@ def __init__(self, args): if self._config.errors: self.show_error_modal("Invalid config file", self._config.get_errors()) return - if self.show_cursor: - self.get_window().set_cursor( - Gdk.Cursor.new_for_display(Gdk.Display.get_default(), Gdk.CursorType.ARROW)) - os.system("xsetroot -cursor_name arrow") - else: - self.get_window().set_cursor( - Gdk.Cursor.new_for_display(Gdk.Display.get_default(), Gdk.CursorType.BLANK_CURSOR)) - os.system("xsetroot -cursor ks_includes/emptyCursor.xbm ks_includes/emptyCursor.xbm") self.base_panel.activate() self.set_screenblanking_timeout(self._config.get_main_config().get('screen_blanking')) + self.lock_screen = LockScreen(self) self.log_notification("KlipperScreen Started", 1) self.initial_connection() + def update_cursor(self, show: bool): + self.show_cursor = show + self.gtk.set_cursor(show, window=self.get_window()) + def state_execute(self, state, callback): - self.close_screensaver() + self.screensaver.close() if 'printer_select' in self._cur_panels: logging.debug(f"Connected printer chaged {state}") return False @@ -238,6 +247,8 @@ def connect_printer(self, name): self.printers[ind][name]["moonraker_host"], self.printers[ind][name]["moonraker_port"], self.printers[ind][name]["moonraker_api_key"], + self.printers[ind][name]["moonraker_path"], + self.printers[ind][name]["moonraker_ssl"], ) self._ws = KlippyWebsocket( { @@ -249,6 +260,8 @@ def connect_printer(self, name): self.printers[ind][name]["moonraker_host"], self.printers[ind][name]["moonraker_port"], self.printers[ind][name]["moonraker_api_key"], + self.printers[ind][name]["moonraker_path"], + self.printers[ind][name]["moonraker_ssl"], ) if self.files is None: self.files = KlippyFiles(self) @@ -314,6 +327,9 @@ def _load_panel(panel): def show_panel(self, panel, title=None, remove_all=False, panel_name=None, **kwargs): if panel_name is None: panel_name = panel + if self._cur_panels and panel_name == self._cur_panels[-1]: + logging.error("Panel is already is in view") + return try: if remove_all: self.panels_reinit = list(self.panels) @@ -377,7 +393,7 @@ def show_popup_message(self, message, level=3, from_ws=False): return self.last_popup_time = datetime.now() - self.close_screensaver() + self.screensaver.close() if self.popup_message is not None: self.close_popup_message() @@ -565,6 +581,7 @@ def _go_to_submenu(self, widget, name): menuitems = self._config.get_menu_items(menu, name) if len(menuitems) != 0: self.show_panel("menu", disname, panel_name=name, items=menuitems) + logging.info(f"menu, {disname}, panel_name={name}, items={menuitems}") else: logging.info("No items in menu") @@ -574,7 +591,7 @@ def _remove_all_panels(self): self._remove_current_panel() del self._cur_panels[-1] self._cur_panels.clear() - self.close_screensaver() + self.screensaver.close() gc.collect() def _remove_current_panel(self): @@ -594,133 +611,88 @@ def _menu_go_back(self, widget=None, home=False): break self.attach_panel(self._cur_panels[-1]) - def reset_screensaver_timeout(self, *args): - if self.screensaver_timeout is not None: - GLib.source_remove(self.screensaver_timeout) - self.screensaver_timeout = None - if self.use_dpms: - return - if self.printer and self.printer.state in ("printing", "paused"): - use_screensaver = self._config.get_main_config().get('screen_blanking_printing') != "off" - else: - use_screensaver = self._config.get_main_config().get('screen_blanking') != "off" - if use_screensaver: - self.screensaver_timeout = GLib.timeout_add_seconds(self.blanking_time, self.show_screensaver) - - def show_screensaver(self): - logging.debug("Showing Screensaver") - if self.screensaver is not None: - self.close_screensaver() - if self.screensaver_timeout is not None: - GLib.source_remove(self.screensaver_timeout) - self.screensaver_timeout = None - if self.blanking_time == 0: - return False - self.remove_keyboard() - self.close_popup_message() - for dialog in self.dialogs: - logging.debug("Hiding dialog") - dialog.hide() - - close = Gtk.Button() - close.connect("clicked", self.close_screensaver) - - box = Gtk.Box(halign=Gtk.Align.CENTER, width_request=self.width, height_request=self.height) - box.pack_start(close, True, True, 0) - box.get_style_context().add_class("screensaver") - self.remove(self.base_panel.main_grid) - self.add(box) - - # Avoid leaving a cursor-handle - close.grab_focus() - self.screensaver = box - self.screensaver.show_all() - self.power_devices(None, self._config.get_main_config().get("screen_off_devices", ""), on=False) - return False - - def close_screensaver(self, widget=None): - if self.screensaver is None: - return False - logging.debug("Closing Screensaver") - self.remove(self.screensaver) - self.screensaver = None - self.add(self.base_panel.main_grid) - if self.use_dpms: - self.wake_screen() - else: - self.reset_screensaver_timeout() - for dialog in self.dialogs: - logging.info(f"Restoring Dialog {dialog}") - dialog.show() - self.show_all() - self.power_devices(None, self._config.get_main_config().get("screen_on_devices", ""), on=True) - def check_dpms_state(self): if not self.use_dpms: return False state = functions.get_DPMS_state() if state == functions.DPMS_State.Fail: - logging.info("DPMS State FAIL: Stopping DPMS Check") + self.show_popup_message(_("DPMS has failed and has been disabled")) self.set_dpms(False) return False elif state != functions.DPMS_State.On: - if self.screensaver is None: - self.show_screensaver() + if not self.screensaver.is_showing(): + self.screensaver.show() return True def wake_screen(self): # Wake the screen (it will go to standby as configured) + if not self.use_dpms: + logging.debug("DPMS is disabled cannot wake the screen") + return if self._config.get_main_config().get('screen_blanking') != "off": logging.debug("Screen wake up") - if not self.wayland: - os.system("xset -display :0 dpms force on") + try: + subprocess.run( + f"xset -display {self.display_number} dpms force on", + shell=True, check=True + ) + except subprocess.CalledProcessError as e: + self.show_popup_message(f"Error: {e}") + self.set_dpms(False) + return def set_dpms(self, use_dpms): + if not use_dpms: + if self.check_dpms_timeout is not None: + GLib.source_remove(self.check_dpms_timeout) + self.check_dpms_timeout = None self.use_dpms = use_dpms + self._config.set("main", "use_dpms", use_dpms) + self._config.save_user_config_options() logging.info(f"DPMS set to: {self.use_dpms}") if self.printer.state in ("printing", "paused"): self.set_screenblanking_timeout(self._config.get_main_config().get('screen_blanking_printing')) else: self.set_screenblanking_timeout(self._config.get_main_config().get('screen_blanking')) + def set_dpms_timeout(self): + try: + subprocess.run( + f"xset -display {self.display_number} s off", + shell=True, check=True + ) + subprocess.run( + f"xset -display {self.display_number} dpms 0 {self.blanking_time} 0", + shell=True, check=True + ) + except subprocess.CalledProcessError as e: + self.show_popup_message(f"Error: {e}") + self.set_dpms(False) + return + if self.blanking_time > 0 and self.check_dpms_timeout is None: + self.check_dpms_timeout = GLib.timeout_add_seconds(1, self.check_dpms_state) + return + def set_screenblanking_printing_timeout(self, time): if self.printer.state in ("printing", "paused"): self.set_screenblanking_timeout(time) def set_screenblanking_timeout(self, time): - if not self.wayland: - os.system("xset -display :0 s off") - self.use_dpms = self._config.get_main_config().getboolean("use_dpms", fallback=True) - if time == "off": - logging.debug(f"Screen blanking: {time}") self.blanking_time = 0 - if not self.wayland: - os.system("xset -display :0 dpms 0 0 0") - return + else: + try: + self.blanking_time = abs(int(time)) + except Exception as exc: + logging.exception(exc) + self.use_dpms = self._config.get_main_config().getboolean("use_dpms", fallback=False) + self.use_dpms &= functions.dpms_loaded - self.blanking_time = abs(int(time)) - logging.debug(f"Changing screen blanking to: {self.blanking_time}") - if self.use_dpms and functions.dpms_loaded is True: - if not self.wayland: - os.system("xset -display :0 +dpms") - if functions.get_DPMS_state() == functions.DPMS_State.Fail: - logging.info("DPMS State FAIL") - self.show_popup_message(_("DPMS has failed to load and has been disabled")) - self._config.set("main", "use_dpms", "False") - self._config.save_user_config_options() - else: - logging.debug("Using DPMS") - if not self.wayland: - os.system(f"xset -display :0 dpms 0 {self.blanking_time} 0") - GLib.timeout_add_seconds(1, self.check_dpms_state) - return - # Without dpms just blank the screen - logging.debug("Not using DPMS") - if not self.wayland: - os.system("xset -display :0 dpms 0 0 0") - self.reset_screensaver_timeout() - return + if self.use_dpms: + self.set_dpms_timeout() + else: + self.screensaver.reset_timeout() + logging.debug(f"Blanking timeout: {time} DPMS:{self.use_dpms}") def show_printer_select(self, widget=None): self.base_panel.show_heaters(False) @@ -872,25 +844,25 @@ def _websocket_callback(self, action, data): if re.match('^(?:ok\\s+)?(B|C|T\\d*):', data): return if data.startswith("// action:"): - action = data[10:] - if action.startswith('prompt_begin'): - if self.prompt is not None: - self.prompt.end() - self.prompt = Prompt(self) - if self.prompt is None: - return - self.prompt.decode(action) + self.process_action(data[10:]) + return elif data.startswith("echo: "): self.show_popup_message(data[6:], 1, from_ws=True) + elif data.startswith("[+] "): + self.show_popup_message(data[:], 1, from_ws=True) elif "!! Extrude below minimum temp" in data: - if "temperature" != self._cur_panels[-1]: + if self._cur_panels[-1] != "temperature": self.show_panel("temperature", extra=self.printer.get_stat("toolhead", "extruder")) self.show_popup_message(_("Temperature too low to extrude")) return elif data.startswith("!! "): self.show_popup_message(data[3:], 3, from_ws=True) - elif "unknown" in data.lower() and \ - not ("TESTZ" in data or "MEASURE_AXES_NOISE" in data or "ACCELEROMETER_QUERY" in data): + elif ( + "unknown" in data.lower() + and "TESTZ" not in data + and "MEASURE_AXES_NOISE" not in data + and "ACCELEROMETER_QUERY" not in data + ): self.show_popup_message(data, from_ws=True) elif "SAVE_CONFIG" in data and self.printer.state == "ready": script = {"script": "SAVE_CONFIG"} @@ -902,6 +874,30 @@ def _websocket_callback(self, action, data): ) self.process_update(action, data) + def process_action(self, action): + if action.startswith("prompt"): + if action.startswith("prompt_begin"): + if self.prompt is not None: + self.prompt.end() + self.prompt = Prompt(self) + if self.prompt is None: + return + self.prompt.decode(action) + if action.startswith("ks_show"): + self.parse_ks_action(action[8:].strip()) + + def parse_ks_action(self, action): + action = action.split(" ", 1) + if len(action) == 2: + panel, params = action + key, value = params.split("=", 1) + key = key.strip() + value = value.strip() + params = {key: ast.literal_eval(value)} + self.show_panel(panel, **params) + else: + self.show_panel(*action) + def process_update(self, *args): self.base_panel.process_update(*args) if self._cur_panels and hasattr(self.panels[self._cur_panels[-1]], "process_update"): @@ -1151,26 +1147,37 @@ def retry_init_tempstore(self): self.remove_tempstore_timeout() return self.init_tempstore() - def show_keyboard(self, entry=None, event=None): - if self.keyboard is not None: - return - - box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - box.set_size_request(self.gtk.content_width, self.gtk.keyboard_height) - box.set_vexpand(False) - - if self._config.get_main_config().getboolean("use-matchbox-keyboard", False): - return self._show_matchbox_keyboard(box) + def show_keyboard(self, entry=None, event=None, box=None, close_cb=None): if entry is None: logging.debug("Error: no entry provided for keyboard") return - box.get_style_context().add_class("keyboard_box") - box.add(Keyboard(self, self.remove_keyboard, entry=entry)) - self.keyboard = {"box": box} - self.base_panel.content.pack_end(box, False, False, 0) - self.base_panel.content.show_all() + if box is None: + box = self.base_panel.content + if close_cb is None: + close_cb = self.remove_keyboard + if self.keyboard is not None: + self.remove_keyboard(box=box) + entry.grab_focus() + kbd_grid = Gtk.Grid() + kbd_grid.set_size_request(self.gtk.content_width, self.gtk.keyboard_height) + kbd_grid.set_vexpand(False) - def _show_matchbox_keyboard(self, box): + if self._config.get_main_config().getboolean("use-matchbox-keyboard", False): + return self._show_matchbox_keyboard(kbd_grid) + purpose = entry.get_input_purpose() + kbd_width = 1 + if not self.vertical_mode and purpose in (Gtk.InputPurpose.DIGITS, Gtk.InputPurpose.NUMBER): + kbd_grid.set_column_homogeneous(True) + kbd_width = 2 if purpose == Gtk.InputPurpose.DIGITS else 3 + kbd_grid.attach(Gtk.Box(), 0, 0, 1, 1) + kbd = Keyboard(self, close_cb, entry=entry, box=box) + kbd_grid.attach(kbd, 1, 0, kbd_width, 1) + kbd_grid.attach(Gtk.Box(), kbd_width + 1, 0, 1, 1) + self.keyboard = {"box": kbd_grid} + box.pack_end(kbd_grid, False, False, 0) + box.show_all() + + def _show_matchbox_keyboard(self, kbd_grid): env = os.environ.copy() usrkbd = os.path.expanduser("~/.matchbox/keyboard.xml") if os.path.isfile(usrkbd): @@ -1184,27 +1191,32 @@ def _show_matchbox_keyboard(self, box): logging.debug(f"PID {p.pid}") keyboard = Gtk.Socket() - box.get_style_context().add_class("keyboard_matchbox") - box.pack_start(keyboard, True, True, 0) - self.base_panel.content.pack_end(box, False, False, 0) + kbd_grid.get_style_context().add_class("keyboard_matchbox") + kbd_grid.attach(keyboard, 0, 0, 1, 1) + self.base_panel.content.pack_end(kbd_grid, False, False, 0) self.show_all() keyboard.add_id(xid) self.keyboard = { - "box": box, + "box": kbd_grid, "process": p, "socket": keyboard } return - def remove_keyboard(self, widget=None, event=None): + def remove_keyboard(self, entry=None, event=None, box=None): if self.keyboard is None: return + if box is None: + box = self.base_panel.content if 'process' in self.keyboard: os.kill(self.keyboard['process'].pid, SIGTERM) - self.base_panel.content.remove(self.keyboard['box']) + box.remove(self.keyboard['box']) self.keyboard = None + if entry: + entry.set_sensitive(False) # Move the focus + entry.set_sensitive(True) def _key_press_event(self, widget, event): keyval_name = Gdk.keyval_name(event.keyval) diff --git a/scripts/KlipperScreen-requirements.txt b/scripts/KlipperScreen-requirements.txt index 4246c50db..aa01b47bb 100644 --- a/scripts/KlipperScreen-requirements.txt +++ b/scripts/KlipperScreen-requirements.txt @@ -9,6 +9,10 @@ python-mpv==1.0.7;python_version>="3.10" backports.zoneinfo;python_version<"3.9" -PyGObject==3.48.1;python_version>="3.8" -pycairo==1.26.1;python_version>="3.8" +PyGObject==3.48.2;python_version=="3.8" +pycairo==1.26.1;python_version=="3.8" + +PyGObject==3.50.0;python_version>"3.8" +pycairo==1.27.0;python_version>"3.8" websocket-client==1.8.0;python_version>="3.8" +psutil==6.0.0;python_version>="3.8" diff --git a/scripts/KlipperScreen.service b/scripts/KlipperScreen.service index 234c1f2c4..bf209488c 100644 --- a/scripts/KlipperScreen.service +++ b/scripts/KlipperScreen.service @@ -9,6 +9,7 @@ ConditionPathExists=/dev/tty0 # D-Bus is necessary for contacting logind, which is required. Wants=dbus.socket systemd-logind.service After=dbus.socket systemd-logind.service +After=moonraker.service [Service] Type=simple diff --git a/scripts/dev-requirements.txt b/scripts/dev-requirements.txt index b1a354511..a63e5157f 100644 --- a/scripts/dev-requirements.txt +++ b/scripts/dev-requirements.txt @@ -1,2 +1,2 @@ pycodestyle -pygobject-stubs +pygobject-stubs --config-settings=config=Gtk3,Gdk3 diff --git a/scripts/system-dependencies.json b/scripts/system-dependencies.json index 0fb297cc5..9c683af06 100644 --- a/scripts/system-dependencies.json +++ b/scripts/system-dependencies.json @@ -12,7 +12,8 @@ "librsvg2-common", "libopenjp2-7", "libdbus-glib-1-dev", - "autoconf" + "autoconf", + "qrencode" ], "arch": [ "cairo", diff --git a/styles/base.css b/styles/base.css index ac3a66810..c03d2ec78 100644 --- a/styles/base.css +++ b/styles/base.css @@ -32,6 +32,10 @@ window { -gtk-icon-shadow: none; } +treeview.view{ + padding-right: 0.25em; +} + junction { background-color: @bg; } @@ -40,8 +44,7 @@ switch slider { border: 0; } -switch, -treeview.view check { +switch { margin: 0.75em; min-width: 5em; min-height: 2.5em; @@ -50,23 +53,14 @@ treeview.view check { } treeview.view check { - background-color: rgb(32,41,47); - -gtk-icon-source: -gtk-icontheme("switch-off-symbolic"); - background-repeat: no-repeat; - background-position: left center; - background-size : 3em 3em; - background-image: image(url("./styles/circle.svg")); - -gtk-icon-transform: translateX(1.5em); -} -treeview.view check:checked { - background-color : rgb(53,132,228); - background-position: right center; - -gtk-icon-source: -gtk-icontheme("switch-on-symbolic"); - -gtk-icon-transform: translateX(-1.5em); + min-height: 2em; + min-width: 2em; + background-image: none; } -expander label { - padding : 1em; +treeview.view check:checked { + background-image: none; + -gtk-icon-source: url("./styles/complete.svg"); } button { @@ -79,6 +73,7 @@ button { -gtk-icon-shadow: none; } +.active image, button:active, .button_active, button.active { @@ -172,6 +167,13 @@ entry { background-color: @active; border: .2em solid @bg; padding: .2em; + margin-right: .5em; +} + +entry image { + margin: 0 .1em; + border-radius: 1em; + padding: .5em; } label { @@ -561,6 +563,24 @@ popover button { margin: 0; } +.lock +.lock button +.lock button:hover, +.lock button:focus, +.lock button:active { + border: 0; + margin: 0; + background-color: Transparent; +} + +.lockscreen_entry { + margin: 2em; +} + +.lockscreen_button { + padding: 2em; +} + .screensaver, .screensaver button, .screensaver button:hover, @@ -642,3 +662,7 @@ flowbox button { margin: 0.1em; padding: .5em; } + +keyboard_box { + padding: 0 20em; +} \ No newline at end of file diff --git a/styles/circle.svg b/styles/circle.svg deleted file mode 100644 index 14c0d218b..000000000 --- a/styles/circle.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - diff --git a/styles/colorized/images/battery-0.svg b/styles/colorized/images/battery-0.svg new file mode 100644 index 000000000..67cdd630e --- /dev/null +++ b/styles/colorized/images/battery-0.svg @@ -0,0 +1,68 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/colorized/images/battery-100.svg b/styles/colorized/images/battery-100.svg new file mode 100644 index 000000000..82183d9d0 --- /dev/null +++ b/styles/colorized/images/battery-100.svg @@ -0,0 +1,75 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + + Created with Sketch. + + diff --git a/styles/colorized/images/battery-25.svg b/styles/colorized/images/battery-25.svg new file mode 100644 index 000000000..50e58dc64 --- /dev/null +++ b/styles/colorized/images/battery-25.svg @@ -0,0 +1,86 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + + folder + + Created with Sketch. + + diff --git a/styles/colorized/images/battery-50.svg b/styles/colorized/images/battery-50.svg new file mode 100644 index 000000000..c04f44526 --- /dev/null +++ b/styles/colorized/images/battery-50.svg @@ -0,0 +1,81 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + folder + + Created with Sketch. + + diff --git a/styles/colorized/images/battery-75.svg b/styles/colorized/images/battery-75.svg new file mode 100644 index 000000000..6eb40659f --- /dev/null +++ b/styles/colorized/images/battery-75.svg @@ -0,0 +1,86 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + + folder + + Created with Sketch. + + diff --git a/styles/colorized/images/battery-charging.svg b/styles/colorized/images/battery-charging.svg new file mode 100644 index 000000000..960135798 --- /dev/null +++ b/styles/colorized/images/battery-charging.svg @@ -0,0 +1,83 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + + folder + Created with Sketch. + + + diff --git a/styles/colorized/images/battery-unknown.svg b/styles/colorized/images/battery-unknown.svg new file mode 100644 index 000000000..b9f22242b --- /dev/null +++ b/styles/colorized/images/battery-unknown.svg @@ -0,0 +1,84 @@ + + + + + + image/svg+xml + + folder + + + + + + + + + + folder + Created with Sketch. + + + diff --git a/styles/colorized/images/lock.svg b/styles/colorized/images/lock.svg new file mode 100644 index 000000000..2fa9a3db0 --- /dev/null +++ b/styles/colorized/images/lock.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + diff --git a/styles/colorized/images/qrcode.svg b/styles/colorized/images/qrcode.svg new file mode 100644 index 000000000..bb8f2c4e9 --- /dev/null +++ b/styles/colorized/images/qrcode.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/styles/colorized/style.css b/styles/colorized/style.css index 76ed43aa8..15b7b5550 100644 --- a/styles/colorized/style.css +++ b/styles/colorized/style.css @@ -32,6 +32,7 @@ button { background-color: @solarized-base03; } +.active image, button:active { background-color: @solarized-orange; } @@ -109,16 +110,25 @@ popover button { border-color: @solarized-base03; } -treeview.view check, switch { background-color: @solarized-base02; } - -treeview.view check:checked, switch:checked { background-color: @solarized-green; } +treeview.view check { + background-image: none; + background-color: @solarized-base02; + border-radius: .51em; +} + +treeview.view check:checked { + background-image: none; + background-color: @solarized-base02; + -gtk-icon-source: url("./styles/colorized/images/complete.svg"); +} + entry { background-color: @solarized-base02; border-color: @solarized-base03; diff --git a/styles/complete.svg b/styles/complete.svg new file mode 100644 index 000000000..719a4539e --- /dev/null +++ b/styles/complete.svg @@ -0,0 +1,38 @@ + + + + + + diff --git a/styles/material-dark/images/battery-0.svg b/styles/material-dark/images/battery-0.svg new file mode 100644 index 000000000..a6f93c5f4 --- /dev/null +++ b/styles/material-dark/images/battery-0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-dark/images/battery-100.svg b/styles/material-dark/images/battery-100.svg new file mode 100644 index 000000000..e7adbc022 --- /dev/null +++ b/styles/material-dark/images/battery-100.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-dark/images/battery-25.svg b/styles/material-dark/images/battery-25.svg new file mode 100644 index 000000000..f1d3ebbf3 --- /dev/null +++ b/styles/material-dark/images/battery-25.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-dark/images/battery-50.svg b/styles/material-dark/images/battery-50.svg new file mode 100644 index 000000000..51c18769b --- /dev/null +++ b/styles/material-dark/images/battery-50.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-dark/images/battery-75.svg b/styles/material-dark/images/battery-75.svg new file mode 100644 index 000000000..3caa09891 --- /dev/null +++ b/styles/material-dark/images/battery-75.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-dark/images/battery-charging.svg b/styles/material-dark/images/battery-charging.svg new file mode 100644 index 000000000..4115f8aa3 --- /dev/null +++ b/styles/material-dark/images/battery-charging.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-dark/images/battery-unknown.svg b/styles/material-dark/images/battery-unknown.svg new file mode 100644 index 000000000..1c517badc --- /dev/null +++ b/styles/material-dark/images/battery-unknown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-dark/images/lock.svg b/styles/material-dark/images/lock.svg new file mode 100644 index 000000000..1d032eb9d --- /dev/null +++ b/styles/material-dark/images/lock.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/styles/material-dark/images/qrcode.svg b/styles/material-dark/images/qrcode.svg new file mode 100644 index 000000000..bb8f2c4e9 --- /dev/null +++ b/styles/material-dark/images/qrcode.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/styles/material-dark/style.css b/styles/material-dark/style.css index 728deb4b2..581786905 100644 --- a/styles/material-dark/style.css +++ b/styles/material-dark/style.css @@ -58,6 +58,7 @@ button.color4 { border-radius: 1em; } +.active image, button.color1:active, button.color2:active, button.color3:active, @@ -103,6 +104,10 @@ switch:checked { background-color: @echo; } +treeview.view check:checked { + -gtk-icon-source: url("./styles/material-dark/images/complete.svg"); +} + entry { background-color: @active-dark; border-color: @active-dark; diff --git a/styles/material-darker/images/battery-0.svg b/styles/material-darker/images/battery-0.svg new file mode 100644 index 000000000..a6f93c5f4 --- /dev/null +++ b/styles/material-darker/images/battery-0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-darker/images/battery-100.svg b/styles/material-darker/images/battery-100.svg new file mode 100644 index 000000000..e7adbc022 --- /dev/null +++ b/styles/material-darker/images/battery-100.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-darker/images/battery-25.svg b/styles/material-darker/images/battery-25.svg new file mode 100644 index 000000000..f1d3ebbf3 --- /dev/null +++ b/styles/material-darker/images/battery-25.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-darker/images/battery-50.svg b/styles/material-darker/images/battery-50.svg new file mode 100644 index 000000000..51c18769b --- /dev/null +++ b/styles/material-darker/images/battery-50.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-darker/images/battery-75.svg b/styles/material-darker/images/battery-75.svg new file mode 100644 index 000000000..3caa09891 --- /dev/null +++ b/styles/material-darker/images/battery-75.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-darker/images/battery-charging.svg b/styles/material-darker/images/battery-charging.svg new file mode 100644 index 000000000..4115f8aa3 --- /dev/null +++ b/styles/material-darker/images/battery-charging.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-darker/images/battery-unknown.svg b/styles/material-darker/images/battery-unknown.svg new file mode 100644 index 000000000..1c517badc --- /dev/null +++ b/styles/material-darker/images/battery-unknown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/styles/material-darker/images/lock.svg b/styles/material-darker/images/lock.svg new file mode 100644 index 000000000..32d3ef189 --- /dev/null +++ b/styles/material-darker/images/lock.svg @@ -0,0 +1,41 @@ + + + + + + diff --git a/styles/material-darker/images/qrcode.svg b/styles/material-darker/images/qrcode.svg new file mode 100644 index 000000000..bb8f2c4e9 --- /dev/null +++ b/styles/material-darker/images/qrcode.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/styles/material-darker/style.css b/styles/material-darker/style.css index ba724e249..a59d55623 100644 --- a/styles/material-darker/style.css +++ b/styles/material-darker/style.css @@ -66,6 +66,7 @@ button.invalid:active, background-color: #424242; } +.active image, button.update { color: #2196f3; background-color: #121212; @@ -101,6 +102,10 @@ switch:checked { background-color: #2f5631; } +treeview.view check:checked { + -gtk-icon-source: url("./styles/material-darker/images/complete.svg"); +} + label { color: #e2e2e2; } diff --git a/styles/material-light/images/battery-0.svg b/styles/material-light/images/battery-0.svg new file mode 100644 index 000000000..a1083d9a1 --- /dev/null +++ b/styles/material-light/images/battery-0.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/styles/material-light/images/battery-100.svg b/styles/material-light/images/battery-100.svg new file mode 100644 index 000000000..e95b54092 --- /dev/null +++ b/styles/material-light/images/battery-100.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/styles/material-light/images/battery-25.svg b/styles/material-light/images/battery-25.svg new file mode 100644 index 000000000..95d029f74 --- /dev/null +++ b/styles/material-light/images/battery-25.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/styles/material-light/images/battery-50.svg b/styles/material-light/images/battery-50.svg new file mode 100644 index 000000000..2bf25cbbd --- /dev/null +++ b/styles/material-light/images/battery-50.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/styles/material-light/images/battery-75.svg b/styles/material-light/images/battery-75.svg new file mode 100644 index 000000000..88c8aa52e --- /dev/null +++ b/styles/material-light/images/battery-75.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/styles/material-light/images/battery-charging.svg b/styles/material-light/images/battery-charging.svg new file mode 100644 index 000000000..d296bd13d --- /dev/null +++ b/styles/material-light/images/battery-charging.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/styles/material-light/images/battery-unknown.svg b/styles/material-light/images/battery-unknown.svg new file mode 100644 index 000000000..47f971292 --- /dev/null +++ b/styles/material-light/images/battery-unknown.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/styles/material-light/images/lock.svg b/styles/material-light/images/lock.svg new file mode 100644 index 000000000..0ac185e2e --- /dev/null +++ b/styles/material-light/images/lock.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/styles/material-light/images/qrcode.svg b/styles/material-light/images/qrcode.svg new file mode 100644 index 000000000..bb8f2c4e9 --- /dev/null +++ b/styles/material-light/images/qrcode.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/styles/material-light/style.css b/styles/material-light/style.css index 8ecef12e2..daad1a7ea 100644 --- a/styles/material-light/style.css +++ b/styles/material-light/style.css @@ -31,6 +31,7 @@ button label{ color: @text; } +.active image, button:active { background-color: @active; } @@ -122,6 +123,10 @@ switch:checked { background-color: @color3; } +treeview.view check:checked { + -gtk-icon-source: url("./styles/material-light/images/complete.svg"); +} + treeview.view check, switch slider, scale trough, diff --git a/styles/z-bolt/images/battery-0.svg b/styles/z-bolt/images/battery-0.svg new file mode 100644 index 000000000..3d584919b --- /dev/null +++ b/styles/z-bolt/images/battery-0.svg @@ -0,0 +1,68 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/battery-100.svg b/styles/z-bolt/images/battery-100.svg new file mode 100644 index 000000000..0bb21e09f --- /dev/null +++ b/styles/z-bolt/images/battery-100.svg @@ -0,0 +1,68 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/battery-25.svg b/styles/z-bolt/images/battery-25.svg new file mode 100644 index 000000000..aa8a9721b --- /dev/null +++ b/styles/z-bolt/images/battery-25.svg @@ -0,0 +1,68 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/battery-50.svg b/styles/z-bolt/images/battery-50.svg new file mode 100644 index 000000000..ce2e1cfaf --- /dev/null +++ b/styles/z-bolt/images/battery-50.svg @@ -0,0 +1,68 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/battery-75.svg b/styles/z-bolt/images/battery-75.svg new file mode 100644 index 000000000..0941d7136 --- /dev/null +++ b/styles/z-bolt/images/battery-75.svg @@ -0,0 +1,68 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + diff --git a/styles/z-bolt/images/battery-charging.svg b/styles/z-bolt/images/battery-charging.svg new file mode 100644 index 000000000..518e89b00 --- /dev/null +++ b/styles/z-bolt/images/battery-charging.svg @@ -0,0 +1,72 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + diff --git a/styles/z-bolt/images/battery-unknown.svg b/styles/z-bolt/images/battery-unknown.svg new file mode 100644 index 000000000..0c6180868 --- /dev/null +++ b/styles/z-bolt/images/battery-unknown.svg @@ -0,0 +1,73 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + diff --git a/styles/z-bolt/images/complete.svg b/styles/z-bolt/images/complete.svg index 6edacfc41..21fbd1d16 100644 --- a/styles/z-bolt/images/complete.svg +++ b/styles/z-bolt/images/complete.svg @@ -1,19 +1,19 @@ + inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> @@ -38,22 +38,24 @@ inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1600" - inkscape:window-height="837" + inkscape:window-height="829" id="namedview12" showgrid="false" inkscape:pagecheckerboard="false" inkscape:zoom="6.05" - inkscape:cx="29.562225" - inkscape:cy="34.810069" - inkscape:window-x="-8" - inkscape:window-y="-8" + inkscape:cx="38.429752" + inkscape:cy="24.545455" + inkscape:window-x="0" + inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="svg10" + inkscape:current-layer="g835" inkscape:snap-bbox="true" inkscape:snap-bbox-edge-midpoints="false" inkscape:document-rotation="0" inkscape:snap-bbox-midpoints="true" - inkscape:snap-others="false" /> + inkscape:snap-others="false" + inkscape:showpageshadow="0" + inkscape:deskcolor="#d1d1d1" /> folder @@ -64,12 +66,8 @@ transform="matrix(0.88461538,0,0,0.88461538,3.6776896,3.6923078)" style="stroke-width:1.13043"> - diff --git a/styles/z-bolt/images/lock.svg b/styles/z-bolt/images/lock.svg new file mode 100644 index 000000000..4668e7af8 --- /dev/null +++ b/styles/z-bolt/images/lock.svg @@ -0,0 +1,97 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + diff --git a/styles/z-bolt/images/qrcode.svg b/styles/z-bolt/images/qrcode.svg new file mode 100644 index 000000000..bb8f2c4e9 --- /dev/null +++ b/styles/z-bolt/images/qrcode.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/styles/z-bolt/images/z-closer.svg b/styles/z-bolt/images/z-closer.svg index 38cd082d7..bac175ab0 100644 --- a/styles/z-bolt/images/z-closer.svg +++ b/styles/z-bolt/images/z-closer.svg @@ -1,87 +1 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - + \ No newline at end of file diff --git a/styles/z-bolt/images/z-closer2.svg b/styles/z-bolt/images/z-closer2.svg new file mode 100644 index 000000000..38cd082d7 --- /dev/null +++ b/styles/z-bolt/images/z-closer2.svg @@ -0,0 +1,87 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + diff --git a/styles/z-bolt/images/z-farther.svg b/styles/z-bolt/images/z-farther.svg index 63cdb7a44..31320362b 100644 --- a/styles/z-bolt/images/z-farther.svg +++ b/styles/z-bolt/images/z-farther.svg @@ -1,91 +1 @@ - - - - - - image/svg+xml - - folder - - - - - - - folder - Created with Sketch. - - - - - - - - - + \ No newline at end of file diff --git a/styles/z-bolt/images/z-farther2.svg b/styles/z-bolt/images/z-farther2.svg new file mode 100644 index 000000000..63cdb7a44 --- /dev/null +++ b/styles/z-bolt/images/z-farther2.svg @@ -0,0 +1,91 @@ + + + + + + image/svg+xml + + folder + + + + + + + folder + Created with Sketch. + + + + + + + + + diff --git a/styles/z-bolt/style.css b/styles/z-bolt/style.css index 1917088d1..73867f6ed 100644 --- a/styles/z-bolt/style.css +++ b/styles/z-bolt/style.css @@ -58,6 +58,7 @@ button.active { background-color: @active; } +.active image, button.update { background: @color3; border-color: @color3; @@ -76,11 +77,16 @@ treeview.view check, switch { background-color: @active; } + treeview.view check:checked, switch:checked { background-color: @switch-scale-bg; } +treeview.view check:checked { + -gtk-icon-source: url("./styles/z-bolt/images/complete.svg"); +} + entry { background-color: @active; border-color: @bg;