diff --git a/src/lcd/language/language_an.h b/src/lcd/language/language_an.h
new file mode 100644
index 0000000..37c90c3
--- /dev/null
+++ b/src/lcd/language/language_an.h
@@ -0,0 +1,235 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Aragonese
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_1
+#define NOT_EXTENDED_ISO10646_1_5X7
+
+namespace Language_an {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 1;
+ LSTR LANGUAGE = _UxGT("Aragonese");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" parada.");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Tarcheta mesa");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Tarcheta sacada");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
+ LSTR MSG_MAIN = _UxGT("Menu prencipal");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Inicio automatico");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Amortar motors");
+ LSTR MSG_HOMING = _UxGT("Orichen");
+ LSTR MSG_AUTO_HOME = _UxGT("Levar a l'orichen");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Orichen X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Orichen Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Orichen Z");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Orichen XYZ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Encetar (pretar)");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Vinient punto");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Nivelacion feita!");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Achustar desfases");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfase aplicau");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Precalentar ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Precalentar ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Boquilla ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Tot");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Base");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Precalentar ") PREHEAT_1_LABEL _UxGT(" Conf");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Precalentar $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Precalentar $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Precal. $ Boquilla");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Precal. $ Boquilla ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Precalentar $ Tot");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Precalentar $ Base");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Precalentar $ Conf");
+ #endif
+ LSTR MSG_COOLDOWN = _UxGT("Enfriar");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Enchegar Fuent");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Amortar Fuent");
+ LSTR MSG_EXTRUDE = _UxGT("Extruir");
+ LSTR MSG_RETRACT = _UxGT("Retraer");
+ LSTR MSG_MOVE_AXIS = _UxGT("Mover Eixes");
+ LSTR MSG_BED_LEVELING = _UxGT("Nivelar base");
+ LSTR MSG_LEVEL_BED = _UxGT("Nivelar base");
+ LSTR MSG_MOVE_X = _UxGT("Mover X");
+ LSTR MSG_MOVE_Y = _UxGT("Mover Y");
+ LSTR MSG_MOVE_Z = _UxGT("Mover Z");
+ LSTR MSG_MOVE_N = _UxGT("Mover @");
+ LSTR MSG_MOVE_E = _UxGT("Extrusor");
+ LSTR MSG_MOVE_EN = _UxGT("Extrusor *");
+ LSTR MSG_MOVE_N_MM = _UxGT("Mover $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Mover 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Mover 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Mover 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Mover 100mm");
+ LSTR MSG_SPEED = _UxGT("Velocidat");
+ LSTR MSG_BED_Z = _UxGT("Base Z");
+ LSTR MSG_NOZZLE = _UxGT("Boquilla");
+ LSTR MSG_NOZZLE_N = _UxGT("Boquilla ~");
+ LSTR MSG_BED = _UxGT("Base");
+ LSTR MSG_FAN_SPEED = _UxGT("Ixoriador");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Ixoriador ~");
+ LSTR MSG_FLOW = _UxGT("Fluxo");
+ LSTR MSG_FLOW_N = _UxGT("Fluxo ~");
+ LSTR MSG_CONTROL = _UxGT("Control");
+ LSTR MSG_AUTOTEMP = _UxGT("Temperatura Auto.");
+ LSTR MSG_SELECT = _UxGT("Trigar");
+ LSTR MSG_SELECT_E = _UxGT("Trigar *");
+ LSTR MSG_ACC = _UxGT("Aceleracion");
+ LSTR MSG_VTRAV_MIN = _UxGT("Vel. viache min");
+ LSTR MSG_ACCELERATION = _UxGT("Accel");
+ LSTR MSG_AMAX_A = _UxGT("Acel. max ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Acel. max ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Acel. max ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Acel. max @");
+ LSTR MSG_AMAX_E = _UxGT("Acel. max E");
+ LSTR MSG_AMAX_EN = _UxGT("Acel. max *");
+ LSTR MSG_A_RETRACT = _UxGT("Acel. retrac.");
+ LSTR MSG_A_TRAVEL = _UxGT("Acel. Viaje");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Trangos/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" trangos/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" trangos/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" trangos/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ trangos/mm");
+ LSTR MSG_E_STEPS = _UxGT("E trangos/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* trangos/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperatura");
+ LSTR MSG_MOTION = _UxGT("Movimiento");
+ LSTR MSG_FILAMENT = _UxGT("Filamento");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Fil. Dia.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *");
+ LSTR MSG_CONTRAST = _UxGT("Contraste");
+ LSTR MSG_STORE_EEPROM = _UxGT("Alzar memoria");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Cargar memoria");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Restaurar memoria");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Tornar a cargar");
+ LSTR MSG_INFO_SCREEN = _UxGT("Informacion");
+ LSTR MSG_PREPARE = _UxGT("Preparar");
+ LSTR MSG_TUNE = _UxGT("Achustar");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pausar impresion");
+ LSTR MSG_RESUME_PRINT = _UxGT("Contin. impresion");
+ LSTR MSG_STOP_PRINT = _UxGT("Detener Impresion");
+ LSTR MSG_MEDIA_MENU = _UxGT("Menu de SD");
+ LSTR MSG_NO_MEDIA = _UxGT("No i hai tarcheta");
+ LSTR MSG_DWELL = _UxGT("Reposo...");
+ LSTR MSG_USERWAIT = _UxGT("Aguardand ordines");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Impres. cancelada");
+ LSTR MSG_NO_MOVE = _UxGT("Sin movimiento");
+ LSTR MSG_KILLED = _UxGT("Aturada d'emerch.");
+ LSTR MSG_STOPPED = _UxGT("Aturada.");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Retraer mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Retraer mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Retraer F");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Devantar mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("DesRet mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Swap DesRet mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("DesRet F");
+ LSTR MSG_AUTORETRACT = _UxGT("Retraccion auto.");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Cambear filamento");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Cambear filamento *");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Encetan. tarcheta");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Cambiar tarcheta");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Sonda Z fuera");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Desfase Z");
+ LSTR MSG_BABYSTEP_X = _UxGT("Micropaso X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Micropaso Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Micropaso Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Micropaso @");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Cancelado - Endstop");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Error: en calentar");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Error: temperatura");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("Error de temperatura");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Error: Temp Max");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Error: Temp Min");
+ LSTR MSG_HALTED = _UxGT("IMPRESORA ATURADA");
+ LSTR MSG_PLEASE_RESET = _UxGT("Per favor reinic.");
+ LSTR MSG_HEATING = _UxGT("Calentando...");
+ LSTR MSG_BED_HEATING = _UxGT("Calentando base...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Calibracion Delta");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro");
+
+ LSTR MSG_INFO_MENU = _UxGT("Inf. Impresora");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Inf. Impresora");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Estadisticas Imp.");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Inf. Controlador");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistors");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extrusors");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Baudios");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protocolo");
+ LSTR MSG_CASE_LIGHT = _UxGT("Luz");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Conteo de impresion");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Tiempo total d'imp.");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Impresion mas larga");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Total d'extrusion");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Impresions");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Total");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Mas larga");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extrusion");
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Temperatura menima");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Temperatura maxima");
+ LSTR MSG_INFO_PSU = _UxGT("Fuente de aliment");
+
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Fuerza d'o driver");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Escri. DAC EEPROM");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Resumir imp.");
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+
+ #if LCD_HEIGHT >= 4
+ // Up to 3 lines allowed
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Aguardand iniciar", "d'o filamento", "cambear"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Meta o filamento", "y prete lo boton", "pa continar..."));
+ #else // LCD_HEIGHT < 4
+ // Up to 2 lines allowed
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Aguardand iniciar", "d'o fil. cambear"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("Meta o filamento", "y prete lo boton"));
+ #endif // LCD_HEIGHT < 4
+
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Aguardando a", "expulsar filament"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Aguardando a", "cargar filamento"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Aguardando impre.", "pa continar"));
+}
diff --git a/src/lcd/language/language_bg.h b/src/lcd/language/language_bg.h
new file mode 100644
index 0000000..038df3e
--- /dev/null
+++ b/src/lcd/language/language_bg.h
@@ -0,0 +1,158 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Bulgarian
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_5
+
+namespace Language_bg {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Bulgarian");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Готов.");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Картата е поставена");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Картата е извадена");
+ LSTR MSG_MAIN = _UxGT("Меню");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Автостарт");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Изкл. двигатели");
+ LSTR MSG_AUTO_HOME = _UxGT("Паркиране");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Задай Начало");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Подгряване ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Подгряване ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Подгряване ") PREHEAT_1_LABEL _UxGT(" Дюза");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Подгряване ") PREHEAT_1_LABEL _UxGT(" Дюза ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Подгр. ") PREHEAT_1_LABEL _UxGT(" Всички");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Подгр. ") PREHEAT_1_LABEL _UxGT(" Легло");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Настройки ") PREHEAT_1_LABEL;
+
+ LSTR MSG_PREHEAT_M = _UxGT("Подгряване $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Подгряване $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Подгряване $ Дюза");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Подгряване $ Дюза ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Подгр. $ Всички");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Подгр. $ Легло");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Настройки $");
+ #endif
+ LSTR MSG_COOLDOWN = _UxGT("Охлаждане");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Вкл. захранване");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Изкл. захранване");
+ LSTR MSG_EXTRUDE = _UxGT("Екструзия");
+ LSTR MSG_RETRACT = _UxGT("Откат");
+ LSTR MSG_MOVE_AXIS = _UxGT("Движение по ос");
+ LSTR MSG_BED_LEVELING = _UxGT("Нивелиране");
+ LSTR MSG_LEVEL_BED = _UxGT("Нивелиране");
+ LSTR MSG_MOVE_X = _UxGT("Движение по X");
+ LSTR MSG_MOVE_Y = _UxGT("Движение по Y");
+ LSTR MSG_MOVE_Z = _UxGT("Движение по Z");
+ LSTR MSG_MOVE_N = _UxGT("Движение по @");
+ LSTR MSG_MOVE_E = _UxGT("Екструдер");
+ LSTR MSG_MOVE_EN = _UxGT("Екструдер *");
+ LSTR MSG_MOVE_N_MM = _UxGT("Премести с $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Премести с 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Премести с 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Премести с 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Премести с 100mm");
+ LSTR MSG_SPEED = _UxGT("Скорост");
+ LSTR MSG_BED_Z = _UxGT("Bed Z");
+ LSTR MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" Дюза");
+ LSTR MSG_NOZZLE_N = " " LCD_STR_THERMOMETER _UxGT(" Дюза ~");
+ LSTR MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" Легло");
+ LSTR MSG_FAN_SPEED = _UxGT("Вентилатор");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Вентилатор ~");
+ LSTR MSG_FLOW = _UxGT("Поток");
+ LSTR MSG_FLOW_N = _UxGT("Поток ~");
+ LSTR MSG_CONTROL = _UxGT("Управление");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Минимум");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Максимум");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Фактор");
+ LSTR MSG_AUTOTEMP = _UxGT("Авто-темп.");
+ LSTR MSG_LCD_ON = _UxGT("Вкл.");
+ LSTR MSG_LCD_OFF = _UxGT("Изкл.");
+ LSTR MSG_A_RETRACT = _UxGT("A-откат");
+ LSTR MSG_A_TRAVEL = _UxGT("A-travel");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Стъпки/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" стъпки/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" стъпки/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" стъпки/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ стъпки/mm");
+ LSTR MSG_E_STEPS = _UxGT("E стъпки/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* стъпки/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Температура");
+ LSTR MSG_MOTION = _UxGT("Движение");
+ LSTR MSG_FILAMENT = _UxGT("Нишка");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Диам. нишка");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Диам. нишка *");
+ LSTR MSG_CONTRAST = _UxGT("LCD контраст");
+ LSTR MSG_STORE_EEPROM = _UxGT("Запази в EPROM");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Зареди от EPROM");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Фабрични настройки");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Обнови");
+ LSTR MSG_INFO_SCREEN = _UxGT("Преглед");
+ LSTR MSG_PREPARE = _UxGT("Действия");
+ LSTR MSG_TUNE = _UxGT("Настройка");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Пауза");
+ LSTR MSG_RESUME_PRINT = _UxGT("Възобнови печата");
+ LSTR MSG_STOP_PRINT = _UxGT("Спри печата");
+ LSTR MSG_MEDIA_MENU = _UxGT("Меню карта");
+ LSTR MSG_NO_MEDIA = _UxGT("Няма карта");
+ LSTR MSG_DWELL = _UxGT("Почивка...");
+ LSTR MSG_USERWAIT = _UxGT("Изчакване");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Печатът е прекъснат");
+ LSTR MSG_NO_MOVE = _UxGT("Няма движение");
+ LSTR MSG_KILLED = _UxGT("УБИТО.");
+ LSTR MSG_STOPPED = _UxGT("СПРЯНО.");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Откат mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Смяна Откат mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Откат V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Скок mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Възврат mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Смяна Възврат mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Възврат V");
+ LSTR MSG_AUTORETRACT = _UxGT("Автоoткат");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Смяна нишка");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Смяна нишка *");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Иниц. SD-Карта");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Смяна SD-Карта");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z-сондата е извадена");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Z Отстояние");
+ LSTR MSG_BABYSTEP_X = _UxGT("Министъпка X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Министъпка Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Министъпка Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Министъпка @");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Стоп Кр.Изключватели");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Делта Калибровка");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Калибровка X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Калибровка Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Калибровка Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калибровка Център");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Неправилен принтер");
+}
diff --git a/src/lcd/language/language_ca.h b/src/lcd/language/language_ca.h
new file mode 100644
index 0000000..54b968e
--- /dev/null
+++ b/src/lcd/language/language_ca.h
@@ -0,0 +1,229 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Catalan
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+namespace Language_ca {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Catalan");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" preparada.");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Targeta detectada.");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Targeta extreta.");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops");
+ LSTR MSG_MAIN = _UxGT("Menú principal");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Inici automatic");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Desactiva motors");
+ LSTR MSG_DEBUG_MENU = _UxGT("Menu de depuracio");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test barra progres");
+ LSTR MSG_HOMING = _UxGT("Origen");
+ LSTR MSG_AUTO_HOME = _UxGT("Ves a l'origen");
+ LSTR MSG_AUTO_HOME_X = _UxGT("X a origen");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Y a origen");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Z a origen");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Origen XYZ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Premeu per iniciar");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Següent punt");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Anivellament fet!");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Ajusta decalatge");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Decalatge aplicat");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Preescalfa ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Preescalfa ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" End");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" End ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" Tot");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" Llit");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Preescalfa ") PREHEAT_1_LABEL _UxGT(" Conf.");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Preescalfa $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Preescalfa $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Preescalfa $ End");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Preescalfa $ End ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Preescalfa $ Tot");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preescalfa $ Llit");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preescalfa $ Conf.");
+ #endif
+ LSTR MSG_COOLDOWN = _UxGT("Refreda");
+
+ LSTR MSG_EXTRUDE = _UxGT("Extrudeix");
+ LSTR MSG_RETRACT = _UxGT("Retreu");
+ LSTR MSG_MOVE_AXIS = _UxGT("Mou eixos");
+ LSTR MSG_BED_LEVELING = _UxGT("Anivella llit");
+ LSTR MSG_LEVEL_BED = _UxGT("Anivella llit");
+
+ LSTR MSG_MOVING = _UxGT("Movent..");
+ LSTR MSG_FREE_XY = _UxGT("XY lliures");
+ LSTR MSG_MOVE_X = _UxGT("Mou X");
+ LSTR MSG_MOVE_Y = _UxGT("Mou Y");
+ LSTR MSG_MOVE_Z = _UxGT("Mou Z");
+ LSTR MSG_MOVE_N = _UxGT("Mou @");
+ LSTR MSG_MOVE_E = _UxGT("Extrusor");
+ LSTR MSG_MOVE_EN = _UxGT("Extrusor *");
+ LSTR MSG_MOVE_N_MM = _UxGT("Mou $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Mou 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Mou 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Mou 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Mou 100mm");
+ LSTR MSG_SPEED = _UxGT("Velocitat");
+ LSTR MSG_BED_Z = _UxGT("Llit Z");
+ LSTR MSG_NOZZLE = _UxGT("Nozzle");
+ LSTR MSG_NOZZLE_N = _UxGT("Nozzle ~");
+ LSTR MSG_BED = _UxGT("Llit");
+ LSTR MSG_FAN_SPEED = _UxGT("Vel. Ventilador");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Vel. Ventilador ~");
+ LSTR MSG_FLOW = _UxGT("Flux");
+ LSTR MSG_FLOW_N = _UxGT("Flux ~");
+ LSTR MSG_VTRAV_MIN = _UxGT("VViatge min");
+
+ LSTR MSG_A_RETRACT = _UxGT("Accel. retracc");
+ LSTR MSG_A_TRAVEL = _UxGT("Accel. Viatge");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Passos/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" passos/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" passos/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" passos/mm");
+ LSTR MSG_E_STEPS = _UxGT("@ passos/mm");
+ LSTR MSG_N_STEPS = _UxGT("E passos/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* passos/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperatura");
+ LSTR MSG_MOTION = _UxGT("Moviment");
+ LSTR MSG_FILAMENT = _UxGT("Filament");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Diam. Fil.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Diam. Fil. *");
+ LSTR MSG_CONTRAST = _UxGT("Contrast de LCD");
+ LSTR MSG_STORE_EEPROM = _UxGT("Desa memoria");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Carrega memoria");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Restaura valors");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualitza");
+ LSTR MSG_INFO_SCREEN = _UxGT("Pantalla Info.");
+ LSTR MSG_PREPARE = _UxGT("Prepara");
+ LSTR MSG_TUNE = _UxGT("Ajusta");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pausa impressio");
+ LSTR MSG_RESUME_PRINT = _UxGT("Repren impressio");
+ LSTR MSG_STOP_PRINT = _UxGT("Atura impressio.");
+ LSTR MSG_MEDIA_MENU = _UxGT("Imprimeix de SD");
+ LSTR MSG_NO_MEDIA = _UxGT("No hi ha targeta");
+ LSTR MSG_DWELL = _UxGT("En repos...");
+ LSTR MSG_USERWAIT = _UxGT("Esperant usuari..");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Imp. cancelada");
+ LSTR MSG_NO_MOVE = _UxGT("Sense moviment.");
+ LSTR MSG_KILLED = _UxGT("MATAT.");
+ LSTR MSG_STOPPED = _UxGT("ATURADA.");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Retreu mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Retreure mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Retreu V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Aixeca mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("DesRet +mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Swap DesRet +mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("DesRet V");
+ LSTR MSG_AUTORETRACT = _UxGT("Auto retraccio");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Canvia filament");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Canvia filament *");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Inicialitza SD");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Canvia SD");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Sonda Z fora");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Reinicia BLTouch");
+ LSTR MSG_HOME_FIRST = _UxGT("Home %s%s%s primer");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Decalatge Z");
+ LSTR MSG_BABYSTEP_X = _UxGT("Micropas X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Micropas Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Micropas Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Micropas @");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Cancel. Endstop");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Error al escalfar");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP REDUNDANT");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Err: TEMP MAXIMA");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Err: TEMP MINIMA");
+ LSTR MSG_HALTED = _UxGT("IMPRESSORA PARADA");
+ LSTR MSG_PLEASE_RESET = _UxGT("Reinicieu");
+ LSTR MSG_HEATING = _UxGT("Escalfant...");
+ LSTR MSG_BED_HEATING = _UxGT("Escalfant llit...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Calibratge Delta");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Calibra X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Calibra Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Calibra Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibra el centre");
+
+ LSTR MSG_INFO_MENU = _UxGT("Quant a la impr.");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Info Impressora");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Estadistiques");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Info placa");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistors");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extrusors");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Baud");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protocol");
+ LSTR MSG_CASE_LIGHT = _UxGT("Llum");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Total impressions");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Acabades");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Temps imprimint");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Treball mes llarg");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Total extrudit");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Impressions");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Acabades");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Total");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Mes llarg");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extrudit");
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Temp. mínima");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Temp. màxima");
+ LSTR MSG_INFO_PSU = _UxGT("Font alimentacio");
+
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Força motor");
+
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Repren impressió");
+
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Impressora incorrecta");
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Esperant per", "iniciar el canvi", "de filament"));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Esperant per", "treure filament"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Poseu filament", "i premeu el boto", "per continuar..."));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Premeu boto per", "escalfar nozzle."));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Escalfant nozzle", "Espereu..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Esperant carrega", "de filament"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Esperant per", "reprendre"));
+ #else // LCD_HEIGHT < 4
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Espereu..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Expulsant..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insereix i prem"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Escalfant..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Carregant..."));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Reprenent..."));
+ #endif // LCD_HEIGHT < 4
+}
diff --git a/src/lcd/language/language_cz.h b/src/lcd/language/language_cz.h
new file mode 100644
index 0000000..9c5bafc
--- /dev/null
+++ b/src/lcd/language/language_cz.h
@@ -0,0 +1,588 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Czech
+ * UTF-8 for Graphical Display
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ *
+ * Translated by Petr Zahradnik, Computer Laboratory
+ * Blog and video blog Zahradnik se bavi
+ * https://www.zahradniksebavi.cz
+ */
+
+#define DISPLAY_CHARSET_ISO10646_CZ
+
+namespace Language_cz {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Czech");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" připraven.");
+ LSTR MSG_YES = _UxGT("ANO");
+ LSTR MSG_NO = _UxGT("NE");
+ LSTR MSG_BACK = _UxGT("Zpět");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Rušení...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Médium vloženo");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Médium vyjmuto");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Čekání na médium");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Chyba čtení média");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB odstraněno");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("Chyba USB");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstopy"); // max 8 znaku
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstopy");
+ LSTR MSG_MAIN = _UxGT("Hlavní nabídka");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Další nastavení");
+ LSTR MSG_CONFIGURATION = _UxGT("Konfigurace");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Autostart");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Uvolnit motory");
+ LSTR MSG_DEBUG_MENU = _UxGT("Nabídka ladění");
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test ukaz. průběhu");
+ #else
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test uk. průběhu");
+ #endif
+ LSTR MSG_AUTO_HOME = _UxGT("Domovská pozice");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Domů osa X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Domů osa Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Domů osa Z");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Auto srovnání Z");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Měření podložky");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Kliknutím spusťte");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Další bod");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Měření hotovo!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Výška srovnávání");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Nastavit ofsety");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofsety nastaveny");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Zahřát ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Zahřát ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" end ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" vše");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" podlož");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Zahřát ") PREHEAT_1_LABEL _UxGT(" nast");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Zahřát $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Zahřát $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Zahřát $ end");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Zahřát $ end ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Zahřát $ vše");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Zahřát $ podlož");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Zahřát $ nast");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Zahřát vlastní");
+ LSTR MSG_COOLDOWN = _UxGT("Zchladit");
+ LSTR MSG_LASER_MENU = _UxGT("Ovládání laseru");
+ LSTR MSG_LASER_POWER = _UxGT("Výkon laseru");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Vřeteno ovládání");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Vřeteno výkon");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Vřeteno opačně");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Zapnout napájení");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Vypnout napájení");
+ LSTR MSG_EXTRUDE = _UxGT("Vytlačit (extr.)");
+ LSTR MSG_RETRACT = _UxGT("Zatlačit (retr.)");
+ LSTR MSG_MOVE_AXIS = _UxGT("Posunout osy");
+ LSTR MSG_BED_LEVELING = _UxGT("Vyrovnat podložku");
+ LSTR MSG_LEVEL_BED = _UxGT("Vyrovnat podložku");
+ LSTR MSG_BED_TRAMMING = _UxGT("Vyrovnat rohy");
+ LSTR MSG_NEXT_CORNER = _UxGT("Další roh");
+ LSTR MSG_MESH_EDITOR = _UxGT("Editor sítě");
+ LSTR MSG_EDIT_MESH = _UxGT("Upravit síť bodů");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Konec úprav sítě");
+ LSTR MSG_PROBING_POINT = _UxGT("Měření bodu");
+ LSTR MSG_MESH_X = _UxGT("Index X");
+ LSTR MSG_MESH_Y = _UxGT("Index Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Hodnota Z");
+
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Vlastní příkazy");
+ LSTR MSG_M48_TEST = _UxGT("M48 test sondy");
+ LSTR MSG_M48_POINT = _UxGT("M48 bod");
+ LSTR MSG_M48_DEVIATION = _UxGT("Odchylka");
+ LSTR MSG_IDEX_MENU = _UxGT("Režim IDEX");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Ofsety nástrojů");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikace");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Zrcadlení");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Plná kontrola");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2. tryska Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2. tryska @");
+
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Provádím G29");
+ LSTR MSG_UBL_TOOLS = _UxGT("UBL nástroje");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Vyrovnání bodu");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Manuální síť bodů");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Vložte kartu, změřte");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Změřte");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Odstraňte a změřte");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Přesun na další");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Aktivovat UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Deaktivovat UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Teplota podložky");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Teplota podložky");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Teplota hotendu");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Teplota hotendu");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Úprava sítě bodů");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Upravit vlastní síť");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Doladit síť bodů");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Konec úprav sítě");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Vlastní síť");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Vytvořit síť");
+ #if HAS_PREHEAT
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Síť bodů $");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Kontrola sítě $");
+ #endif
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Studená síť bodů");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Upravit výšku sítě");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Výška");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Zkontrolovat síť");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Kontrola vlast. sítě");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 zahřívání podl.");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 zařívání trysky");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Ruční zavedení...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Pevné zavední");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Done Priming");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 Canceled");
+ LSTR MSG_G26_LEAVING = _UxGT("Leaving G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Pokračovat v síťi");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Síťové rovnání");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-bodové rovnání");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Mřížkové rovnání");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Srovnat podložku");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Postranní body");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Typ sítě bodu");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Exportovat síť");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Exportovat do PC");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Exportovat do CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Záloha do PC");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Info o UBL do PC");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Hustota mřížky");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Ruční hustota");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Chytrá hustota");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Zaplnit mřížku");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Zrušit všechno");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Zrušit poslední");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Upravit všechny");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Upravit poslední");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Uložiště sítí");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Paměťový slot");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Načíst síť bodů");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Uložit síť bodů");
+ LSTR MSG_MESH_LOADED = _UxGT("Síť %i načtena");
+ LSTR MSG_MESH_SAVED = _UxGT("Síť %i uložena");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Nedostatek místa");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Ch.: Uložit UBL");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Ch.: Obnovit UBL");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-ofset: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Konec Z-ofsetu");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Postupně");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Studená síť bodů");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2. Chytrá hustota");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Zkontrolovat síť");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Upravit všechny");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Zkontrolovat síť");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Upravit všechny");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7. Uložit síť bodů");
+
+ LSTR MSG_LED_CONTROL = _UxGT("Nastavení LED");
+ LSTR MSG_LEDS = _UxGT("Světla");
+ LSTR MSG_LED_PRESETS = _UxGT("Světla Předvolby");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Červená");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Oranžová");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Žlutá");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Zelená");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Modrá");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Indigo");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Fialová");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Bílá");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Výchozí");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Vlastní světla");
+ LSTR MSG_INTENSITY_R = _UxGT("Červená intenzita");
+ LSTR MSG_INTENSITY_G = _UxGT("Zelená intezita");
+ LSTR MSG_INTENSITY_B = _UxGT("Modrá intenzita");
+ LSTR MSG_INTENSITY_W = _UxGT("Bílá intenzita");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Jas");
+
+ LSTR MSG_MOVING = _UxGT("Posouvání...");
+ LSTR MSG_FREE_XY = _UxGT("Uvolnit XY");
+ LSTR MSG_MOVE_X = _UxGT("Posunout X");
+ LSTR MSG_MOVE_Y = _UxGT("Posunout Y");
+ LSTR MSG_MOVE_Z = _UxGT("Posunout Z");
+ LSTR MSG_MOVE_N = _UxGT("Posunout @");
+ LSTR MSG_MOVE_E = _UxGT("Extrudér");
+ LSTR MSG_MOVE_EN = _UxGT("Extrudér *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Hotend je studený");
+ LSTR MSG_MOVE_N_MM = _UxGT("Posunout o $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Posunout o 0,1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Posunout o 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Posunout o 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Posunout o 100mm");
+ LSTR MSG_SPEED = _UxGT("Rychlost");
+ LSTR MSG_BED_Z = _UxGT("Výška podl.");
+ LSTR MSG_NOZZLE = _UxGT("Tryska");
+ LSTR MSG_NOZZLE_N = _UxGT("Tryska ~");
+ LSTR MSG_BED = _UxGT("Podložka");
+ LSTR MSG_CHAMBER = _UxGT("Komora");
+ LSTR MSG_FAN_SPEED = _UxGT("Rychlost vent.");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Rychlost vent. ~");
+ LSTR MSG_STORED_FAN_N = _UxGT("Ulož. vent. ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Rychlost ex. vent.");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Rychlost ex. vent. ~");
+ LSTR MSG_FLOW = _UxGT("Průtok");
+ LSTR MSG_FLOW_N = _UxGT("Průtok ~");
+ LSTR MSG_CONTROL = _UxGT("Ovládaní");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" fakt");
+ LSTR MSG_AUTOTEMP = _UxGT("Autoteplota");
+ LSTR MSG_LCD_ON = _UxGT("Zap");
+ LSTR MSG_LCD_OFF = _UxGT("Vyp");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("PID automatika");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID automatika *");
+ LSTR MSG_SELECT = _UxGT("Vybrat");
+ LSTR MSG_SELECT_E = _UxGT("Vybrat *");
+ LSTR MSG_ACC = _UxGT("Zrychl");
+ LSTR MSG_JERK = _UxGT("Jerk");
+ LSTR MSG_VA_JERK = _UxGT("Max ") STR_A _UxGT(" Jerk");
+ LSTR MSG_VB_JERK = _UxGT("Max ") STR_B _UxGT(" Jerk");
+ LSTR MSG_VC_JERK = _UxGT("Max ") STR_C _UxGT(" Jerk");
+ LSTR MSG_VN_JERK = _UxGT("Max @ Jerk");
+ LSTR MSG_VE_JERK = _UxGT("Max E Jerk");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Odchylka spoje");
+ LSTR MSG_MAX_SPEED = _UxGT("Max Rychlost");
+ LSTR MSG_VMAX_A = _UxGT("Max ") STR_A _UxGT(" Rychlost");
+ LSTR MSG_VMAX_B = _UxGT("Max ") STR_B _UxGT(" Rychlost");
+ LSTR MSG_VMAX_C = _UxGT("Max ") STR_C _UxGT(" Rychlost");
+ LSTR MSG_VMAX_N = _UxGT("Max @ Rychlost");
+ LSTR MSG_VMAX_E = _UxGT("Max E Rychlost");
+ LSTR MSG_VMAX_EN = _UxGT("Max * Rychlost");
+ LSTR MSG_VMIN = _UxGT("Vmin");
+ LSTR MSG_VTRAV_MIN = _UxGT("VTrav Min");
+ LSTR MSG_ACCELERATION = _UxGT("Akcelerace");
+ LSTR MSG_AMAX_A = _UxGT("Max ") STR_A _UxGT(" Akcel");
+ LSTR MSG_AMAX_B = _UxGT("Max ") STR_B _UxGT(" Akcel");
+ LSTR MSG_AMAX_C = _UxGT("Max ") STR_C _UxGT(" Akcel");
+ LSTR MSG_AMAX_N = _UxGT("Max @ Akcel");
+ LSTR MSG_AMAX_E = _UxGT("Max E Akcel");
+ LSTR MSG_AMAX_EN = _UxGT("Max * Akcel");
+ LSTR MSG_A_RETRACT = _UxGT("A-retrakt");
+ LSTR MSG_A_TRAVEL = _UxGT("A-přejezd");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Kroků/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" kroků/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" kroků/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" kroků/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ kroků/mm");
+ LSTR MSG_E_STEPS = _UxGT("E kroků/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* kroků/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Teplota");
+ LSTR MSG_MOTION = _UxGT("Pohyb");
+ LSTR MSG_FILAMENT = _UxGT("Filament");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E na mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Fil. Prum.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Fil. Prum. *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Vysunout mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Zavést mm");
+ LSTR MSG_ADVANCE_K = _UxGT("K pro posun");
+ LSTR MSG_ADVANCE_K_E = _UxGT("K pro posun *");
+ LSTR MSG_CONTRAST = _UxGT("Kontrast LCD");
+ LSTR MSG_STORE_EEPROM = _UxGT("Uložit nastavení");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Načíst nastavení");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Obnovit výchozí");
+ LSTR MSG_INIT_EEPROM = _UxGT("Inic. EEPROM");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Aktualizace z SD");
+ LSTR MSG_RESET_PRINTER = _UxGT("Reset tiskárny");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Obnovit");
+ LSTR MSG_INFO_SCREEN = _UxGT("Info obrazovka");
+ LSTR MSG_PREPARE = _UxGT("Připrava tisku");
+ LSTR MSG_TUNE = _UxGT("Doladění tisku");
+ LSTR MSG_START_PRINT = _UxGT("Spustit tisk");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Další");
+ LSTR MSG_BUTTON_INIT = _UxGT("Inicializace");
+ LSTR MSG_BUTTON_STOP = _UxGT("Stop");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Tisk");
+ LSTR MSG_BUTTON_RESET = _UxGT("Reset");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Zrušit");
+ LSTR MSG_BUTTON_DONE = _UxGT("Hotovo");
+ LSTR MSG_BUTTON_BACK = _UxGT("Zpět");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Pokračovat");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pozastavit tisk");
+ LSTR MSG_RESUME_PRINT = _UxGT("Obnovit tisk");
+ LSTR MSG_STOP_PRINT = _UxGT("Zastavit tisk");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Tisk objektu");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Zrušit objekt");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Zrušit objekt =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Obnova výpadku");
+ LSTR MSG_MEDIA_MENU = _UxGT("Tisknout z SD");
+ LSTR MSG_NO_MEDIA = _UxGT("Žádná SD karta");
+ LSTR MSG_DWELL = _UxGT("Uspáno...");
+ LSTR MSG_USERWAIT = _UxGT("Čekání na uživ...");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Tisk pozastaven");
+ LSTR MSG_PRINTING = _UxGT("Tisknu...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Tisk zrušen");
+ LSTR MSG_NO_MOVE = _UxGT("Žádný pohyb.");
+ LSTR MSG_KILLED = _UxGT("PŘERUSENO. ");
+ LSTR MSG_STOPPED = _UxGT("ZASTAVENO. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Retrakt mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Výměna Re.mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Retraktovat V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Zvednuti Z mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V");
+ LSTR MSG_AUTORETRACT = _UxGT("Auto-Retract");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Délka retrakce");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Délka zavedení");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Výměna nástroje");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Zdvih Z");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Rychlost primár.");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Rychlost retrak.");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Tryska standby");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Vyměnit filament");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Vyměnit filament *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Zavést filament");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Zavést filament *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Vysunout filament");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Vysunout filament *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Vysunout vše");
+
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Načíst médium");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Vyměnit médium");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Vysunout médium");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Sonda Z mimo podl");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Faktor zkosení");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch self-test");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("BLTouch reset");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("BLTouch zasunout");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("BLTouch vysunout");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("SW výsun BLTouch");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("BLTouch 5V režim");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("BLTouch OD režim");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Uložit režim");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Nastavit 5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Nastacit OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Vypsat nastavení");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("VAROVANÍ: Špatné nastavení může způsobit škody! Pokračovat?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Inic. TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Test Z Ofsetu");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Uložiy");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("vysunout TouchMI");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Vysunout Z-sondu");
+ LSTR MSG_MANUAL_STOW = _UxGT("Zasunout Z-sondu");
+ LSTR MSG_HOME_FIRST = _UxGT("Domů %s%s%s první");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Z ofset");
+ LSTR MSG_BABYSTEP_X = _UxGT("Babystep X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Babystep Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Babystep Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Babystep @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Celkem");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Endstop abort");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Chyba zahřívání");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("REDUND. TEPLOTA");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("TEPLOTNÍ ÚNIK");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("TEPL. ÚNIK PODL.");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("TEPL. ÚNIK KOMORA");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("VYSOKÁ TEPLOTA");
+ LSTR MSG_ERR_MINTEMP = _UxGT("NÍZKA TEPLOTA");
+ LSTR MSG_HALTED = _UxGT("TISK. ZASTAVENA");
+ LSTR MSG_PLEASE_RESET = _UxGT("Proveďte reset");
+ LSTR MSG_HEATING = _UxGT("Zahřívání...");
+ LSTR MSG_COOLING = _UxGT("Chlazení...");
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_BED_HEATING = _UxGT("Zahřívání podložky");
+ #else
+ LSTR MSG_BED_HEATING = _UxGT("Zahřívání podl.");
+ #endif
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_BED_COOLING = _UxGT("Chlazení podložky");
+ #else
+ LSTR MSG_BED_COOLING = _UxGT("Chlazení podl.");
+ #endif
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Zahřívání komory...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Chlazení komory...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrace");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrovat X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrovat Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrovat Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrovat Střed");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Delta nastavení");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Autokalibrace");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Diag rameno");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Výška");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Poloměr");
+ LSTR MSG_INFO_MENU = _UxGT("O tiskárně");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Info o tiskárně");
+ LSTR MSG_3POINT_LEVELING = _UxGT("3-bodové rovnání");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Lineárni rovnání");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Bilineární rovnání");
+ LSTR MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling");
+ LSTR MSG_MESH_LEVELING = _UxGT("Mřížkové rovnání");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Statistika");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Info o desce");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistory");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extrudéry");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Rychlost");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protokol");
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Sledování úniku: VYP");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Sledování úniku: ZAP");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Osvětlení");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Jas světla");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("NESPRÁVNÁ TISKÁRNA");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Počet tisků");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Dokončeno");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Celkový čas");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Nejdelší tisk");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Celkem vytlačeno");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Tisky");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Hotovo");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Čas");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Nejdelší");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Vytlačeno");
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Teplota min");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Teplota max");
+ LSTR MSG_INFO_PSU = _UxGT("Nap. zdroj");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Buzení motorů");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Motor %");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("DAC uložit EEPROM");
+ LSTR MSG_ERROR_TMC = _UxGT("TMC CHYBA SPOJENÍ");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("VÝMĚNA FILAMENTU");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("TISK POZASTAVEN");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ZAVEDENÍ FILAMENTU");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("VYSUNUTÍ FILAMENTU");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("MOŽNOSTI OBNOVENÍ:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Vytlačit víc");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Obnovit tisk");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Tryska: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Senzor filamentu");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Délka mm senz.fil.");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Parkování selhalo");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Kalibrace selhala");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("VYBERTE FILAMENT");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("Aktual. MMU firmware!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU potř. pozornost.");
+ LSTR MSG_MMU2_RESUME = _UxGT("Obnovit tisk");
+ LSTR MSG_MMU2_RESUMING = _UxGT("Obnovování...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("Zavést filament");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("Zavést všechny");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Zavést do trysky");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("Vysunout filament");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Vysun. filament ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Vytáhnout filament");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Zavádění fil. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Vytahování fil. ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Vysouvání fil....");
+ LSTR MSG_MMU2_ALL = _UxGT("Všechny");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filament ~");
+ LSTR MSG_MMU2_RESET = _UxGT("Resetovat MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("Resetování MMU...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Vytáhněte, klikněte");
+
+ LSTR MSG_MIX = _UxGT("Mix");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Komponenta =");
+ LSTR MSG_MIXER = _UxGT("Mixér");
+ LSTR MSG_GRADIENT = _UxGT("Přechod");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Celý přechod");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Přepnout mix");
+ LSTR MSG_CYCLE_MIX = _UxGT("Střídat mix");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Přechod mix");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Opačný přechod");
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Aktivní V-nástroj");
+ LSTR MSG_START_VTOOL = _UxGT("Spustit V-nástroj");
+ LSTR MSG_END_VTOOL = _UxGT("Ukončit V-nástroj");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Alias V-nástroje");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Resetovat V-nástroj");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Uložit V-nástroj mix");
+ LSTR MSG_VTOOLS_RESET = _UxGT("V-nástroj resetovat");
+ #else
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Aktivní V-nástr.");
+ LSTR MSG_START_VTOOL = _UxGT("Spustit V-nástr.");
+ LSTR MSG_END_VTOOL = _UxGT("Ukončit V-nástr.");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Alias V-nástr.");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Reset. V-nástr.");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Uložit V-nás. mix");
+ LSTR MSG_VTOOLS_RESET = _UxGT("V-nástr. reset.");
+ #endif
+ LSTR MSG_START_Z = _UxGT("Počáteční Z:");
+ LSTR MSG_END_Z = _UxGT(" Koncové Z:");
+
+ LSTR MSG_GAMES = _UxGT("Hry");
+ LSTR MSG_BRICKOUT = _UxGT("Brickout");
+ LSTR MSG_INVADERS = _UxGT("Invaders");
+ LSTR MSG_SNAKE = _UxGT("Sn4k3");
+ LSTR MSG_MAZE = _UxGT("Bludiště");
+
+ #if LCD_HEIGHT >= 4
+ // Up to 3 lines allowed
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Stikněte tlačítko", "pro obnovení tisku"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkování..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Čekejte prosím", "na zahájení", "výměny filamentu"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Vložte filament", "a stiskněte", "tlačítko..."));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klikněte pro", "nahřátí trysky"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Čekejte prosím", "na nahřátí tr."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Čekejte prosím", "na vysunuti", "filamentu"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Čekejte prosím", "na zavedení", "filamentu"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Vyčkejte na", "vytlačení"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Klikněte pro", "ukončení", "vytlačování"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Čekejte prosím", "na pokračování", "tisku"));
+ #else // LCD_HEIGHT < 4
+ // Up to 2 lines allowed
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Stikněte tlač.", "pro obnovení"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkování..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Čekejte..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Vložte, klikněte"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klikněte pro", "nahřátí"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Nahřívání..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Vysouvání..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Zavádění..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Vytlačování..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Klikněte pro", "ukončení"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Pokračování..."));
+ #endif // LCD_HEIGHT < 4
+
+ LSTR MSG_TMC_DRIVERS = _UxGT("TMC budiče");
+ LSTR MSG_TMC_CURRENT = _UxGT("Proud budičů");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybridní práh");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Domů bez senzorů");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Režim kroků");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop povolen");
+ LSTR MSG_SERVICE_RESET = _UxGT("Reset");
+ LSTR MSG_SERVICE_IN = _UxGT(" za:");
+ LSTR MSG_BACKLASH = _UxGT("Vůle");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Korekce");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Vyhlazení");
+}
diff --git a/src/lcd/language/language_da.h b/src/lcd/language/language_da.h
new file mode 100644
index 0000000..b4afca9
--- /dev/null
+++ b/src/lcd/language/language_da.h
@@ -0,0 +1,199 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Danish
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_1
+
+namespace Language_da {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Danish");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" er klar");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Kort isat");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Kort fjernet");
+ LSTR MSG_MAIN = _UxGT("Menu");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Slå alle steppere fra");
+ LSTR MSG_AUTO_HOME = _UxGT("Auto Home"); // G28
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Klik når du er klar");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Næste punkt");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Bed level er færdig!");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Sæt forsk. af home");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Forsk. er nu aktiv");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Forvarm ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Forvarm ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" end ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" Alle");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" Bed");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Forvarm ") PREHEAT_1_LABEL _UxGT(" conf");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Forvarm $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Forvarm $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Forvarm $ end");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Forvarm $ end ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Forvarm $ Alle");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Forvarm $ Bed");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Forvarm $ conf");
+ #endif
+ LSTR MSG_COOLDOWN = _UxGT("Afkøl");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Slå strøm til");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Slå strøm fra");
+ LSTR MSG_EXTRUDE = _UxGT("Extruder");
+ LSTR MSG_MOVE_AXIS = _UxGT("Flyt akser");
+ LSTR MSG_BED_LEVELING = _UxGT("Juster bed");
+ LSTR MSG_LEVEL_BED = _UxGT("Juster bed");
+ LSTR MSG_MOVE_X = _UxGT("Flyt X");
+ LSTR MSG_MOVE_Y = _UxGT("Flyt Y");
+ LSTR MSG_MOVE_Z = _UxGT("Flyt Z");
+ LSTR MSG_MOVE_N = _UxGT("Flyt @");
+ LSTR MSG_MOVE_E = _UxGT("Flyt E");
+ LSTR MSG_MOVE_EN = _UxGT("Flyt *");
+ LSTR MSG_MOVE_N_MM = _UxGT("Flyt $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Flyt 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Flyt 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Flyt 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Flyt 100mm");
+ LSTR MSG_SPEED = _UxGT("Hastighed");
+ LSTR MSG_BED_Z = _UxGT("Plade Z");
+ LSTR MSG_NOZZLE = _UxGT("Dyse");
+ LSTR MSG_NOZZLE_N = _UxGT("Dyse ~");
+
+ LSTR MSG_BED = _UxGT("Plade");
+ LSTR MSG_FAN_SPEED = _UxGT("Blæser hastighed");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Blæser hastighed ~");
+ LSTR MSG_CONTROL = _UxGT("Kontrol");
+ LSTR MSG_MIN = _UxGT(" \002 Min");
+ LSTR MSG_MAX = _UxGT(" \002 Max");
+ LSTR MSG_FACTOR = _UxGT(" \002 Fact");
+ LSTR MSG_AUTOTEMP = _UxGT("Autotemp");
+ LSTR MSG_LCD_ON = _UxGT("Til");
+ LSTR MSG_LCD_OFF = _UxGT("Fra");
+ LSTR MSG_SELECT = _UxGT("Vælg");
+ LSTR MSG_SELECT_E = _UxGT("Vælg *");
+ LSTR MSG_A_RETRACT = _UxGT("A-retract");
+ LSTR MSG_A_TRAVEL = _UxGT("A-rejse");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperatur");
+ LSTR MSG_MOTION = _UxGT("Bevægelse");
+ LSTR MSG_FILAMENT = _UxGT("Filament");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E i mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Fil. Dia.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *");
+ LSTR MSG_CONTRAST = _UxGT("LCD kontrast");
+ LSTR MSG_STORE_EEPROM = _UxGT("Gem i EEPROM");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Hent fra EEPROM");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Gendan Defaults");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Genopfrisk");
+ LSTR MSG_INFO_SCREEN = _UxGT("Info skærm");
+ LSTR MSG_PREPARE = _UxGT("Forbered");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pause printet");
+ LSTR MSG_RESUME_PRINT = _UxGT("Forsæt printet");
+ LSTR MSG_STOP_PRINT = _UxGT("Stop printet");
+ LSTR MSG_MEDIA_MENU = _UxGT("Print fra SD");
+ LSTR MSG_NO_MEDIA = _UxGT("Intet SD kort");
+ LSTR MSG_DWELL = _UxGT("Dvale...");
+ LSTR MSG_USERWAIT = _UxGT("Venter på bruger...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Print annulleret");
+ LSTR MSG_NO_MOVE = _UxGT("Ingen bevægelse.");
+ LSTR MSG_KILLED = _UxGT("DRÆBT. ");
+ LSTR MSG_STOPPED = _UxGT("STOPPET. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Tilbagetræk mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Skift Re.mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Tilbagetræk V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Skift Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V");
+ LSTR MSG_AUTORETRACT = _UxGT("Auto-Retract");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Skift filament");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Skift filament *");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Skift SD kort");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Probe udenfor plade");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Selv-Test");
+ LSTR MSG_HOME_FIRST = _UxGT("Home %s%s%s først");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Opvarmning fejlet");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Fejl: reserve temp");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("Temp løber løbsk");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Fejl: Maks temp");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Fejl: Min temp");
+ LSTR MSG_HALTED = _UxGT("PRINTER STOPPET");
+ LSTR MSG_PLEASE_RESET = _UxGT("Reset Venligst");
+ LSTR MSG_HEATING = _UxGT("Opvarmer...");
+ LSTR MSG_BED_HEATING = _UxGT("Opvarmer plade...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrering");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrer X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrer Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrer Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrerings Center");
+
+ LSTR MSG_INFO_MENU = _UxGT("Om Printer");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Kort Info");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistors");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Ant. Prints");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Færdige");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Total print tid");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Længste print");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extruderet");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Prints");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Færdige");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Total");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Længste");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extruderet");
+ #endif
+
+ LSTR MSG_INFO_PSU = _UxGT("Strømfors.");
+
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Driv Styrke");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Driv %");
+
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Skriv");
+
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Forsæt print");
+
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Forkert printer");
+
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Vent på start", "af filament", "skift"));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Vent på", "filament udskyd."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Indsæt filament", "og tryk på knap", "for at fortsætte..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Vent på", "filament indtag"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Vent på at print", "fortsætter"));
+ #else // LCD_HEIGHT < 4
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Vent venligst..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Udskyder..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Indsæt og klik"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Indtager..."));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Fortsætter..."));
+ #endif // LCD_HEIGHT < 4
+}
diff --git a/src/lcd/language/language_de.h b/src/lcd/language/language_de.h
new file mode 100644
index 0000000..5708221
--- /dev/null
+++ b/src/lcd/language/language_de.h
@@ -0,0 +1,814 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * German
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+namespace Language_de {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Deutsch");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" bereit");
+ LSTR MSG_YES = _UxGT("JA");
+ LSTR MSG_NO = _UxGT("NEIN");
+ LSTR MSG_HIGH = _UxGT("HOCH");
+ LSTR MSG_LOW = _UxGT("RUNTER");
+ LSTR MSG_BACK = _UxGT("Zurück");
+ LSTR MSG_ERROR = _UxGT("Fehler");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Abbruch...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Medium erkannt");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Medium entfernt");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Warten auf Medium");
+ LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Medium Init fehlgesch.");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Medium Lesefehler");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB Gerät entfernt");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB Start fehlge.");
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall überschritten");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstopp"); // Max length 8 characters
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Software-Endstopp");
+ LSTR MSG_MAIN = _UxGT("Hauptmenü");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Erw. Einstellungen");
+ LSTR MSG_TOOLBAR_SETUP = _UxGT("Toolbar Einstellung");
+ LSTR MSG_OPTION_DISABLED = _UxGT("Option Deaktiviert");
+ LSTR MSG_CONFIGURATION = _UxGT("Konfiguration");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Autostart");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Motoren deaktivieren"); // M84 :: Max length 19 characters
+ LSTR MSG_DEBUG_MENU = _UxGT("Debug-Menü");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Statusbalken-Test");
+ LSTR MSG_HOMING = _UxGT("Homing");
+ LSTR MSG_AUTO_HOME = _UxGT("Auto Home");
+ LSTR MSG_AUTO_HOME_A = _UxGT("Home @");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Home X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Home Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Home Z");
+ LSTR MSG_FILAMENT_SET = _UxGT("Fila. Einstellungen");
+ LSTR MSG_FILAMENT_MAN = _UxGT("Filament Management");
+ LSTR MSG_MANUAL_LEVELING = _UxGT("Manuell Nivellierung");
+ LSTR MSG_LEVBED_FL = _UxGT("Vorne Links");
+ LSTR MSG_LEVBED_FR = _UxGT("Vorne Rechts");
+ LSTR MSG_LEVBED_C = _UxGT("Mitte");
+ LSTR MSG_LEVBED_BL = _UxGT("Hinten Links");
+ LSTR MSG_LEVBED_BR = _UxGT("Hinten Rechts");
+ LSTR MSG_MANUAL_MESH = _UxGT("manuelles Netz");
+ LSTR MSG_AUTO_MESH = _UxGT("Netz auto. erstellen");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Z-Achsen ausgleichen");
+ LSTR MSG_ITERATION = _UxGT("G34 Iteration: %i");
+ LSTR MSG_DECREASING_ACCURACY = _UxGT("Genauigkeit sinkt!");
+ LSTR MSG_ACCURACY_ACHIEVED = _UxGT("Genauigkeit erreicht");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("XYZ homen");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Klick zum Starten");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Nächste Koordinate");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Nivellieren fertig!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Ausblendhöhe");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Setze Homeversatz");
+ LSTR MSG_HOME_OFFSET_X = _UxGT("Homeversatz X");
+ LSTR MSG_HOME_OFFSET_Y = _UxGT("Homeversatz Y");
+ LSTR MSG_HOME_OFFSET_Z = _UxGT("Homeversatz Z");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Homeversatz aktiv");
+ LSTR MSG_TRAMMING_WIZARD = _UxGT("Tramming Assistent");
+ LSTR MSG_SELECT_ORIGIN = _UxGT("Wählen Sie Ursprung");
+ LSTR MSG_LAST_VALUE_SP = _UxGT("Letzter Wert ");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" Vorwärmen");
+ LSTR MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" Vorwärmen ~");
+ LSTR MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärmen");
+ LSTR MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" Extr. Vorwärm. ~");
+ LSTR MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" Alles Vorwärmen");
+ LSTR MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" Bett Vorwärmen");
+ LSTR MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" Einstellungen");
+ #ifdef PREHEAT_2_LABEL
+ LSTR MSG_PREHEAT_2 = PREHEAT_2_LABEL _UxGT(" Vorwärmen");
+ LSTR MSG_PREHEAT_2_SETTINGS = PREHEAT_2_LABEL _UxGT(" Vorwärmen Konf");
+ #endif
+ #ifdef PREHEAT_3_LABEL
+ LSTR MSG_PREHEAT_3 = PREHEAT_3_LABEL _UxGT(" Vorwärmen");
+ LSTR MSG_PREHEAT_3_SETTINGS = PREHEAT_3_LABEL _UxGT(" Vorwärmen Konf");
+ #endif
+ LSTR MSG_PREHEAT_M = _UxGT("$ Vorwärmen");
+ LSTR MSG_PREHEAT_M_H = _UxGT("$ Vorwärmen") " ~";
+ LSTR MSG_PREHEAT_M_END = _UxGT("$ Extr. Vorwärmen");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("$ Extr. Vorwärm. ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("$ Alles Vorwärmen");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("$ Bett Vorwärmen");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("$ Einstellungen");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("benutzerdef. Heizen");
+ LSTR MSG_COOLDOWN = _UxGT("Abkühlen");
+
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("Frequenz");
+ LSTR MSG_LASER_MENU = _UxGT("Laser");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Spindel-Steuerung");
+ LSTR MSG_LASER_POWER = _UxGT("Laserleistung");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Spindelleistung");
+ LSTR MSG_LASER_TOGGLE = _UxGT("Laser umschalten");
+ LSTR MSG_LASER_EVAC_TOGGLE = _UxGT("Gebläse umschalten");
+ LSTR MSG_LASER_ASSIST_TOGGLE = _UxGT("Luftunterstützung");
+ LSTR MSG_LASER_PULSE_MS = _UxGT("Test Impuls ms");
+ LSTR MSG_LASER_FIRE_PULSE = _UxGT("Fire Impuls");
+ LSTR MSG_FLOWMETER_FAULT = _UxGT("Feh. Kühlmittelfluss");
+ LSTR MSG_SPINDLE_TOGGLE = _UxGT("Spindel umschalten");
+ LSTR MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Vakuum umschalten");
+ LSTR MSG_SPINDLE_FORWARD = _UxGT("Spindel vorwärts");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Spindelrichtung");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Netzteil ein");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Netzteil aus");
+ LSTR MSG_EXTRUDE = _UxGT("Extrudieren");
+ LSTR MSG_RETRACT = _UxGT("Einzug");
+ LSTR MSG_MOVE_AXIS = _UxGT("Achsen bewegen");
+ LSTR MSG_BED_LEVELING = _UxGT("Bett-Nivellierung");
+ LSTR MSG_LEVEL_BED = _UxGT("Bett nivellieren");
+ LSTR MSG_BED_TRAMMING = _UxGT("Bett ausrichten");
+ LSTR MSG_BED_TRAMMING_MANUAL = _UxGT("Manuelles ausrichten");
+ LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Das Bett anpassen, bis zum auslösen.");
+ LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Ecken in der Toleranz. Bett ausger.");
+ LSTR MSG_BED_TRAMMING_GOOD_POINTS = _UxGT("Gute Punkte: ");
+ LSTR MSG_BED_TRAMMING_LAST_Z = _UxGT("Letztes Z: ");
+ LSTR MSG_NEXT_CORNER = _UxGT("Nächste Ecke");
+ LSTR MSG_MESH_EDITOR = _UxGT("Netz Editor");
+ LSTR MSG_MESH_VIEWER = _UxGT("Netzbetrachter");
+ LSTR MSG_EDIT_MESH = _UxGT("Netz bearbeiten");
+ LSTR MSG_MESH_VIEW = _UxGT("Netz ansehen");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Netzbearb. angeh.");
+ LSTR MSG_NO_VALID_MESH = _UxGT("Kein gültiges Netz");
+ LSTR MSG_ACTIVATE_MESH = _UxGT("Nivellierung aktiv.");
+ LSTR MSG_PROBING_POINT = _UxGT("Messpunkt");
+ LSTR MSG_MESH_X = _UxGT("Index X");
+ LSTR MSG_MESH_Y = _UxGT("Index Y");
+ LSTR MSG_MESH_INSET = _UxGT("Mesh-Einsatz");
+ LSTR MSG_MESH_MIN_X = _UxGT("Mesh X Minimum");
+ LSTR MSG_MESH_MAX_X = _UxGT("Mesh X Maximum");
+ LSTR MSG_MESH_MIN_Y = _UxGT("Mesh Y Minimum");
+ LSTR MSG_MESH_MAX_Y = _UxGT("Mesh Y Maximum");
+ LSTR MSG_MESH_AMAX = _UxGT("Bereich maximieren");
+ LSTR MSG_MESH_CENTER = _UxGT("Center Area");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Z-Wert");
+ LSTR MSG_MESH_CANCEL = _UxGT("Mesh abgebrochen");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Benutzer-Menü");
+ LSTR MSG_M48_TEST = _UxGT("M48 Sondentest");
+ LSTR MSG_M48_POINT = _UxGT("M48 Punkt");
+ LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Zu weit draußen");
+ LSTR MSG_M48_DEVIATION = _UxGT("Abweichung");
+ LSTR MSG_IDEX_MENU = _UxGT("IDEX-Modus");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Werkzeugversätze");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Autom. parken");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplizieren");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Spiegelkopie");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("vollstä. Kontrolle");
+ LSTR MSG_IDEX_DUPE_GAP = _UxGT("X-Lücke duplizieren");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2. Düse Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2. Düse @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("G29 ausführen");
+ LSTR MSG_UBL_TOOLS = _UxGT("UBL-Werkzeuge");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Berührungspunkt");
+ LSTR MSG_UBL_TILT_MESH = _UxGT("Tilt Mesh");
+ LSTR MSG_UBL_TILTING_GRID = _UxGT("Tilting Grid Size");
+ LSTR MSG_UBL_MESH_TILTED = _UxGT("Mesh Tilted");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Netz manuell erst.");
+ LSTR MSG_UBL_MESH_WIZARD = _UxGT("UBL Netz Assistent");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Unterlegen & messen");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Messen");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Entfernen & messen");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Nächster Punkt...");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("UBL aktivieren");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL deaktivieren");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Betttemperatur");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Betttemperatur");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Hotend-Temp.");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend-Temp.");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Netz bearbeiten");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Eigenes Netz bearb.");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Feineinstellung...");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Bearbeitung beendet");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Eigenes Netz erst.");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Netz erstellen");
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("$ Netz erstellen");
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Netz erstellen kalt");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Netzhöhe einst.");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Höhe");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Netz validieren");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("$ Netz validieren");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Eig. Netz validieren");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 heizt Bett");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 Düse aufheizen");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Manuell Prime...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Feste Länge Prime");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Priming fertig");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 abgebrochen");
+ LSTR MSG_G26_LEAVING = _UxGT("G26 verlassen");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Netzerst. forts.");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Netz-Nivellierung");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Punkt-Nivell.");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Gitternetz-Nivell.");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Netz nivellieren");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Eckpunkte");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Kartentyp");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Karte ausgeben");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Ausgabe für Host");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Ausgabe für CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Externe Sicherung");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("UBL-Info ausgeben");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Menge an Füllung");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Manuelles Füllen");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Cleveres Füllen");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Netz Füllen");
+ LSTR MSG_UBL_MESH_FILLED = _UxGT("Fehlende Punkte erg.");
+ LSTR MSG_UBL_MESH_INVALID = _UxGT("Ungültiges Netz");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Alles annullieren");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Nächstlieg. ann.");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Feineinst. Alles");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Feineinst. Nächstl.");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Netz-Speicherplatz");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Speicherort");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Bettnetz laden");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Bettnetz speichern");
+ LSTR MSG_UBL_INVALID_SLOT = _UxGT("Wähle einen Mesh-Slot");
+ LSTR MSG_MESH_LOADED = _UxGT("Netz %i geladen");
+ LSTR MSG_MESH_SAVED = _UxGT("Netz %i gespeichert");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Kein Speicher");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Err:UBL speichern");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Err:UBL wiederherst.");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-Versatz: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Versatz angehalten");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Schrittweises UBL");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Netz kalt erstellen");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2.Intelligent Füllen");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Netz validieren");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Alles Feineinst.");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Netz validieren");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Alles Feineinst.");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7.Bettnetz speichern");
+
+ LSTR MSG_LED_CONTROL = _UxGT("Licht-Steuerung");
+ LSTR MSG_LEDS = _UxGT("Licht");
+ LSTR MSG_LED_PRESETS = _UxGT("Licht-Einstellung");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Rot");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Orange");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Gelb");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Grün");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Blau");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Indigo");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Violett");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Weiß");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Standard");
+ LSTR MSG_LED_CHANNEL_N = _UxGT("Kanal =");
+ LSTR MSG_LEDS2 = _UxGT("Lichter #2");
+ LSTR MSG_NEO2_PRESETS = _UxGT("Licht #2 Voreinst.");
+ LSTR MSG_NEO2_BRIGHTNESS = _UxGT("Helligkeit");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Benutzerdefiniert");
+ LSTR MSG_INTENSITY_R = _UxGT("Intensität Rot");
+ LSTR MSG_INTENSITY_G = _UxGT("Intensität Grün");
+ LSTR MSG_INTENSITY_B = _UxGT("Intensität Blau");
+ LSTR MSG_INTENSITY_W = _UxGT("Intensität Weiß");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Helligkeit");
+
+ LSTR MSG_MOVING = _UxGT("In Bewegung...");
+ LSTR MSG_FREE_XY = _UxGT("Abstand XY");
+ LSTR MSG_MOVE_X = _UxGT("Bewege X");
+ LSTR MSG_MOVE_Y = _UxGT("Bewege Y");
+ LSTR MSG_MOVE_Z = _UxGT("Bewege Z");
+ LSTR MSG_MOVE_N = _UxGT("Bewege @");
+ LSTR MSG_MOVE_E = _UxGT("Bewege Extruder");
+ LSTR MSG_MOVE_EN = _UxGT("Bewege Extruder *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Hotend zu kalt");
+ LSTR MSG_MOVE_N_MM = _UxGT(" $ mm");
+ LSTR MSG_MOVE_01MM = _UxGT(" 0,1 mm");
+ LSTR MSG_MOVE_1MM = _UxGT(" 1,0 mm");
+ LSTR MSG_MOVE_10MM = _UxGT(" 10,0 mm");
+ LSTR MSG_MOVE_100MM = _UxGT("100,0 mm");
+ LSTR MSG_MOVE_0001IN = _UxGT("0.001 in");
+ LSTR MSG_MOVE_001IN = _UxGT("0.010 in");
+ LSTR MSG_MOVE_01IN = _UxGT("0.100 in");
+ LSTR MSG_MOVE_1IN = _UxGT("1.000 in");
+ LSTR MSG_SPEED = _UxGT("Geschw.");
+ LSTR MSG_BED_Z = _UxGT("Bett Z");
+ LSTR MSG_NOZZLE = _UxGT("Düse");
+ LSTR MSG_NOZZLE_N = _UxGT("Düse ~");
+ LSTR MSG_NOZZLE_PARKED = _UxGT("Düse geparkt");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Düse bereit");
+ LSTR MSG_BED = _UxGT("Bett");
+ LSTR MSG_CHAMBER = _UxGT("Gehäuse");
+ LSTR MSG_COOLER = _UxGT("Laser-Kühlmittel");
+ LSTR MSG_COOLER_TOGGLE = _UxGT("Kühler umschalten");
+ LSTR MSG_FLOWMETER_SAFETY = _UxGT("Durchflusssicherheit");
+ LSTR MSG_LASER = _UxGT("Laser");
+ LSTR MSG_FAN_SPEED = _UxGT("Lüfter");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Lüfter ~");
+ LSTR MSG_STORED_FAN_N = _UxGT("Gespeich. Lüfter ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Geschw. Extralüfter");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Geschw. Extralüfter ~");
+ LSTR MSG_CONTROLLER_FAN = _UxGT("Lüfter Kontroller");
+ LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Lüfter Leerlauf");
+ LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Motorlast Modus");
+ LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("Lüfter Motorlast");
+ LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("Ausschalt Delay");
+ LSTR MSG_FLOW = _UxGT("Flussrate");
+ LSTR MSG_FLOW_N = _UxGT("Flussrate ~");
+ LSTR MSG_CONTROL = _UxGT("Einstellungen");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Faktor");
+ LSTR MSG_AUTOTEMP = _UxGT("Auto Temperatur");
+ LSTR MSG_LCD_ON = _UxGT("an");
+ LSTR MSG_LCD_OFF = _UxGT("aus");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("PID Autotune");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *");
+ LSTR MSG_PID_CYCLE = _UxGT("PID Zyklus");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("PID Tuning fertig");
+ LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("PID Autotune fehlge.!");
+ LSTR MSG_BAD_EXTRUDER_NUM = _UxGT("ungültiger Extruder.");
+ LSTR MSG_TEMP_TOO_HIGH = _UxGT("Temperatur zu hoch.");
+ LSTR MSG_TIMEOUT = _UxGT("Timeout.");
+ LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune fehlge.! Ungültiger Extruder");
+ LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune fehlge.! Temperatur zu hoch.");
+ LSTR MSG_PID_TIMEOUT = _UxGT("Autotune fehlge.! Timeout.");
+ LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("teste Wärmeverlust");
+ LSTR MSG_MPC_AUTOTUNE = _UxGT("Autotune MPC");
+ LSTR MSG_MPC_EDIT = _UxGT("MPC * bearbeiten");
+ LSTR MSG_MPC_POWER_E = _UxGT("* Leistung");
+ LSTR MSG_MPC_BLOCK_HEAT_CAPACITY_E = _UxGT("Block C *");
+ LSTR MSG_SENSOR_RESPONSIVENESS_E = _UxGT("Sensor res *");
+ LSTR MSG_MPC_AMBIENT_XFER_COEFF_E = _UxGT("Ambient h *");
+ LSTR MSG_MPC_AMBIENT_XFER_COEFF_FAN_E = _UxGT("Amb. h fan *");
+ LSTR MSG_SELECT = _UxGT("Auswählen");
+ LSTR MSG_SELECT_E = _UxGT("Auswählen *");
+ LSTR MSG_ACC = _UxGT("Beschleunigung");
+ LSTR MSG_JERK = _UxGT("Jerk");
+ LSTR MSG_VA_JERK = _UxGT("Max ") STR_A _UxGT(" Jerk");
+ LSTR MSG_VB_JERK = _UxGT("Max ") STR_B _UxGT(" Jerk");
+ LSTR MSG_VC_JERK = _UxGT("Max ") STR_C _UxGT(" Jerk");
+ LSTR MSG_VN_JERK = _UxGT("Max @ Jerk");
+ LSTR MSG_VE_JERK = _UxGT("Max ") STR_E _UxGT(" Jerk");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev");
+ LSTR MSG_MAX_SPEED = _UxGT("Max Geschw. (mm/s)");
+ LSTR MSG_VMAX_A = _UxGT("V max ") STR_A;
+ LSTR MSG_VMAX_B = _UxGT("V max ") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("V max ") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("V max @");
+ LSTR MSG_VMAX_E = _UxGT("V max ") STR_E;
+ LSTR MSG_VMAX_EN = _UxGT("V max *");
+ LSTR MSG_VMIN = _UxGT("V min ");
+ LSTR MSG_VTRAV_MIN = _UxGT("V min Leerfahrt");
+ LSTR MSG_ACCELERATION = _UxGT("Beschleunigung");
+ LSTR MSG_AMAX_A = _UxGT("A max ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("A max ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("A max ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("A max @");
+ LSTR MSG_AMAX_E = _UxGT("A max ") STR_E;
+ LSTR MSG_AMAX_EN = _UxGT("A max *");
+ LSTR MSG_A_RETRACT = _UxGT("A Einzug");
+ LSTR MSG_A_TRAVEL = _UxGT("A Leerfahrt");
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("max. Frequenz");
+ LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("min. Vorschub");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Steps/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" Steps/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" Steps/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" Steps/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ Steps/mm");
+ LSTR MSG_E_STEPS = _UxGT("E Steps/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* Steps/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperatur");
+ LSTR MSG_MOTION = _UxGT("Bewegung");
+ LSTR MSG_FILAMENT = _UxGT("Filament");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *");
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Filamentdurchmesser");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Filamentdurchmesser *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Entladen mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Laden mm");
+ LSTR MSG_ADVANCE_K = _UxGT("Vorschubfaktor");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Vorschubfaktor *");
+ LSTR MSG_CONTRAST = _UxGT("LCD-Kontrast");
+ LSTR MSG_BRIGHTNESS = _UxGT("LCD-Helligkeit");
+ LSTR MSG_LCD_TIMEOUT_SEC = _UxGT("LCD-Ruhezustand (s)");
+ LSTR MSG_SCREEN_TIMEOUT = _UxGT("LCD Timeout (m)");
+ LSTR MSG_BRIGHTNESS_OFF = _UxGT("LCD ausschalten");
+ LSTR MSG_STORE_EEPROM = _UxGT("Konfig. speichern");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Konfig. laden");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Standardwerte laden");
+ LSTR MSG_INIT_EEPROM = _UxGT("Werkseinstellungen");
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Fehler");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Fehler");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Fehler");
+ LSTR MSG_SETTINGS_STORED = _UxGT("Einstell. gespei.");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("FW Update vom Medium");
+ LSTR MSG_RESET_PRINTER = _UxGT("Drucker neustarten");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Aktualisieren");
+ LSTR MSG_INFO_SCREEN = _UxGT("Info");
+ LSTR MSG_INFO_MACHINENAME = _UxGT("Machine Name");
+ LSTR MSG_INFO_SIZE = _UxGT("Größe");
+ LSTR MSG_INFO_FWVERSION = _UxGT("Firmware Version");
+ LSTR MSG_INFO_BUILD = _UxGT("Build Datum");
+ LSTR MSG_PREPARE = _UxGT("Vorbereitung");
+ LSTR MSG_TUNE = _UxGT("Justierung");
+ LSTR MSG_POWER_MONITOR = _UxGT("Power Monitor");
+ LSTR MSG_CURRENT = _UxGT("Strom");
+ LSTR MSG_VOLTAGE = _UxGT("Spannung");
+ LSTR MSG_POWER = _UxGT("Power");
+ LSTR MSG_START_PRINT = _UxGT("Starte Druck");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Weiter");
+ LSTR MSG_BUTTON_INIT = _UxGT("Bestätigen");
+ LSTR MSG_BUTTON_STOP = _UxGT("Stop");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Drucken");
+ LSTR MSG_BUTTON_RESET = _UxGT("Reseten");
+ LSTR MSG_BUTTON_IGNORE = _UxGT("Ignorieren");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Abbrechen");
+ LSTR MSG_BUTTON_CONFIRM = _UxGT("Bestätigen");
+ LSTR MSG_BUTTON_CONTINUE = _UxGT("Fortsetzen");
+ LSTR MSG_BUTTON_DONE = _UxGT("Fertig");
+ LSTR MSG_BUTTON_BACK = _UxGT("Zurück");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Weiter");
+ LSTR MSG_BUTTON_SKIP = _UxGT("Überspringen");
+ LSTR MSG_BUTTON_INFO = _UxGT("Info");
+ LSTR MSG_BUTTON_LEVEL = _UxGT("Level");
+ LSTR MSG_BUTTON_PAUSE = _UxGT("Pause");
+ LSTR MSG_BUTTON_RESUME = _UxGT("Fortsetzen");
+ LSTR MSG_BUTTON_ADVANCED = _UxGT("Erweitert");
+ LSTR MSG_BUTTON_SAVE = _UxGT("Speichern");
+ LSTR MSG_BUTTON_PURGE = _UxGT("Reinigen");
+ LSTR MSG_PAUSING = _UxGT("Pause...");
+ LSTR MSG_PAUSE_PRINT = _UxGT("SD-Druck pausieren");
+ LSTR MSG_ADVANCED_PAUSE = _UxGT("Erweiterte Pause");
+ LSTR MSG_RESUME_PRINT = _UxGT("SD-Druck fortsetzen");
+ LSTR MSG_HOST_START_PRINT = _UxGT("Host-Druck starten");
+ LSTR MSG_STOP_PRINT = _UxGT("SD-Druck abbrechen");
+ LSTR MSG_END_LOOPS = _UxGT("Wiederholung beenden");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Objekt drucken");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Objekt abbrechen");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Objekt abbrechen =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Wiederh. n. Stroma.");
+ LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Druckauftrag fortset.");
+ LSTR MSG_MEDIA_MENU = _UxGT("Druck vom Medium");
+ LSTR MSG_NO_MEDIA = _UxGT("Kein Medium");
+ LSTR MSG_DWELL = _UxGT("Warten...");
+ LSTR MSG_USERWAIT = _UxGT("Klick zum Fortsetzen");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Druck pausiert...");
+ LSTR MSG_PRINTING = _UxGT("Druckt...");
+ LSTR MSG_STOPPING = _UxGT("Stoppen...");
+ LSTR MSG_REMAINING_TIME = _UxGT("Verbleiben");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Druck abgebrochen");
+ LSTR MSG_PRINT_DONE = _UxGT("Druck fertig");
+ LSTR MSG_PRINTER_KILLED = _UxGT("Drucker killed!");
+ LSTR MSG_TURN_OFF = _UxGT("Drucker ausschalten");
+ LSTR MSG_NO_MOVE = _UxGT("Motoren angeschaltet");
+ LSTR MSG_KILLED = _UxGT("ABGEBROCHEN");
+ LSTR MSG_STOPPED = _UxGT("ANGEHALTEN");
+ LSTR MSG_FWRETRACT = _UxGT("Firmware Retract");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Einzug mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Wechs. Einzug mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("V Einzug");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Z-Sprung mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Wechs. Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V");
+ LSTR MSG_AUTORETRACT = _UxGT("Autom. Einzug");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Einzugslänge");
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra Einzug");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Entladelänge");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Werkzeugwechsel");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z anheben");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Prime-Geschwin.");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Einzug-Geschwin.");
+ LSTR MSG_FILAMENT_PARK_ENABLED = _UxGT("Kopf parken");
+ LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Rückzugsgeschwindigkeit");
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Lüfter Geschwindigkeit");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Lüfter Zeit");
+ LSTR MSG_TOOL_MIGRATION_ON = _UxGT("Auto AN");
+ LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("Auto AUS");
+ LSTR MSG_TOOL_MIGRATION = _UxGT("Werkzeugmigration");
+ LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-Migration");
+ LSTR MSG_TOOL_MIGRATION_END = _UxGT("Letzter Extruder");
+ LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrieren zu *");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Filament wechseln");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Filament wechseln *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Filament laden");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Filament laden *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Filament entladen");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Filament entladen *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Alles entladen");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Medium initial."); // Manually initialize the SD-card via user interface
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Medium getauscht"); // SD-card changed by user. For machines with no autocarddetect. Both send "M21"
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Medium freigeben"); // if Marlin gets confused - M22
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z-Sonde außerhalb");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Korrekturfaktor");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Selbsttest");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Zurücksetzen");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Einfahren");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Ausfahren");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("SW-Modus");
+ LSTR MSG_BLTOUCH_SPEED_MODE = _UxGT("High Speed");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("5V-Modus");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("OD-Modus");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Setze auf 5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Setze auf OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Modus: ");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("ACHTUNG: Falsche Einstellung - kann zu Beschädigung führen! Fortfahren?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("TouchMI initial.");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Test Z-Versatz");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Speichern");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI ausfahren");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Z-Sonde ausfahren");
+ LSTR MSG_MANUAL_STOW = _UxGT("Z-Sonde einfahren");
+ LSTR MSG_HOME_FIRST = _UxGT("Vorher %s%s%s homen");
+ LSTR MSG_ZPROBE_SETTINGS = _UxGT("Sondeneinstellungen");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Sondenversatz");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("Sondenversatz X");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Sondenversatz Y");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Sondenversatz Z");
+ LSTR MSG_ZPROBE_MARGIN = _UxGT("Sondenrand");
+ LSTR MSG_Z_FEED_RATE = _UxGT("Z-Vorschub");
+ LSTR MSG_ENABLE_HS_MODE = _UxGT("HS-Modus aktivieren");
+ LSTR MSG_MOVE_NOZZLE_TO_BED = _UxGT("Bewege Düse zum Bett");
+ LSTR MSG_BABYSTEP_X = _UxGT("Babystep X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Babystep Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Babystep Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Babystep @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Total");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Abbr. mit Endstopp");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("HEIZEN ERFOLGLOS");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("REDUND. TEMP-ABWEI.");
+ LSTR MSG_THERMAL_RUNAWAY = " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT");
+ LSTR MSG_TEMP_MALFUNCTION = _UxGT("TEMP-FEHLER");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("BETT") " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("GEH.") " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT");
+ LSTR MSG_THERMAL_RUNAWAY_COOLER = _UxGT("Kühler Runaway");
+ LSTR MSG_COOLING_FAILED = _UxGT("Kühlung fehlgeschla.");
+ LSTR MSG_ERR_MAXTEMP = " " LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN");
+ LSTR MSG_ERR_MINTEMP = " " LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN");
+ LSTR MSG_HALTED = _UxGT("DRUCKER GESTOPPT");
+ LSTR MSG_PLEASE_WAIT = _UxGT("Bitte warten...");
+ LSTR MSG_PLEASE_RESET = _UxGT("Bitte neustarten");
+ LSTR MSG_PREHEATING = _UxGT("vorheizen...");
+ LSTR MSG_HEATING = _UxGT("heizt...");
+ LSTR MSG_COOLING = _UxGT("kühlt...");
+ LSTR MSG_BED_HEATING = _UxGT("Bett heizt...");
+ LSTR MSG_BED_COOLING = _UxGT("Bett kühlt...");
+ LSTR MSG_PROBE_HEATING = _UxGT("Sonde heizt...");
+ LSTR MSG_PROBE_COOLING = _UxGT("Sonde kühlt...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Gehäuse heizt...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Gehäuse kühlt...");
+ LSTR MSG_LASER_COOLING = _UxGT("Laser kühlt...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta kalibrieren");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Kalibriere X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibriere Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibriere Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibriere Mitte");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Delta Einst. anzeig.");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Autom. Kalibrierung");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Diag Rod");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Höhe");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Radius");
+ LSTR MSG_INFO_MENU = _UxGT("Über den Drucker");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Drucker-Info");
+ LSTR MSG_3POINT_LEVELING = _UxGT("3-Punkt-Nivellierung");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Lineare Nivellierung");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Bilineare Nivell.");
+ LSTR MSG_UBL_LEVELING = _UxGT("Einheit. Bettnivell.");
+ LSTR MSG_MESH_LEVELING = _UxGT("Netz-Nivellierung");
+ LSTR MSG_MESH_DONE = _UxGT("Nivellierung fertig");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Drucker-Statistik");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Board-Info");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistoren");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extruder");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Baudrate");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protokoll");
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Runaway Watch: AUS");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Runaway Watch: AN");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend Idle Timeout");
+ LSTR MSG_FAN_SPEED_FAULT = _UxGT("Fehler Lüftergeschw.");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Beleuchtung");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Helligkeit");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Falscher Drucker");
+
+ LSTR MSG_COLORS_GET = _UxGT("Farbe");
+ LSTR MSG_COLORS_SELECT = _UxGT("Farben auswählen");
+ LSTR MSG_COLORS_APPLIED = _UxGT("Farben verwenden");
+ LSTR MSG_COLORS_RED = _UxGT("Rot");
+ LSTR MSG_COLORS_GREEN = _UxGT("Grün");
+ LSTR MSG_COLORS_BLUE = _UxGT("Blau");
+ LSTR MSG_COLORS_WHITE = _UxGT("Weiß");
+ LSTR MSG_UI_LANGUAGE = _UxGT("UI Sprache");
+ LSTR MSG_SOUND_ENABLE = _UxGT("Ton aktivieren");
+ LSTR MSG_LOCKSCREEN = _UxGT("Bildschirm sperren");
+ LSTR MSG_LOCKSCREEN_LOCKED = _UxGT("Drucker ist gesperrt,");
+ LSTR MSG_LOCKSCREEN_UNLOCK = _UxGT("Scrollen zum Entsper.");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Kein Medium eingelegt.");
+ LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Bitte auf Neustart warten.");
+ LSTR MSG_PLEASE_PREHEAT = _UxGT("Bitte das Hotend vorheizen.");
+ LSTR MSG_INFO_PRINT_COUNT_RESET = _UxGT("Druckzähler zurücksetzen");
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Gesamte Drucke");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Komplette Drucke");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Gesamte Druckzeit");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Längste Druckzeit");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Gesamt Extrudiert");
+ #else
+ LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Auf Neustart warten");
+ LSTR MSG_PLEASE_PREHEAT = _UxGT("Bitte vorheizen");
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Drucke");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Komplette");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Gesamte");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Längste");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extrud.");
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Min Temp");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Max Temp");
+ LSTR MSG_INFO_PSU = _UxGT("Netzteil");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Motorleistung");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Treiber %");
+ LSTR MSG_ERROR_TMC = _UxGT("TMC Verbindungsfehler");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Werte speichern");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMENT WECHSEL");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("DRUCK PAUSIERT");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("FILAMENT LADEN");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("FILAMENT ENTLADEN");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("FORTS. OPTIONEN:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Mehr entladen");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Druck weiter");
+ LSTR MSG_FILAMENT_CHANGE_PURGE_CONTINUE = _UxGT("Löschen o. fortfah.?");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Düse: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Runout-Sensor");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout-Weg mm");
+ LSTR MSG_RUNOUT_ENABLE = _UxGT("Runout aktivieren");
+ LSTR MSG_RUNOUT_ACTIVE = _UxGT("Runout aktiv");
+ LSTR MSG_INVERT_EXTRUDER = _UxGT("Invert Extruder");
+ LSTR MSG_EXTRUDER_MIN_TEMP = _UxGT("Extruder Min Temp.");
+ LSTR MSG_FANCHECK = _UxGT("Lüftergeschw. prüfen");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Homing gescheitert");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Probing gescheitert");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("FILAMENT WÄHLEN");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("Update MMU Firmware!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU handeln erfor.");
+ LSTR MSG_MMU2_RESUME = _UxGT("Druck fortsetzen");
+ LSTR MSG_MMU2_RESUMING = _UxGT("Fortfahren...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("Filament laden");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("Lade alle");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Düse laden");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("Filament auswerfen");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Filament ~ auswerfen");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Filament entladen ");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Lade Fila. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Fila. auswerfen...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Fila. entladen...");
+ LSTR MSG_MMU2_ALL = _UxGT("Alle");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filament ~");
+ LSTR MSG_MMU2_RESET = _UxGT("setze MMU zurück");
+ LSTR MSG_MMU2_RESETTING = _UxGT("MMU zurücksetzen...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Entfernen, klicken");
+
+ LSTR MSG_MIX = _UxGT("Mix");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Komponente =");
+ LSTR MSG_MIXER = _UxGT("Mixer");
+ LSTR MSG_GRADIENT = _UxGT("Gradient"); // equal Farbverlauf
+ LSTR MSG_FULL_GRADIENT = _UxGT("Volle Gradient");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Mix umschalten");
+ LSTR MSG_CYCLE_MIX = _UxGT("Zyklus Mix");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Gradient Mix");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Umgekehrte Gradient");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Aktives V-Tool");
+ LSTR MSG_START_VTOOL = _UxGT("V-Tool Start");
+ LSTR MSG_END_VTOOL = _UxGT("V-Tool Ende");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("V-Tool Alias");
+ LSTR MSG_RESET_VTOOLS = _UxGT("V-Tools Reseten");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("V-Tool Mix sichern");
+ LSTR MSG_VTOOLS_RESET = _UxGT("V-Tools ist resetet");
+ LSTR MSG_START_Z = _UxGT("Z Start:");
+ LSTR MSG_END_Z = _UxGT("Z Ende:");
+
+ LSTR MSG_GAMES = _UxGT("Spiele");
+ LSTR MSG_BRICKOUT = _UxGT("Brickout");
+ LSTR MSG_INVADERS = _UxGT("Invaders");
+ LSTR MSG_SNAKE = _UxGT("Sn4k3");
+ LSTR MSG_MAZE = _UxGT("Maze");
+
+ LSTR MSG_BAD_PAGE = _UxGT("ungült. Seitenzahl");
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("ungült. Seitengeschw.");
+
+ LSTR MSG_EDIT_PASSWORD = _UxGT("Passwort bearbeiten");
+ LSTR MSG_LOGIN_REQUIRED = _UxGT("Login erforderlich");
+ LSTR MSG_PASSWORD_SETTINGS = _UxGT("Passwort Einstellungen");
+ LSTR MSG_ENTER_DIGIT = _UxGT("PIN eingeben");
+ LSTR MSG_CHANGE_PASSWORD = _UxGT("Passwort ändern");
+ LSTR MSG_REMOVE_PASSWORD = _UxGT("Passwort löschen");
+ LSTR MSG_PASSWORD_SET = _UxGT("Passwort ist ");
+ LSTR MSG_START_OVER = _UxGT("von vorn beginnen");
+ LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Bald speichern!");
+ LSTR MSG_PASSWORD_REMOVED = _UxGT("Passwort gelöscht");
+
+ //
+ // Die Filament-Change-Bildschirme können bis zu 3 Zeilen auf einem 4-Zeilen-Display anzeigen
+ // ...oder 2 Zeilen auf einem 3-Zeilen-Display.
+
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Knopf drücken um", "Druck fortzusetzen"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_2_LINE("Druck ist", "pausiert..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Warte auf den", "Start des", "Filamentwechsels..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Filament einlegen", "und Knopf drücken", "um fortzusetzen"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Knopf drücken um", "Düse aufzuheizen"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Düse heizt auf", "bitte warten..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Warte auf", "Entnahme", "des Filaments..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Warte auf", "Laden des", "Filaments..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Warte auf", "Spülung", "der Düse..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Klicke um", "die Düsenspülung", "zu beenden"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Warte auf", "Fortsetzen des", "Drucks..."));
+ #else // LCD_HEIGHT < 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Klick zum Fortsetzen"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Pausiert..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Bitte warten..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Laden und Klick"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Klick zum Heizen"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Heizen..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Entnehmen..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Laden..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Spülen..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Klick zum beenden", "der Düsenspülung"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Fortsetzen..."));
+ #endif // LCD_HEIGHT < 4
+
+ LSTR MSG_TMC_DRIVERS = _UxGT("TMC Treiber"); // Max length 18 characters
+ LSTR MSG_TMC_CURRENT = _UxGT("Treiber Strom");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid threshold");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorloses Homing");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Schrittmodus");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop einsch.");
+ LSTR MSG_SERVICE_RESET = _UxGT("Reset");
+ LSTR MSG_SERVICE_IN = _UxGT(" im:");
+ LSTR MSG_BACKLASH = _UxGT("Spiel");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Korrektur");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Glätten");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("X Achse leveln");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Auto. Kalibiren");
+ #if ENABLED(TOUCH_UI_FTDI_EVE)
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Idle Timeout, Temperatur gefallen. Drücke Okay, um erneut aufzuheizen und fortzufahren.");
+ #else
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Heizungs Timeout");
+ #endif
+ LSTR MSG_REHEAT = _UxGT("Erneut aufheizen");
+ LSTR MSG_REHEATING = _UxGT("Erneut aufhei. ...");
+ LSTR MSG_REHEATDONE = _UxGT("Aufwärmen fertig");
+
+ LSTR MSG_PROBE_WIZARD = _UxGT("Sonden-Assistent");
+ LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Sonden-Bezug");
+ LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Bewege zur Position");
+
+ LSTR MSG_XATC = _UxGT("X-Verdreh-Assistent");
+ LSTR MSG_XATC_DONE = _UxGT("X-Verdreh-Assi fertig!");
+ LSTR MSG_XATC_UPDATE_Z_OFFSET = _UxGT("Z-Versatz Sonde akt. auf ");
+
+ LSTR MSG_SOUND = _UxGT("Ton");
+
+ LSTR MSG_TOP_LEFT = _UxGT("Oben Links");
+ LSTR MSG_BOTTOM_LEFT = _UxGT("Unten Links");
+ LSTR MSG_TOP_RIGHT = _UxGT("Oben Rechts");
+ LSTR MSG_BOTTOM_RIGHT = _UxGT("Unten Rechts");
+ LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Kalibrierung beendet");
+ LSTR MSG_CALIBRATION_FAILED = _UxGT("Kalibrierung geschei.");
+
+ LSTR MSG_DRIVER_BACKWARD = _UxGT(" Driver zurück");
+
+ LSTR MSG_SD_CARD = _UxGT("SD Karte");
+ LSTR MSG_USB_DISK = _UxGT("USB Disk");
+
+ LSTR MSG_HOST_SHUTDOWN = _UxGT("Host abschalten");
+
+ LSTR MSG_SHORT_DAY = _UxGT("t"); // One character only
+ LSTR MSG_SHORT_HOUR = _UxGT("h"); // One character only
+ LSTR MSG_SHORT_MINUTE = _UxGT("m"); // One character only
+}
diff --git a/src/lcd/language/language_el.h b/src/lcd/language/language_el.h
new file mode 100644
index 0000000..41b73dd
--- /dev/null
+++ b/src/lcd/language/language_el.h
@@ -0,0 +1,210 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Greek
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_GREEK
+
+namespace Language_el {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Greek (Greece)");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" έτοιμος.");
+ LSTR MSG_YES = _UxGT("ΝΑΙ");
+ LSTR MSG_NO = _UxGT("ΟΧΙ");
+ LSTR MSG_BACK = _UxGT("Πίσω");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Προχωρημένες ρυθμίσεις");
+ LSTR MSG_CONFIGURATION = _UxGT("Διαμόρφωση");
+
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Κάρτα εισήχθη");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Κάρτα αφαιρέθη");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Αναμονή για κάρτα");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Ματαίωση...");
+ LSTR MSG_MEDIA_READ_ERROR = MEDIA_TYPE_EN _UxGT(" σφάλμα ανάγνωσης");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB αφαιρέθη");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("Αποτυχία εκκίνησης USB");
+ LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Αποτυχία αρχικοποίησης SD");
+ LSTR MSG_MAIN = _UxGT("Αρχική Οθόνη");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Αυτόματη εκκίνηση");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Απενεργοποίηση μοτέρ");
+ LSTR MSG_AUTO_HOME = _UxGT("Αυτόμ. επαναφορά XYZ");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Επαναφορά X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Επαναφορά Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Επαναφορά Z");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Αυτόμ. επαναφορά XYZ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Πιέστε για έναρξη");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Επόμενο σημείο");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Τέλος επιπεδοποίησης!");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Ορισμός μετατοπίσεων");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Εφαρμογή μετατοπίσεων");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" όλα");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" bed"); //SHORTEN
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" επιβεβαίωση"); //SHORTEN
+
+ LSTR MSG_PREHEAT_M = _UxGT("Προθέρμανση $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Προθέρμανση $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Προθέρμανση $ End");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Προθέρμανση $ End ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Προθέρμανση $ όλα");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Προθέρμανση $ bed"); //SHORTEN
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Προθέρμανση $ επιβεβαίωση"); //SHORTEN
+ #endif
+ LSTR MSG_COOLDOWN = _UxGT("Αποθέρμανση");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Ενεργοποίηση");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Απενεργοποίηση");
+ LSTR MSG_EXTRUDE = _UxGT("Εξώθηση");
+ LSTR MSG_RETRACT = _UxGT("Ανάσυρση");
+ LSTR MSG_MOVE_AXIS = _UxGT("Μετακίνηση άξονα");
+ LSTR MSG_BED_LEVELING = _UxGT("Επιπεδοποίηση κλίνης");
+ LSTR MSG_LEVEL_BED = _UxGT("Επιπεδοποίηση κλίνης");
+ LSTR MSG_MOVE_X = _UxGT("Μετακίνηση X");
+ LSTR MSG_MOVE_Y = _UxGT("Μετακίνηση Y");
+ LSTR MSG_MOVE_Z = _UxGT("Μετακίνηση Z");
+ LSTR MSG_MOVE_N = _UxGT("Μετακίνηση @");
+ LSTR MSG_MOVE_E = _UxGT("Εξωθητής");
+ LSTR MSG_MOVE_EN = _UxGT("Εξωθητής *");
+ LSTR MSG_MOVE_N_MM = _UxGT("Μετακίνηση %s μμ");
+ LSTR MSG_MOVE_01MM = _UxGT("Μετακίνηση 0,1 μμ");
+ LSTR MSG_MOVE_1MM = _UxGT("Μετακίνηση 1 μμ");
+ LSTR MSG_MOVE_10MM = _UxGT("Μετακίνηση 10 μμ");
+ LSTR MSG_MOVE_100MM = _UxGT("Μετακίνηση 100 μμ");
+ LSTR MSG_SPEED = _UxGT("Ταχύτητα");
+ LSTR MSG_BED_Z = _UxGT("Επ. Εκτύπωσης Z");
+ LSTR MSG_NOZZLE = _UxGT("Ακροφύσιο");
+ LSTR MSG_NOZZLE_N = _UxGT("Ακροφύσιο ~");
+ LSTR MSG_BED = _UxGT("Επ. Εκτύπωσης");
+ LSTR MSG_FAN_SPEED = _UxGT("Ταχύτητα ανεμιστήρα");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Ταχύτητα ανεμιστήρα ~");
+ LSTR MSG_FLOW = _UxGT("Ροή");
+ LSTR MSG_FLOW_N = _UxGT("Ροή ~");
+ LSTR MSG_CONTROL = _UxGT("Έλεγχος");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact");
+ LSTR MSG_AUTOTEMP = _UxGT("Αυτορρύθμιση θερ/σίας");
+ LSTR MSG_LCD_ON = _UxGT("Ενεργοποιημένο");
+ LSTR MSG_LCD_OFF = _UxGT("Απενεργοποιημένο");
+ LSTR MSG_ACC = _UxGT("Επιτάχυνση");
+ LSTR MSG_VA_JERK = _UxGT("Vαντίδραση ") STR_A;
+ LSTR MSG_VB_JERK = _UxGT("Vαντίδραση ") STR_B;
+ LSTR MSG_VC_JERK = _UxGT("Vαντίδραση ") STR_C;
+ LSTR MSG_VN_JERK = _UxGT("Vαντίδραση @");
+ LSTR MSG_VE_JERK = _UxGT("Vαντίδραση E");
+ LSTR MSG_VMAX_A = _UxGT("V Μέγιστο") STR_A;
+ LSTR MSG_VMAX_B = _UxGT("V Μέγιστο") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("V Μέγιστο") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("V Μέγιστο@");
+ LSTR MSG_VMAX_E = _UxGT("V ΜέγιστοE");
+ LSTR MSG_VMAX_EN = _UxGT("V Μέγιστο *");
+ LSTR MSG_VMIN = _UxGT("V Ελάχιστο");
+ LSTR MSG_VTRAV_MIN = _UxGT("Vελάχ. μετατόπιση");
+ LSTR MSG_ACCELERATION = _UxGT("Accel");
+ LSTR MSG_AMAX_A = _UxGT("Aμεγ ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Aμεγ ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Aμεγ ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Aμεγ @");
+ LSTR MSG_AMAX_E = _UxGT("Aμεγ E");
+ LSTR MSG_AMAX_EN = _UxGT("Aμεγ *");
+ LSTR MSG_A_RETRACT = _UxGT("Α-ανάσυρση");
+ LSTR MSG_A_TRAVEL = _UxGT("Α-μετατόπιση");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Bήματα ανά μμ");
+ LSTR MSG_A_STEPS = _UxGT("Bήματα ") STR_A _UxGT(" ανά μμ");
+ LSTR MSG_B_STEPS = _UxGT("Bήματα ") STR_B _UxGT(" ανά μμ");
+ LSTR MSG_C_STEPS = _UxGT("Bήματα ") STR_C _UxGT(" ανά μμ");
+ LSTR MSG_N_STEPS = _UxGT("Bήματα @ ανά μμ");
+ LSTR MSG_E_STEPS = _UxGT("Bήματα Ε ανά μμ");
+ LSTR MSG_EN_STEPS = _UxGT("Bήματα * ανά μμ");
+ LSTR MSG_TEMPERATURE = _UxGT("Θερμοκρασία");
+ LSTR MSG_MOTION = _UxGT("Κίνηση");
+ LSTR MSG_FILAMENT = _UxGT("Νήμα");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("Ε σε mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Διάμετρος νήματος");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Διάμετρος νήματος *");
+ LSTR MSG_CONTRAST = _UxGT("Αντίθεση LCD");
+ LSTR MSG_STORE_EEPROM = _UxGT("Αποθήκευση σε EEPROM");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Φόρτωση από EEPROM");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Επαναφορά προεπιλογών");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ανανέωση");
+ LSTR MSG_INFO_SCREEN = _UxGT("Οθόνη πληροφόρησης");
+ LSTR MSG_PREPARE = _UxGT("Προετοιμασία");
+ LSTR MSG_TUNE = _UxGT("Συντονισμός");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Παύση εκτύπωσης");
+ LSTR MSG_RESUME_PRINT = _UxGT("Συνέχιση εκτύπωσης");
+ LSTR MSG_STOP_PRINT = _UxGT("Διακοπή εκτύπωσης");
+ LSTR MSG_MEDIA_MENU = _UxGT("Εκτύπωση από SD");
+ LSTR MSG_NO_MEDIA = _UxGT("Δεν βρέθηκε SD");
+ LSTR MSG_DWELL = _UxGT("Αναστολή λειτουργίας");
+ LSTR MSG_USERWAIT = _UxGT("Αναμονή για χρήστη");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Εκτύπωση διεκόπη");
+ LSTR MSG_NO_MOVE = _UxGT("Καμία κίνηση.");
+ LSTR MSG_KILLED = _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. ");
+ LSTR MSG_STOPPED = _UxGT("ΔΙΑΚΟΠΗ. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Ανάσυρση μμ");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Εναλλαγή ανάσυρσης mm"); //SHORTEN
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Ανάσυρση V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Μεταπήδηση mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V");
+ LSTR MSG_AUTORETRACT = _UxGT("Αυτόματη ανάσυρση");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Αλλαγή νήματος");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Αλλαγή νήματος *");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Προετοιμασία SD");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Αλλαγή κάρτας SD");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Διερεύνηση Z εκτός Επ.Εκτύπωσης"); //SHORTEN
+ LSTR MSG_YX_UNHOMED = _UxGT("Επαναφορά Χ/Υ πρώτα");
+ LSTR MSG_XYZ_UNHOMED = _UxGT("Επαναφορά ΧΥΖ πρώτα");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Μετατόπιση Ζ");
+ LSTR MSG_BABYSTEP_X = _UxGT("Μικρό βήμα Χ");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Μικρό βήμα Υ");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Μικρό βήμα Ζ");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Ακύρωση endstop");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Αποτυχία θέρμανσης");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("ΘΕΡΜΙΚΗ ΔΙΑΦΥΓΗ");
+ LSTR MSG_TEMP_MALFUNCTION = _UxGT("ΘΕΡΜΙΚΗ ΔΥΣΛΕΙΤΟΥΡΓΙΑ");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("ΠΕΡΙΤΤΗ ΘΕΡΜΟΚΡΑΣΙΑ");
+ LSTR MSG_ERR_MINTEMP = _UxGT("ΑΝΕΠΑΡΚΗΣ ΘΕΡΜΟΚΡΑΣΙΑ");
+ LSTR MSG_HALTED = _UxGT("Εκτυπωτής διεκόπη");
+ LSTR MSG_HEATING = _UxGT("Θερμαίνεται…");
+ LSTR MSG_BED_HEATING = _UxGT("Θέρμανση κλίνης");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Βαθμονόμηση Delta");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Βαθμονόμηση X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Βαθμονόμηση Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Βαθμονόμηση Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Βαθμονόμηση κέντρου");
+
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Εσφαλμένος εκτυπωτής");
+}
diff --git a/src/lcd/language/language_el_CY.h b/src/lcd/language/language_el_CY.h
new file mode 100644
index 0000000..68e9ee1
--- /dev/null
+++ b/src/lcd/language/language_el_CY.h
@@ -0,0 +1,38 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Greek (Cyprus)
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#include "language_el.h"
+
+namespace Language_el_CY {
+ using namespace Language_el; // Inherit undefined strings from Greek (or English)
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Greek (Cyprus)");
+}
diff --git a/src/lcd/language/language_el_gr.h b/src/lcd/language/language_el_gr.h
new file mode 100644
index 0000000..7306aab
--- /dev/null
+++ b/src/lcd/language/language_el_gr.h
@@ -0,0 +1,198 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Greek (Greece)
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_GREEK
+
+namespace Language_el_gr {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Greek (Greece)");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" έτοιμο.");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Εισαγωγή κάρτας");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Αφαίρεση κάρτας");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
+ LSTR MSG_MAIN = _UxGT("Βασική Οθόνη");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Αυτόματη εκκίνηση");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Απενεργοποίηση βηματιστή");
+ LSTR MSG_AUTO_HOME = _UxGT("Αυτομ. επαναφορά στο αρχικό σημείο");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Αρχικό σημείο X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Αρχικό σημείο Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Αρχικό σημείο Z");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Επαναφορά στο αρχικό σημείο ΧΥΖ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Κάντε κλικ για να ξεκινήσετε");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Επόμενο σημείο");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Ολοκλήρωση επιπεδοποίησης!");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Ορισμός βασικών μετατοπίσεων");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Εφαρμόστηκαν οι μετατοπίσεις");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" όλα");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" κλίνη");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" επιβεβαίωση");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Προθέρμανση $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Προθέρμανση $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Προθέρμανση $ End");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Προθέρμανση $ End ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Προθέρμανση $ όλα");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Προθέρμανση $ κλίνη");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Προθέρμανση $ επιβεβαίωση");
+ #endif
+ LSTR MSG_COOLDOWN = _UxGT("Μειωση θερμοκρασιας");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Ενεργοποίηση");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Απενεργοποίηση");
+ LSTR MSG_EXTRUDE = _UxGT("Εξώθηση");
+ LSTR MSG_RETRACT = _UxGT("Ανάσυρση");
+ LSTR MSG_MOVE_AXIS = _UxGT("Μετακίνηση άξονα");
+ LSTR MSG_BED_LEVELING = _UxGT("Επιπεδοποίηση κλίνης");
+ LSTR MSG_LEVEL_BED = _UxGT("Επιπεδοποίηση κλίνης");
+ LSTR MSG_MOVE_X = _UxGT("Μετακίνηση X");
+ LSTR MSG_MOVE_Y = _UxGT("Μετακίνηση Y");
+ LSTR MSG_MOVE_Z = _UxGT("Μετακίνηση Z");
+ LSTR MSG_MOVE_N = _UxGT("Μετακίνηση @");
+ LSTR MSG_MOVE_E = _UxGT("Εξωθητήρας");
+ LSTR MSG_MOVE_EN = _UxGT("Εξωθητήρας *");
+ LSTR MSG_MOVE_N_MM = _UxGT("Μετακίνηση %s μμ");
+ LSTR MSG_MOVE_01MM = _UxGT("Μετακίνηση 0,1 μμ");
+ LSTR MSG_MOVE_1MM = _UxGT("Μετακίνηση 1 μμ");
+ LSTR MSG_MOVE_10MM = _UxGT("Μετακίνηση 10 μμ");
+ LSTR MSG_MOVE_100MM = _UxGT("Μετακίνηση 100 μμ");
+ LSTR MSG_SPEED = _UxGT("Ταχύτητα");
+ LSTR MSG_BED_Z = _UxGT("Κλίνη Z");
+ LSTR MSG_NOZZLE = _UxGT("Ακροφύσιο");
+ LSTR MSG_NOZZLE_N = _UxGT("Ακροφύσιο ~");
+ LSTR MSG_BED = _UxGT("Κλίνη");
+ LSTR MSG_FAN_SPEED = _UxGT("Ταχύτητα ανεμιστήρα");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Ταχύτητα ανεμιστήρα ~");
+ LSTR MSG_FLOW = _UxGT("Ροή");
+ LSTR MSG_FLOW_N = _UxGT("Ροή ~");
+ LSTR MSG_CONTROL = _UxGT("Έλεγχος");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact");
+ LSTR MSG_AUTOTEMP = _UxGT("Αυτομ. ρύθμιση θερμοκρασίας");
+ LSTR MSG_LCD_ON = _UxGT("Ενεργοποιημένο");
+ LSTR MSG_LCD_OFF = _UxGT("Απενεργοποιημένο");
+ LSTR MSG_ACC = _UxGT("Επιτάχυνση");
+ LSTR MSG_JERK = _UxGT("Vαντίδραση");
+ LSTR MSG_VA_JERK = _UxGT("Vαντίδραση ") STR_A;
+ LSTR MSG_VB_JERK = _UxGT("Vαντίδραση ") STR_B;
+ LSTR MSG_VC_JERK = _UxGT("Vαντίδραση ") STR_C;
+ LSTR MSG_VN_JERK = _UxGT("Vαντίδραση @");
+ LSTR MSG_VE_JERK = _UxGT("Vαντίδραση E");
+ LSTR MSG_VMAX_A = _UxGT("Vμεγ ") STR_A;
+ LSTR MSG_VMAX_B = _UxGT("Vμεγ ") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("Vμεγ ") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("Vμεγ @");
+ LSTR MSG_VMAX_E = _UxGT("Vμεγ E");
+ LSTR MSG_VMAX_EN = _UxGT("Vμεγ *");
+ LSTR MSG_VMIN = _UxGT("Vελαχ");
+ LSTR MSG_VTRAV_MIN = _UxGT("Vελάχ. μετατόπιση");
+ LSTR MSG_ACCELERATION = _UxGT("Accel");
+ LSTR MSG_AMAX_A = _UxGT("Aμεγ ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Aμεγ ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Aμεγ ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Aμεγ @");
+ LSTR MSG_AMAX_E = _UxGT("Aμεγ E");
+ LSTR MSG_AMAX_EN = _UxGT("Aμεγ *");
+ LSTR MSG_A_RETRACT = _UxGT("Α-ανάσυρση");
+ LSTR MSG_A_TRAVEL = _UxGT("Α-μετατόπιση");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Bήματα ανά μμ");
+ LSTR MSG_A_STEPS = _UxGT("Bήματα ") STR_A _UxGT(" ανά μμ");
+ LSTR MSG_B_STEPS = _UxGT("Bήματα ") STR_B _UxGT(" ανά μμ");
+ LSTR MSG_C_STEPS = _UxGT("Bήματα ") STR_C _UxGT(" ανά μμ");
+ LSTR MSG_N_STEPS = _UxGT("Bήματα @ ανά μμ");
+ LSTR MSG_E_STEPS = _UxGT("Bήματα Ε ανά μμ");
+ LSTR MSG_EN_STEPS = _UxGT("Bήματα * ανά μμ");
+ LSTR MSG_TEMPERATURE = _UxGT("Θερμοκρασία");
+ LSTR MSG_MOTION = _UxGT("Κίνηση");
+ LSTR MSG_FILAMENT = _UxGT("Νήμα");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("Ε σε μμ") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Διάμετρος νήματος");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Διάμετρος νήματος *");
+ LSTR MSG_CONTRAST = _UxGT("Κοντράστ LCD");
+ LSTR MSG_STORE_EEPROM = _UxGT("Αποθήκευση");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Φόρτωση");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Επαναφορά ασφαλούς αντιγράφου");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ανανέωση");
+ LSTR MSG_INFO_SCREEN = _UxGT("Οθόνη πληροφόρησης");
+ LSTR MSG_PREPARE = _UxGT("Προετοιμασία");
+ LSTR MSG_TUNE = _UxGT("Συντονισμός");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Παύση εκτύπωσης");
+ LSTR MSG_RESUME_PRINT = _UxGT("Συνέχιση εκτύπωσης");
+ LSTR MSG_STOP_PRINT = _UxGT("Διακοπή εκτύπωσης");
+ LSTR MSG_MEDIA_MENU = _UxGT("Εκτύπωση από SD");
+ LSTR MSG_NO_MEDIA = _UxGT("Δεν βρέθηκε SD");
+ LSTR MSG_DWELL = _UxGT("Αναστολή λειτουργίας…");
+ LSTR MSG_USERWAIT = _UxGT("Αναμονή για χρήστη…");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Διακόπτεται η εκτύπωση");
+ LSTR MSG_NO_MOVE = _UxGT("Καμία κίνηση.");
+ LSTR MSG_KILLED = _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. ");
+ LSTR MSG_STOPPED = _UxGT("ΔΙΑΚΟΠΗ. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Ανάσυρση μμ");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Εναλλαγή ανάσυρσης μμ");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Ανάσυρση V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Μεταπήδηση μμ");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V");
+ LSTR MSG_AUTORETRACT = _UxGT("Αυτόματη ανάσυρση");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Αλλαγή νήματος");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Αλλαγή νήματος *");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Προετοιμασία κάρτας SD");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Αλλαγή κάρτας SD");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Διερεύνηση Z εκτός κλίνης");
+ LSTR MSG_YX_UNHOMED = _UxGT("Επαναφορά Χ/Υ πριν από Ζ");
+ LSTR MSG_XYZ_UNHOMED = _UxGT("Επαναφορά ΧΥΖ πρώτα");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Μετατόπιση Ζ");
+ LSTR MSG_BABYSTEP_X = _UxGT("Μικρό βήμα Χ");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Μικρό βήμα Υ");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Μικρό βήμα Ζ");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Ματαίωση endstop ");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Ανεπιτυχής θέρμανση");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Λάθος: ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΤΗΤΑΣ");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ");
+ LSTR MSG_HEATING = _UxGT("Θερμαίνεται…");
+ LSTR MSG_BED_HEATING = _UxGT("Θέρμανση κλίνης…");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Βαθμονόμηση Delta");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Βαθμονόμηση X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Βαθμονόμηση Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Βαθμονόμηση Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Βαθμονόμηση κέντρου");
+
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Εσφαλμένος εκτυπωτής");
+}
diff --git a/src/lcd/language/language_en.h b/src/lcd/language/language_en.h
new file mode 100644
index 0000000..57cae3d
--- /dev/null
+++ b/src/lcd/language/language_en.h
@@ -0,0 +1,848 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * English
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ *
+ * Substitutions are applied for the following characters when used in menu items titles:
+ *
+ * $ displays an inserted string
+ * = displays '0'....'10' for indexes 0 - 10
+ * ~ displays '1'....'11' for indexes 0 - 10
+ * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL)
+ * @ displays an axis name such as XYZUVW, or E for an extruder
+ */
+
+#define en 1234
+#if LCD_LANGUAGE == en
+ #define NOT_EXTENDED_ISO10646_1_5X7
+#endif
+#undef en
+
+#define MEDIA_TYPE_EN "Media"
+
+namespace Language_en {
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("English");
+
+ // These strings should be translated
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Ready.");
+ LSTR MSG_YES = _UxGT("YES");
+ LSTR MSG_NO = _UxGT("NO");
+ LSTR MSG_HIGH = _UxGT("HIGH");
+ LSTR MSG_LOW = _UxGT("LOW");
+ LSTR MSG_BACK = _UxGT("Back");
+ LSTR MSG_ERROR = _UxGT("Error");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Aborting...");
+ LSTR MSG_MEDIA_INSERTED = MEDIA_TYPE_EN _UxGT(" Inserted");
+ LSTR MSG_MEDIA_REMOVED = MEDIA_TYPE_EN _UxGT(" Removed");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Waiting for ") MEDIA_TYPE_EN;
+ LSTR MSG_MEDIA_INIT_FAIL = MEDIA_TYPE_EN _UxGT(" Init Fail");
+ LSTR MSG_MEDIA_READ_ERROR = MEDIA_TYPE_EN _UxGT(" read error");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB device removed");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB start failed");
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall Overflow");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops");
+ LSTR MSG_MAIN = _UxGT("Main");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Advanced Settings");
+ LSTR MSG_TOOLBAR_SETUP = _UxGT("Toolbar Setup");
+ LSTR MSG_OPTION_DISABLED = _UxGT("Option Disabled");
+ LSTR MSG_CONFIGURATION = _UxGT("Configuration");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Run Auto Files");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Disable Steppers");
+ LSTR MSG_DEBUG_MENU = _UxGT("Debug Menu");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Progress Bar Test");
+ LSTR MSG_HOMING = _UxGT("Homing");
+ LSTR MSG_AUTO_HOME = _UxGT("Auto Home");
+ LSTR MSG_AUTO_HOME_A = _UxGT("Home @");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Home X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Home Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Home Z");
+ LSTR MSG_FILAMENT_SET = _UxGT("Filament Settings");
+ LSTR MSG_FILAMENT_MAN = _UxGT("Filament Management");
+ LSTR MSG_MANUAL_LEVELING = _UxGT("Manual Leveling");
+ LSTR MSG_LEVBED_FL = _UxGT("Front Left");
+ LSTR MSG_LEVBED_FR = _UxGT("Front Right");
+ LSTR MSG_LEVBED_C = _UxGT("Center");
+ LSTR MSG_LEVBED_BL = _UxGT("Back Left");
+ LSTR MSG_LEVBED_BR = _UxGT("Back Right");
+ LSTR MSG_MANUAL_MESH = _UxGT("Manual Mesh");
+ LSTR MSG_AUTO_MESH = _UxGT("Auto Build Mesh");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Align");
+ LSTR MSG_ITERATION = _UxGT("G34 Iteration: %i");
+ LSTR MSG_DECREASING_ACCURACY = _UxGT("Accuracy Decreasing!");
+ LSTR MSG_ACCURACY_ACHIEVED = _UxGT("Accuracy Achieved");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Homing XYZ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Click to Begin");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Next Point");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Leveling Done!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Fade Height");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Set Home Offsets");
+ LSTR MSG_HOME_OFFSET_X = _UxGT("Home Offset X");
+ LSTR MSG_HOME_OFFSET_Y = _UxGT("Home Offset Y");
+ LSTR MSG_HOME_OFFSET_Z = _UxGT("Home Offset Z");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets Applied");
+ LSTR MSG_TRAMMING_WIZARD = _UxGT("Tramming Wizard");
+ LSTR MSG_SELECT_ORIGIN = _UxGT("Select Origin");
+ LSTR MSG_LAST_VALUE_SP = _UxGT("Last value ");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Preheat ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Preheat ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" End ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" All");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Bed");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Preheat ") PREHEAT_1_LABEL _UxGT(" Conf");
+ #ifdef PREHEAT_2_LABEL
+ LSTR MSG_PREHEAT_2 = _UxGT("Preheat ") PREHEAT_2_LABEL;
+ LSTR MSG_PREHEAT_2_SETTINGS = _UxGT("Preheat ") PREHEAT_2_LABEL _UxGT(" Conf");
+ #endif
+ #ifdef PREHEAT_3_LABEL
+ LSTR MSG_PREHEAT_3 = _UxGT("Preheat ") PREHEAT_3_LABEL;
+ LSTR MSG_PREHEAT_3_SETTINGS = _UxGT("Preheat ") PREHEAT_3_LABEL _UxGT(" Conf");
+ #endif
+ LSTR MSG_PREHEAT_M = _UxGT("Preheat $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Preheat $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Preheat $ End");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Preheat $ End ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Preheat $ All");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preheat $ Bed");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preheat $ Conf");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Preheat Custom");
+ LSTR MSG_COOLDOWN = _UxGT("Cooldown");
+
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("Frequency");
+ LSTR MSG_LASER_MENU = _UxGT("Laser Control");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Spindle Control");
+ LSTR MSG_LASER_POWER = _UxGT("Laser Power");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Spindle Pwr");
+ LSTR MSG_LASER_TOGGLE = _UxGT("Toggle Laser");
+ LSTR MSG_LASER_EVAC_TOGGLE = _UxGT("Toggle Blower");
+ LSTR MSG_LASER_ASSIST_TOGGLE = _UxGT("Air Assist");
+ LSTR MSG_LASER_PULSE_MS = _UxGT("Test Pulse ms");
+ LSTR MSG_LASER_FIRE_PULSE = _UxGT("Fire Pulse");
+ LSTR MSG_FLOWMETER_FAULT = _UxGT("Coolant Flow Fault");
+ LSTR MSG_SPINDLE_TOGGLE = _UxGT("Toggle Spindle");
+ LSTR MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Toggle Vacuum");
+ LSTR MSG_SPINDLE_FORWARD = _UxGT("Spindle Forward");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Spindle Reverse");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Switch Power On");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Switch Power Off");
+ LSTR MSG_EXTRUDE = _UxGT("Extrude");
+ LSTR MSG_RETRACT = _UxGT("Retract");
+ LSTR MSG_MOVE_AXIS = _UxGT("Move Axis");
+ LSTR MSG_BED_LEVELING = _UxGT("Bed Leveling");
+ LSTR MSG_LEVEL_BED = _UxGT("Level Bed");
+ LSTR MSG_BED_TRAMMING = _UxGT("Bed Tramming");
+ LSTR MSG_BED_TRAMMING_MANUAL = _UxGT("Manual Tramming");
+ LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Adjust bed until the probe triggers.");
+ LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Corners within tolerance. Bed trammed.");
+ LSTR MSG_BED_TRAMMING_GOOD_POINTS = _UxGT("Good Points: ");
+ LSTR MSG_BED_TRAMMING_LAST_Z = _UxGT("Last Z: ");
+ LSTR MSG_NEXT_CORNER = _UxGT("Next Corner");
+ LSTR MSG_MESH_EDITOR = _UxGT("Mesh Editor");
+ LSTR MSG_MESH_VIEWER = _UxGT("Mesh Viewer");
+ LSTR MSG_EDIT_MESH = _UxGT("Edit Mesh");
+ LSTR MSG_MESH_VIEW = _UxGT("View Mesh");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Mesh Editing Stopped");
+ LSTR MSG_NO_VALID_MESH = _UxGT("No valid mesh");
+ LSTR MSG_ACTIVATE_MESH = _UxGT("Activate Leveling");
+ LSTR MSG_PROBING_POINT = _UxGT("Probing Point");
+ LSTR MSG_MESH_X = _UxGT("Index X");
+ LSTR MSG_MESH_Y = _UxGT("Index Y");
+ LSTR MSG_MESH_INSET = _UxGT("Mesh Inset");
+ LSTR MSG_MESH_MIN_X = _UxGT("Mesh X Minimum");
+ LSTR MSG_MESH_MAX_X = _UxGT("Mesh X Maximum");
+ LSTR MSG_MESH_MIN_Y = _UxGT("Mesh Y Minimum");
+ LSTR MSG_MESH_MAX_Y = _UxGT("Mesh Y Maximum");
+ LSTR MSG_MESH_AMAX = _UxGT("Maximize Area");
+ LSTR MSG_MESH_CENTER = _UxGT("Center Area");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Z Value");
+ LSTR MSG_MESH_CANCEL = _UxGT("Mesh cancelled");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Custom Commands");
+ LSTR MSG_M48_TEST = _UxGT("M48 Probe Test");
+ LSTR MSG_M48_POINT = _UxGT("M48 Point");
+ LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Probe out of bounds");
+ LSTR MSG_M48_DEVIATION = _UxGT("Deviation");
+ LSTR MSG_IDEX_MENU = _UxGT("IDEX Mode");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Tool Offsets");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplication");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Mirrored Copy");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Full Control");
+ LSTR MSG_IDEX_DUPE_GAP = _UxGT("Duplicate X-Gap");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2nd Nozzle Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2nd Nozzle @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Doing G29");
+ LSTR MSG_UBL_TOOLS = _UxGT("UBL Tools");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Tilting Point");
+ LSTR MSG_UBL_TILT_MESH = _UxGT("Tilt Mesh");
+ LSTR MSG_UBL_TILTING_GRID = _UxGT("Tilting Grid Size");
+ LSTR MSG_UBL_MESH_TILTED = _UxGT("Mesh Tilted");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Manually Build Mesh");
+ LSTR MSG_UBL_MESH_WIZARD = _UxGT("UBL Mesh Wizard");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Place Shim & Measure");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Measure");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Remove & Measure Bed");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Moving to next");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Activate UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Deactivate UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Bed Temp");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Hotend Temp");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Mesh Edit");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit Custom Mesh");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Fine Tuning Mesh");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Done Editing Mesh");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Build Custom Mesh");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Build Mesh");
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Build Mesh ($)");
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Build Cold Mesh");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Adjust Mesh Height");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Height Amount");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validate Mesh");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Validate Mesh ($)");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validate Custom Mesh");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 Heating Bed");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 Heating Nozzle");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Manual priming...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Fixed Length Prime");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Done Priming");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 Canceled");
+ LSTR MSG_G26_LEAVING = _UxGT("Leaving G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Continue Bed Mesh");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Mesh Leveling");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Point Leveling");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Grid Mesh Leveling");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Level Mesh");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Side Points");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Map Type");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Output Mesh Map");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Output for Host");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Output for CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Off Printer Backup");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Output UBL Info");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Fill-in Amount");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Manual Fill-in");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Smart Fill-in");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Fill-in Mesh");
+ LSTR MSG_UBL_MESH_FILLED = _UxGT("Missing Points Filled");
+ LSTR MSG_UBL_MESH_INVALID = _UxGT("Invalid Mesh");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidate All");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidate Closest");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Fine Tune All");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Fine Tune Closest");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Storage");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Memory Slot");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Load Bed Mesh");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Save Bed Mesh");
+ LSTR MSG_UBL_INVALID_SLOT = _UxGT("First Select a Mesh Slot");
+ LSTR MSG_MESH_LOADED = _UxGT("Mesh %i Loaded");
+ LSTR MSG_MESH_SAVED = _UxGT("Mesh %i Saved");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("No Storage");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Err: UBL Save");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Err: UBL Restore");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Stopped");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Step-By-Step UBL");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Build Cold Mesh");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2. Smart Fill-in");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Validate Mesh");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Fine Tune All");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Validate Mesh");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Fine Tune All");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7. Save Bed Mesh");
+
+ LSTR MSG_LED_CONTROL = _UxGT("LED Control");
+ LSTR MSG_LEDS = _UxGT("Lights");
+ LSTR MSG_LED_PRESETS = _UxGT("Light Presets");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Red");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Orange");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Yellow");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Green");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Blue");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Indigo");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Violet");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("White");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Default");
+ LSTR MSG_LED_CHANNEL_N = _UxGT("Channel =");
+ LSTR MSG_LEDS2 = _UxGT("Lights #2");
+ LSTR MSG_NEO2_PRESETS = _UxGT("Light #2 Presets");
+ LSTR MSG_NEO2_BRIGHTNESS = _UxGT("Brightness");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Custom Lights");
+ LSTR MSG_INTENSITY_R = _UxGT("Red Intensity");
+ LSTR MSG_INTENSITY_G = _UxGT("Green Intensity");
+ LSTR MSG_INTENSITY_B = _UxGT("Blue Intensity");
+ LSTR MSG_INTENSITY_W = _UxGT("White Intensity");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Brightness");
+
+ LSTR MSG_MOVING = _UxGT("Moving...");
+ LSTR MSG_FREE_XY = _UxGT("Free XY");
+ LSTR MSG_MOVE_X = _UxGT("Move X"); // Used by draw_edit_screen
+ LSTR MSG_MOVE_Y = _UxGT("Move Y");
+ LSTR MSG_MOVE_Z = _UxGT("Move Z");
+ LSTR MSG_MOVE_N = _UxGT("Move @");
+ LSTR MSG_MOVE_E = _UxGT("Move Extruder");
+ LSTR MSG_MOVE_EN = _UxGT("Move *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Hotend too cold");
+ LSTR MSG_MOVE_N_MM = _UxGT("Move $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Move 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Move 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Move 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Move 100mm");
+ LSTR MSG_MOVE_0001IN = _UxGT("Move 0.001in");
+ LSTR MSG_MOVE_001IN = _UxGT("Move 0.01in");
+ LSTR MSG_MOVE_01IN = _UxGT("Move 0.1in");
+ LSTR MSG_MOVE_1IN = _UxGT("Move 1.0in");
+ LSTR MSG_SPEED = _UxGT("Speed");
+ LSTR MSG_BED_Z = _UxGT("Bed Z");
+ LSTR MSG_NOZZLE = _UxGT("Nozzle");
+ LSTR MSG_NOZZLE_N = _UxGT("Nozzle ~");
+ LSTR MSG_NOZZLE_PARKED = _UxGT("Nozzle Parked");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Nozzle Standby");
+ LSTR MSG_BED = _UxGT("Bed");
+ LSTR MSG_CHAMBER = _UxGT("Enclosure");
+ LSTR MSG_COOLER = _UxGT("Laser Coolant");
+ LSTR MSG_COOLER_TOGGLE = _UxGT("Toggle Cooler");
+ LSTR MSG_FLOWMETER_SAFETY = _UxGT("Flow Safety");
+ LSTR MSG_LASER = _UxGT("Laser");
+ LSTR MSG_FAN_SPEED = _UxGT("Fan Speed");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Fan Speed ~");
+ LSTR MSG_STORED_FAN_N = _UxGT("Stored Fan ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Extra Fan Speed");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra Fan Speed ~");
+ LSTR MSG_CONTROLLER_FAN = _UxGT("Controller Fan");
+ LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Idle Speed");
+ LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Auto Mode");
+ LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("Active Speed");
+ LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("Idle Period");
+ LSTR MSG_FLOW = _UxGT("Flow");
+ LSTR MSG_FLOW_N = _UxGT("Flow ~");
+ LSTR MSG_CONTROL = _UxGT("Control");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact");
+ LSTR MSG_AUTOTEMP = _UxGT("Autotemp");
+ LSTR MSG_LCD_ON = _UxGT("On");
+ LSTR MSG_LCD_OFF = _UxGT("Off");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("PID Autotune");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *");
+ LSTR MSG_PID_CYCLE = _UxGT("PID Cycles");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("PID tuning done");
+ LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("PID Autotune failed!");
+ LSTR MSG_BAD_EXTRUDER_NUM = _UxGT("Bad extruder.");
+ LSTR MSG_TEMP_TOO_HIGH = _UxGT("Temperature too high.");
+ LSTR MSG_TIMEOUT = _UxGT("Timeout.");
+ LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune failed! Bad extruder.");
+ LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed! Temperature too high.");
+ LSTR MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout.");
+ LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Testing heat loss");
+ LSTR MSG_MPC_AUTOTUNE = _UxGT("MPC Autotune");
+ LSTR MSG_MPC_EDIT = _UxGT("Edit * MPC");
+ LSTR MSG_MPC_POWER_E = _UxGT("Power *");
+ LSTR MSG_MPC_BLOCK_HEAT_CAPACITY_E = _UxGT("Block C *");
+ LSTR MSG_SENSOR_RESPONSIVENESS_E = _UxGT("Sensor res *");
+ LSTR MSG_MPC_AMBIENT_XFER_COEFF_E = _UxGT("Ambient h *");
+ LSTR MSG_MPC_AMBIENT_XFER_COEFF_FAN_E = _UxGT("Amb. h fan *");
+ LSTR MSG_SELECT = _UxGT("Select");
+ LSTR MSG_SELECT_E = _UxGT("Select *");
+ LSTR MSG_ACC = _UxGT("Accel");
+ LSTR MSG_JERK = _UxGT("Jerk");
+ LSTR MSG_VA_JERK = _UxGT("Max ") STR_A _UxGT(" Jerk");
+ LSTR MSG_VB_JERK = _UxGT("Max ") STR_B _UxGT(" Jerk");
+ LSTR MSG_VC_JERK = _UxGT("Max ") STR_C _UxGT(" Jerk");
+ LSTR MSG_VN_JERK = _UxGT("Max @ Jerk");
+ LSTR MSG_VE_JERK = _UxGT("Max E Jerk");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev");
+ LSTR MSG_MAX_SPEED = _UxGT("Max Speed (mm/s)");
+ LSTR MSG_VMAX_A = _UxGT("Max ") STR_A _UxGT(" Speed");
+ LSTR MSG_VMAX_B = _UxGT("Max ") STR_B _UxGT(" Speed");
+ LSTR MSG_VMAX_C = _UxGT("Max ") STR_C _UxGT(" Speed");
+ LSTR MSG_VMAX_N = _UxGT("Max @ Speed");
+ LSTR MSG_VMAX_E = _UxGT("Max E Speed");
+ LSTR MSG_VMAX_EN = _UxGT("Max * Speed");
+ LSTR MSG_VMIN = _UxGT("Min Velocity");
+ LSTR MSG_VTRAV_MIN = _UxGT("Min Travel Speed");
+ LSTR MSG_ACCELERATION = _UxGT("Acceleration");
+ LSTR MSG_AMAX_A = _UxGT("Max ") STR_A _UxGT(" Accel");
+ LSTR MSG_AMAX_B = _UxGT("Max ") STR_B _UxGT(" Accel");
+ LSTR MSG_AMAX_C = _UxGT("Max ") STR_C _UxGT(" Accel");
+ LSTR MSG_AMAX_N = _UxGT("Max @ Accel");
+ LSTR MSG_AMAX_E = _UxGT("Max E Accel");
+ LSTR MSG_AMAX_EN = _UxGT("Max * Accel");
+ LSTR MSG_A_RETRACT = _UxGT("Retract Accel");
+ LSTR MSG_A_TRAVEL = _UxGT("Travel Accel");
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("XY Freq Limit");
+ LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Min FR Factor");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Steps/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" Steps/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" Steps/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" Steps/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ steps/mm");
+ LSTR MSG_E_STEPS = _UxGT("E steps/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* Steps/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperature");
+ LSTR MSG_MOTION = _UxGT("Motion");
+ LSTR MSG_FILAMENT = _UxGT("Filament");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *");
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Fil. Dia.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Unload mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Load mm");
+ LSTR MSG_ADVANCE_K = _UxGT("Advance K");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *");
+ LSTR MSG_CONTRAST = _UxGT("LCD Contrast");
+ LSTR MSG_BRIGHTNESS = _UxGT("LCD Brightness");
+ LSTR MSG_LCD_TIMEOUT_SEC = _UxGT("LCD Timeout (s)");
+ LSTR MSG_SCREEN_TIMEOUT = _UxGT("LCD Timeout (m)");
+ LSTR MSG_BRIGHTNESS_OFF = _UxGT("Backlight Off");
+ LSTR MSG_STORE_EEPROM = _UxGT("Store Settings");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Load Settings");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Restore Defaults");
+ LSTR MSG_INIT_EEPROM = _UxGT("Initialize EEPROM");
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Error");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Error");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Error");
+ LSTR MSG_SETTINGS_STORED = _UxGT("Settings Stored");
+ LSTR MSG_MEDIA_UPDATE = MEDIA_TYPE_EN _UxGT(" Update");
+ LSTR MSG_RESET_PRINTER = _UxGT("Reset Printer");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Refresh");
+ LSTR MSG_INFO_SCREEN = _UxGT("Info Screen");
+ LSTR MSG_INFO_MACHINENAME = _UxGT("Machine Name");
+ LSTR MSG_INFO_SIZE = _UxGT("Size");
+ LSTR MSG_INFO_FWVERSION = _UxGT("Firmware Version");
+ LSTR MSG_INFO_BUILD = _UxGT("Build Datetime");
+ LSTR MSG_PREPARE = _UxGT("Prepare");
+ LSTR MSG_TUNE = _UxGT("Tune");
+ LSTR MSG_POWER_MONITOR = _UxGT("Power monitor");
+ LSTR MSG_CURRENT = _UxGT("Current");
+ LSTR MSG_VOLTAGE = _UxGT("Voltage");
+ LSTR MSG_POWER = _UxGT("Power");
+ LSTR MSG_START_PRINT = _UxGT("Start Print");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Next");
+ LSTR MSG_BUTTON_INIT = _UxGT("Init");
+ LSTR MSG_BUTTON_STOP = _UxGT("Stop");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Print");
+ LSTR MSG_BUTTON_RESET = _UxGT("Reset");
+ LSTR MSG_BUTTON_IGNORE = _UxGT("Ignore");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Cancel");
+ LSTR MSG_BUTTON_CONFIRM = _UxGT("Confirm");
+ LSTR MSG_BUTTON_CONTINUE = _UxGT("Continue");
+ LSTR MSG_BUTTON_DONE = _UxGT("Done");
+ LSTR MSG_BUTTON_BACK = _UxGT("Back");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Proceed");
+ LSTR MSG_BUTTON_SKIP = _UxGT("Skip");
+ LSTR MSG_BUTTON_INFO = _UxGT("Info");
+ LSTR MSG_BUTTON_LEVEL = _UxGT("Level");
+ LSTR MSG_BUTTON_PAUSE = _UxGT("Pause");
+ LSTR MSG_BUTTON_RESUME = _UxGT("Resume");
+ LSTR MSG_BUTTON_ADVANCED = _UxGT("Advanced");
+ LSTR MSG_BUTTON_SAVE = _UxGT("Save");
+ LSTR MSG_BUTTON_PURGE = _UxGT("Purge");
+ LSTR MSG_PAUSING = _UxGT("Pausing...");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pause Print");
+ LSTR MSG_ADVANCED_PAUSE = _UxGT("Advanced Pause");
+ LSTR MSG_RESUME_PRINT = _UxGT("Resume Print");
+ LSTR MSG_HOST_START_PRINT = _UxGT("Start Host Print");
+ LSTR MSG_STOP_PRINT = _UxGT("Stop Print");
+ LSTR MSG_END_LOOPS = _UxGT("End Repeat Loops");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Printing Object");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Cancel Object");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Cancel Object =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Power Outage");
+ LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Continue Print Job");
+ LSTR MSG_MEDIA_MENU = _UxGT("Print from ") MEDIA_TYPE_EN;
+ LSTR MSG_NO_MEDIA = _UxGT("No ") MEDIA_TYPE_EN;
+ LSTR MSG_DWELL = _UxGT("Sleep...");
+ LSTR MSG_USERWAIT = _UxGT("Click to Resume...");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Print Paused");
+ LSTR MSG_PRINTING = _UxGT("Printing...");
+ LSTR MSG_STOPPING = _UxGT("Stopping...");
+ LSTR MSG_REMAINING_TIME = _UxGT("Remaining");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Print Aborted");
+ LSTR MSG_PRINT_DONE = _UxGT("Print Done");
+ LSTR MSG_PRINTER_KILLED = _UxGT("Printer killed!");
+ LSTR MSG_TURN_OFF = _UxGT("Turn off the printer");
+ LSTR MSG_NO_MOVE = _UxGT("No Move.");
+ LSTR MSG_KILLED = _UxGT("KILLED. ");
+ LSTR MSG_STOPPED = _UxGT("STOPPED. ");
+ LSTR MSG_FWRETRACT = _UxGT("Firmware Retract");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Retract mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Retract V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V");
+ LSTR MSG_AUTORETRACT = _UxGT("Auto-Retract");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Swap Length");
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Swap Extra");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Purge Length");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Tool Change");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Raise");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Prime Speed");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Retract Speed");
+ LSTR MSG_FILAMENT_PARK_ENABLED = _UxGT("Park Head");
+ LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Recover Speed");
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Fan Speed");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Fan Time");
+ LSTR MSG_TOOL_MIGRATION_ON = _UxGT("Auto ON");
+ LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF");
+ LSTR MSG_TOOL_MIGRATION = _UxGT("Tool Migration");
+ LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-migration");
+ LSTR MSG_TOOL_MIGRATION_END = _UxGT("Last Extruder");
+ LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrate to *");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Change Filament");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Change Filament *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Load Filament");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Load *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Unload Filament");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Unload *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Unload All");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Attach ") MEDIA_TYPE_EN;
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Change ") MEDIA_TYPE_EN;
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Release ") MEDIA_TYPE_EN;
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z Probe Past Bed");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Skew Factor");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Self-Test");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Reset");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Stow");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Deploy");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("SW-Mode");
+ LSTR MSG_BLTOUCH_SPEED_MODE = _UxGT("High Speed");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mode");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mode");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Set BLTouch to 5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Set BLTouch to OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Report Drain");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("DANGER: Bad settings can cause damage! Proceed anyway?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Init TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Test");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Save");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Deploy TouchMI");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Deploy Z-Probe");
+ LSTR MSG_MANUAL_STOW = _UxGT("Stow Z-Probe");
+ LSTR MSG_HOME_FIRST = _UxGT("Home %s%s%s First");
+ LSTR MSG_ZPROBE_SETTINGS = _UxGT("Probe Settings");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Probe Offsets");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("Probe X Offset");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Probe Y Offset");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Probe Z Offset");
+ LSTR MSG_ZPROBE_MARGIN = _UxGT("Probe Margin");
+ LSTR MSG_Z_FEED_RATE = _UxGT("Z Feed Rate");
+ LSTR MSG_ENABLE_HS_MODE = _UxGT("Enable HS mode");
+ LSTR MSG_MOVE_NOZZLE_TO_BED = _UxGT("Move Nozzle to Bed");
+ LSTR MSG_BABYSTEP_X = _UxGT("Babystep X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Babystep Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Babystep Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Babystep @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Total");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Endstop Abort");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Heating Failed");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: REDUNDANT TEMP");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY");
+ LSTR MSG_TEMP_MALFUNCTION = _UxGT("TEMP MALFUNCTION");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("BED THERMAL RUNAWAY");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("CHAMBER T. RUNAWAY");
+ LSTR MSG_THERMAL_RUNAWAY_COOLER = _UxGT("Cooler Runaway");
+ LSTR MSG_COOLING_FAILED = _UxGT("Cooling Failed");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Err: MAXTEMP");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Err: MINTEMP");
+ LSTR MSG_HALTED = _UxGT("PRINTER HALTED");
+ LSTR MSG_PLEASE_WAIT = _UxGT("Please wait...");
+ LSTR MSG_PLEASE_RESET = _UxGT("Please Reset");
+ LSTR MSG_PREHEATING = _UxGT("Preheating...");
+ LSTR MSG_HEATING = _UxGT("Heating...");
+ LSTR MSG_COOLING = _UxGT("Cooling...");
+ LSTR MSG_BED_HEATING = _UxGT("Bed Heating...");
+ LSTR MSG_BED_COOLING = _UxGT("Bed Cooling...");
+ LSTR MSG_PROBE_HEATING = _UxGT("Probe Heating...");
+ LSTR MSG_PROBE_COOLING = _UxGT("Probe Cooling...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Chamber Heating...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Chamber Cooling...");
+ LSTR MSG_LASER_COOLING = _UxGT("Laser Cooling...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta Calibration");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Calibrate X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrate Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrate Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrate Center");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Delta Settings");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibration");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Diag Rod");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Height");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Radius");
+ LSTR MSG_INFO_MENU = _UxGT("About Printer");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Printer Info");
+ LSTR MSG_3POINT_LEVELING = _UxGT("3-Point Leveling");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Linear Leveling");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Bilinear Leveling");
+ LSTR MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling");
+ LSTR MSG_MESH_LEVELING = _UxGT("Mesh Leveling");
+ LSTR MSG_MESH_DONE = _UxGT("Mesh probing done");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Printer Stats");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Board Info");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistors");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extruders");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Baud");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protocol");
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Runaway Watch: OFF");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Runaway Watch: ON");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend Idle Timeout");
+ LSTR MSG_FAN_SPEED_FAULT = _UxGT("Fan speed fault");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Case Light");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Light Brightness");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("INCORRECT PRINTER");
+
+ LSTR MSG_COLORS_GET = _UxGT("Get Color");
+ LSTR MSG_COLORS_SELECT = _UxGT("Select Colors");
+ LSTR MSG_COLORS_APPLIED = _UxGT("Colors applied");
+ LSTR MSG_COLORS_RED = _UxGT("Red");
+ LSTR MSG_COLORS_GREEN = _UxGT("Green");
+ LSTR MSG_COLORS_BLUE = _UxGT("Blue");
+ LSTR MSG_COLORS_WHITE = _UxGT("White");
+ LSTR MSG_UI_LANGUAGE = _UxGT("UI Language");
+ LSTR MSG_SOUND_ENABLE = _UxGT("Enable sound");
+ LSTR MSG_LOCKSCREEN = _UxGT("Lock Screen");
+ LSTR MSG_LOCKSCREEN_LOCKED = _UxGT("Printer is Locked,");
+ LSTR MSG_LOCKSCREEN_UNLOCK = _UxGT("Scroll to unlock.");
+ LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Please wait until reboot.");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("No media inserted.");
+ LSTR MSG_PLEASE_PREHEAT = _UxGT("Please preheat the hot end.");
+ LSTR MSG_INFO_PRINT_COUNT_RESET = _UxGT("Reset Print Count");
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Print Count");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Print Time");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Longest Job Time");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded Total");
+ #else
+ LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("No Media");
+ LSTR MSG_PLEASE_PREHEAT = _UxGT("Please Preheat");
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Prints");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Total");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Longest");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded");
+ #endif
+
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Completed");
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Min Temp");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Max Temp");
+ LSTR MSG_INFO_PSU = _UxGT("PSU");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Drive Strength");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Driver %");
+ LSTR MSG_ERROR_TMC = _UxGT("TMC CONNECTION ERROR");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Write");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMENT CHANGE");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("PRINT PAUSED");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("LOAD FILAMENT");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("UNLOAD FILAMENT");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("RESUME OPTIONS:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purge more");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continue");
+ LSTR MSG_FILAMENT_CHANGE_PURGE_CONTINUE = _UxGT("Purge or Continue?");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozzle: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Runout Sensor");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout Dist mm");
+ LSTR MSG_RUNOUT_ENABLE = _UxGT("Enable Runout");
+ LSTR MSG_RUNOUT_ACTIVE = _UxGT("Runout Active");
+ LSTR MSG_INVERT_EXTRUDER = _UxGT("Invert Extruder");
+ LSTR MSG_EXTRUDER_MIN_TEMP = _UxGT("Extruder Min Temp.");
+ LSTR MSG_FANCHECK = _UxGT("Fan Tacho Check");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Homing Failed");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Probing Failed");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOOSE FILAMENT");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("Update MMU Firmware!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Needs Attention.");
+ LSTR MSG_MMU2_RESUME = _UxGT("MMU Resume");
+ LSTR MSG_MMU2_RESUMING = _UxGT("MMU Resuming...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU Load");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("MMU Load All");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Load to Nozzle");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU Eject");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU Eject ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU Unload");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Loading Fil. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejecting Fil. ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Unloading Fil....");
+ LSTR MSG_MMU2_ALL = _UxGT("All");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filament ~");
+ LSTR MSG_MMU2_RESET = _UxGT("Reset MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("MMU Resetting...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Remove, click");
+
+ LSTR MSG_MIX = _UxGT("Mix");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Component =");
+ LSTR MSG_MIXER = _UxGT("Mixer");
+ LSTR MSG_GRADIENT = _UxGT("Gradient");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Full Gradient");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Toggle Mix");
+ LSTR MSG_CYCLE_MIX = _UxGT("Cycle Mix");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Gradient Mix");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Reverse Gradient");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Active V-tool");
+ LSTR MSG_START_VTOOL = _UxGT("Start V-tool");
+ LSTR MSG_END_VTOOL = _UxGT(" End V-tool");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Reset V-tools");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Commit V-tool Mix");
+ LSTR MSG_VTOOLS_RESET = _UxGT("V-tools Were Reset");
+ LSTR MSG_START_Z = _UxGT("Start Z:");
+ LSTR MSG_END_Z = _UxGT(" End Z:");
+
+ LSTR MSG_GAMES = _UxGT("Games");
+ LSTR MSG_BRICKOUT = _UxGT("Brickout");
+ LSTR MSG_INVADERS = _UxGT("Invaders");
+ LSTR MSG_SNAKE = _UxGT("Sn4k3");
+ LSTR MSG_MAZE = _UxGT("Maze");
+
+ LSTR MSG_BAD_PAGE = _UxGT("Bad page index");
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("Bad page speed");
+
+ LSTR MSG_EDIT_PASSWORD = _UxGT("Edit Password");
+ LSTR MSG_LOGIN_REQUIRED = _UxGT("Login Required");
+ LSTR MSG_PASSWORD_SETTINGS = _UxGT("Password Settings");
+ LSTR MSG_ENTER_DIGIT = _UxGT("Enter Digit");
+ LSTR MSG_CHANGE_PASSWORD = _UxGT("Set/Edit Password");
+ LSTR MSG_REMOVE_PASSWORD = _UxGT("Remove Password");
+ LSTR MSG_PASSWORD_SET = _UxGT("Password is ");
+ LSTR MSG_START_OVER = _UxGT("Start Over");
+ LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Remember to Save!");
+ LSTR MSG_PASSWORD_REMOVED = _UxGT("Password Removed");
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Press Button", "to resume print"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parking..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Wait for", "filament change", "to start"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Insert filament", "and press button", "to continue"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Press button", "to heat nozzle"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozzle heating", "Please wait..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Wait for", "filament unload"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Wait for", "filament load"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Wait for", "filament purge"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Click to finish", "filament purge"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Wait for print", "to resume..."));
+ #else
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Click to continue"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parking..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Please wait..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insert and Click"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Click to heat"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Heating..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Ejecting..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Loading..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purging..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Click to finish"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Resuming..."));
+ #endif
+ LSTR MSG_TMC_DRIVERS = _UxGT("TMC Drivers");
+ LSTR MSG_TMC_CURRENT = _UxGT("Driver Current");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled");
+ LSTR MSG_SERVICE_RESET = _UxGT("Reset");
+ LSTR MSG_SERVICE_IN = _UxGT(" in:");
+ LSTR MSG_BACKLASH = _UxGT("Backlash");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Correction");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("Level X Axis");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrate");
+ #if ENABLED(TOUCH_UI_FTDI_EVE)
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Idle timeout, temperature decreased. Press Okay to reheat and again to resume.");
+ #else
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Heater Timeout");
+ #endif
+ LSTR MSG_REHEAT = _UxGT("Reheat");
+ LSTR MSG_REHEATING = _UxGT("Reheating...");
+ LSTR MSG_REHEATDONE = _UxGT("Reheat Done");
+
+ LSTR MSG_PROBE_WIZARD = _UxGT("Z Probe Wizard");
+ LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Probing Z Reference");
+ LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Moving to Probing Pos");
+
+ LSTR MSG_XATC = _UxGT("X-Twist Wizard");
+ LSTR MSG_XATC_DONE = _UxGT("X-Twist Wizard Done!");
+ LSTR MSG_XATC_UPDATE_Z_OFFSET = _UxGT("Update Probe Z-Offset to ");
+
+ LSTR MSG_SOUND = _UxGT("Sound");
+
+ LSTR MSG_TOP_LEFT = _UxGT("Top Left");
+ LSTR MSG_BOTTOM_LEFT = _UxGT("Bottom Left");
+ LSTR MSG_TOP_RIGHT = _UxGT("Top Right");
+ LSTR MSG_BOTTOM_RIGHT = _UxGT("Bottom Right");
+ LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Calibration Completed");
+ LSTR MSG_CALIBRATION_FAILED = _UxGT("Calibration Failed");
+
+ LSTR MSG_DRIVER_BACKWARD = _UxGT(" driver backward");
+
+ LSTR MSG_SD_CARD = _UxGT("SD Card");
+ LSTR MSG_USB_DISK = _UxGT("USB Disk");
+
+ LSTR MSG_HOST_SHUTDOWN = _UxGT("Host Shutdown");
+
+ // These strings can be the same in all languages
+ LSTR MSG_MARLIN = _UxGT("Marlin");
+ LSTR MSG_SHORT_DAY = _UxGT("d"); // One character only
+ LSTR MSG_SHORT_HOUR = _UxGT("h"); // One character only
+ LSTR MSG_SHORT_MINUTE = _UxGT("m"); // One character only
+ LSTR MSG_PID_P = _UxGT("PID-P");
+ LSTR MSG_PID_P_E = _UxGT("PID-P *");
+ LSTR MSG_PID_I = _UxGT("PID-I");
+ LSTR MSG_PID_I_E = _UxGT("PID-I *");
+ LSTR MSG_PID_D = _UxGT("PID-D");
+ LSTR MSG_PID_D_E = _UxGT("PID-D *");
+ LSTR MSG_PID_C = _UxGT("PID-C");
+ LSTR MSG_PID_C_E = _UxGT("PID-C *");
+ LSTR MSG_PID_F = _UxGT("PID-F");
+ LSTR MSG_PID_F_E = _UxGT("PID-F *");
+ LSTR MSG_BACKLASH_N = _UxGT("@");
+}
+
+#if FAN_COUNT == 1
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED
+#else
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N
+#endif
diff --git a/src/lcd/language/language_es.h b/src/lcd/language/language_es.h
new file mode 100644
index 0000000..5f88f84
--- /dev/null
+++ b/src/lcd/language/language_es.h
@@ -0,0 +1,579 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Spanish
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+namespace Language_es {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Spanish");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Lista");
+ LSTR MSG_YES = _UxGT("SI");
+ LSTR MSG_NO = _UxGT("NO");
+ LSTR MSG_BACK = _UxGT("Atrás");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Cancelando...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("SD/FD insertado");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("SD/FD retirado");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Esperando al SD/FD");
+ LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Fallo al iniciar SD/FD");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Error lectura SD/FD");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Disp. USB retirado");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("Inicio USB fallido");
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Desbordamiento de subllamada");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops");
+ LSTR MSG_MAIN = _UxGT("Menú principal");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Ajustes avanzados");
+ LSTR MSG_CONFIGURATION = _UxGT("Configuración");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Inicio automático");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Apagar motores");
+ LSTR MSG_DEBUG_MENU = _UxGT("Menú depuración");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Prob. barra progreso");
+ LSTR MSG_HOMING = _UxGT("Origen");
+ LSTR MSG_AUTO_HOME = _UxGT("Llevar al origen");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Origen X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Origen Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Origen Z");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Auto alineado Z");
+ LSTR MSG_ITERATION = _UxGT("G34 Iteración: %i");
+ LSTR MSG_DECREASING_ACCURACY = _UxGT("¡Precisión disminuyendo!");
+ LSTR MSG_ACCURACY_ACHIEVED = _UxGT("Precisión conseguida");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Origen XYZ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Pulsar para comenzar");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Siguiente punto");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("¡Nivelación lista!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Compen. Altura");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Ajustar desfases");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfase aplicada");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Precal. ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Precal. ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Fusor ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Todo");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Cama");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Precal. ") PREHEAT_1_LABEL _UxGT(" Ajuste");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Precal. $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Precal. $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Precal. $ Fusor");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Precal. $ Fusor ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Precal. $ Todo");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Precal. $ Cama");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Precal. $ Ajuste");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Precal. manual");
+ LSTR MSG_COOLDOWN = _UxGT("Enfriar");
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("Frecuencia");
+ LSTR MSG_LASER_MENU = _UxGT("Control Láser");
+ LSTR MSG_LASER_POWER = _UxGT("Potencia Láser");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Control Mandrino");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Potencia Mandrino");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Invertir giro");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Encender Fuente");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Apagar Fuente");
+ LSTR MSG_EXTRUDE = _UxGT("Extruir");
+ LSTR MSG_RETRACT = _UxGT("Retraer");
+ LSTR MSG_MOVE_AXIS = _UxGT("Mover ejes");
+ LSTR MSG_BED_LEVELING = _UxGT("Nivelando Cama");
+ LSTR MSG_LEVEL_BED = _UxGT("Nivelar Cama");
+ LSTR MSG_BED_TRAMMING = _UxGT("Recorrido Cama");
+ LSTR MSG_NEXT_CORNER = _UxGT("Siguente Esquina");
+ LSTR MSG_MESH_EDITOR = _UxGT("Editor Mallado");
+ LSTR MSG_EDIT_MESH = _UxGT("Editar Mallado");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Ed. Mallado parada");
+ LSTR MSG_PROBING_POINT = _UxGT("Sondear Punto");
+ LSTR MSG_MESH_X = _UxGT("Índice X");
+ LSTR MSG_MESH_Y = _UxGT("Índice Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Valor Z");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Com. Personalizados");
+ LSTR MSG_M48_TEST = _UxGT("M48 Probar Sonda");
+ LSTR MSG_M48_POINT = _UxGT("M48 Punto");
+ LSTR MSG_M48_DEVIATION = _UxGT("Desviación");
+ LSTR MSG_IDEX_MENU = _UxGT("Modo IDEX");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Desfase Herramienta");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Aparcado");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicar");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia Reflejada");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Control Total");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2ª Fusor Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2ª Fusor @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Hacer G29");
+ LSTR MSG_UBL_TOOLS = _UxGT("Herramientas UBL");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Nivelado UBL");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Punto de inclinación");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Crear Mallado man.");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Colocar cuña y Medir");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Medir");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Retirar y Medir Cama");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Mover al Siguente");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Activar UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Desactivar UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Cama");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp. Cama perso.");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Fusor");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp. Fusor perso.");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Editar Mallado");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit. Mallado perso.");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Ajuste fino Mallado");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Term. edici. Mallado");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crear Mallado Pers.");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Crear Mallado");
+ #if HAS_PREHEAT
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Crear Mallado ($)");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Valid. Mall. ($)");
+ #endif
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Crear Mallado Frío");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ajustar alt. Mallado");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Cantidad de altura");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Valid. Mallado");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valid. Mall. perso.");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 Calentando Cama");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 Calent. Boquilla");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Imprimado manual...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Impri. longit. fija");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Imprimación Lista");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 Cancelado");
+ LSTR MSG_G26_LEAVING = _UxGT("Dejando G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Contin. Mallado cama");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Nivelando Mallado");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Nivelando 3Puntos");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Niv. Mall. cuadri");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Nivel de Mallado");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Puntos Laterales");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Tipo de mapa ");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Salida Mapa mallado");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Salida para el host");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Salida para CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Cópia de seg. ext");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Salida Info. UBL");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Cantidad de relleno");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Relleno manual");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Relleno inteligente");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Mallado de relleno");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidar todo");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidar proximos");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Ajustar Fino Todo");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ajustar Fino proxi.");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Almacen de Mallado");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Huecos memoria");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Cargar Mall. cama");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Guardar Mall. cama");
+ LSTR MSG_MESH_LOADED = _UxGT("Malla %i Cargada");
+ LSTR MSG_MESH_SAVED = _UxGT("Malla %i Guardada");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Sin guardar");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Error: Guardar UBL");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Error: Restaurar UBL");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Desfase de Z: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Desfase de Z Parado");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Paso a Paso");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Crear Mall. Frío");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2.Relleno intelig.");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Valid. Mallado");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ajustar Fino Todo");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Valid. Mallado");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ajustar Fino Todo");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7.Guardar Mall. cama");
+
+ LSTR MSG_LED_CONTROL = _UxGT("Control LED");
+ LSTR MSG_LEDS = _UxGT("LEDS");
+ LSTR MSG_LED_PRESETS = _UxGT("Color predefinido");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Rojo");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Naranja");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Amarillo");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Verde");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Azul");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Índigo");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Violeta");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Blanco");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Por defecto");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Color personalizado");
+ LSTR MSG_INTENSITY_R = _UxGT("Intensidad Rojo");
+ LSTR MSG_INTENSITY_G = _UxGT("Intensidad Verde");
+ LSTR MSG_INTENSITY_B = _UxGT("Intensidad Azul");
+ LSTR MSG_INTENSITY_W = _UxGT("Intensidad Blanco");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Brillo");
+
+ LSTR MSG_MOVING = _UxGT("Moviendo...");
+ LSTR MSG_FREE_XY = _UxGT("Libre XY");
+ LSTR MSG_MOVE_X = _UxGT("Mover X");
+ LSTR MSG_MOVE_Y = _UxGT("Mover Y");
+ LSTR MSG_MOVE_Z = _UxGT("Mover Z");
+ LSTR MSG_MOVE_N = _UxGT("Mover @");
+ LSTR MSG_MOVE_E = _UxGT("Extrusor");
+ LSTR MSG_MOVE_EN = _UxGT("Extrusor *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Hotend muy frio");
+ LSTR MSG_MOVE_N_MM = _UxGT("Mover $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Mover 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Mover 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Mover 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Mover 100mm");
+ LSTR MSG_SPEED = _UxGT("Velocidad");
+ LSTR MSG_BED_Z = _UxGT("Cama Z");
+ LSTR MSG_NOZZLE = _UxGT("Boquilla");
+ LSTR MSG_NOZZLE_N = _UxGT("Boquilla ~");
+ LSTR MSG_NOZZLE_PARKED = _UxGT("Boquilla Aparcada");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Boquilla en Espera");
+ LSTR MSG_BED = _UxGT("Cama");
+ LSTR MSG_CHAMBER = _UxGT("Recinto");
+ LSTR MSG_FAN_SPEED = _UxGT("Ventilador");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Ventilador ~");
+ LSTR MSG_STORED_FAN_N = _UxGT("Vent. almacenado ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Vel. Ext. ventil.");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Vel. Ext. ventil. ~");
+ LSTR MSG_CONTROLLER_FAN = _UxGT("Controlador Vent.");
+ LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Velocidad en reposo");
+ LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Modo Auto");
+ LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("Velocidad Activa");
+ LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("Periodo de reposo");
+ LSTR MSG_FLOW = _UxGT("Flujo");
+ LSTR MSG_FLOW_N = _UxGT("Flujo ~");
+ LSTR MSG_CONTROL = _UxGT("Control");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Factor");
+ LSTR MSG_AUTOTEMP = _UxGT("Temp. Autom.");
+ LSTR MSG_LCD_ON = _UxGT("Enc");
+ LSTR MSG_LCD_OFF = _UxGT("Apg");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("PID Auto-ajuste");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID Auto-ajuste *");
+ LSTR MSG_SELECT = _UxGT("Seleccionar");
+ LSTR MSG_SELECT_E = _UxGT("Seleccionar *");
+ LSTR MSG_ACC = _UxGT("Aceleración");
+ LSTR MSG_JERK = _UxGT("Jerk");
+ LSTR MSG_VA_JERK = _UxGT("Max ") STR_A _UxGT(" Jerk");
+ LSTR MSG_VB_JERK = _UxGT("Max ") STR_B _UxGT(" Jerk");
+ LSTR MSG_VC_JERK = _UxGT("Max ") STR_C _UxGT(" Jerk");
+ LSTR MSG_VN_JERK = _UxGT("Max @ Jerk");
+ LSTR MSG_VE_JERK = _UxGT("Max E Jerk");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Desvi. Unión");
+ LSTR MSG_MAX_SPEED = _UxGT("Max Velocidad");
+ LSTR MSG_VMAX_A = _UxGT("Max ") STR_A _UxGT(" Speed");
+ LSTR MSG_VMAX_B = _UxGT("Max ") STR_B _UxGT(" Speed");
+ LSTR MSG_VMAX_C = _UxGT("Max ") STR_C _UxGT(" Speed");
+ LSTR MSG_VMAX_N = _UxGT("Max @ Speed");
+ LSTR MSG_VMAX_E = _UxGT("Max E Speed");
+ LSTR MSG_VMAX_EN = _UxGT("Max * Speed");
+ LSTR MSG_VMIN = _UxGT("Vmin");
+ LSTR MSG_VTRAV_MIN = _UxGT("Vel. viaje min");
+ LSTR MSG_ACCELERATION = _UxGT("Acceleración");
+ LSTR MSG_AMAX_A = _UxGT("Acel. max") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Acel. max") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Acel. max") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Acel. max@");
+ LSTR MSG_AMAX_E = _UxGT("Acel. maxE");
+ LSTR MSG_AMAX_EN = _UxGT("Acel. max *");
+ LSTR MSG_A_RETRACT = _UxGT("Acel. retrac.");
+ LSTR MSG_A_TRAVEL = _UxGT("Acel. Viaje");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Pasos/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" pasos/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" pasos/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" pasos/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ pasos/mm");
+ LSTR MSG_E_STEPS = _UxGT("E pasos/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* pasos/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperatura");
+ LSTR MSG_MOTION = _UxGT("Movimiento");
+ LSTR MSG_FILAMENT = _UxGT("Filamento");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Diámetro Fil.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Diámetro Fil. *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Descarga mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Carga mm");
+ LSTR MSG_ADVANCE_K = _UxGT("Avance K");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Avance K *");
+ LSTR MSG_CONTRAST = _UxGT("Contraste LCD");
+ LSTR MSG_STORE_EEPROM = _UxGT("Guardar EEPROM");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Cargar EEPROM");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Rest. fábrica");
+ LSTR MSG_INIT_EEPROM = _UxGT("Inicializar EEPROM");
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("Err: EEPROM CRC");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Err: Índice EEPROM");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Err: Versión EEPROM");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Actualizar SD/FD");
+ LSTR MSG_RESET_PRINTER = _UxGT("Resetear Impresora");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Recargar");
+ LSTR MSG_INFO_SCREEN = _UxGT("Pantalla de Inf.");
+ LSTR MSG_PREPARE = _UxGT("Preparar");
+ LSTR MSG_TUNE = _UxGT("Ajustar");
+ LSTR MSG_START_PRINT = _UxGT("Iniciar impresión");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Siguinte");
+ LSTR MSG_BUTTON_INIT = _UxGT("Iniciar");
+ LSTR MSG_BUTTON_STOP = _UxGT("Parar");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Imprimir");
+ LSTR MSG_BUTTON_RESET = _UxGT("Reiniciar");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Cancelar");
+ LSTR MSG_BUTTON_DONE = _UxGT("Listo");
+ LSTR MSG_BUTTON_BACK = _UxGT("Retroceder");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Proceder");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pausar impresión");
+ LSTR MSG_RESUME_PRINT = _UxGT("Reanudar impresión");
+ LSTR MSG_STOP_PRINT = _UxGT("Detener impresión");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Imprimiendo Objeto");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Cancelar Objeto");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Cancelar Objeto =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Rec. Fallo electrico");
+ LSTR MSG_MEDIA_MENU = _UxGT("Imprim. desde SD/FD");
+ LSTR MSG_NO_MEDIA = _UxGT("SD/FD no presente");
+ LSTR MSG_DWELL = _UxGT("Reposo...");
+ LSTR MSG_USERWAIT = _UxGT("Pulsar para Reanudar");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Impresión Pausada");
+ LSTR MSG_PRINTING = _UxGT("Imprimiendo...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Impresión cancelada");
+ LSTR MSG_PRINT_DONE = _UxGT("Impresión Completada");
+ LSTR MSG_NO_MOVE = _UxGT("Sin movimiento");
+ LSTR MSG_KILLED = _UxGT("MUERTA");
+ LSTR MSG_STOPPED = _UxGT("DETENIDA");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Retraer mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Interc. Retraer mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Retraer V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Levantar mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("DesRet mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Interc. DesRet mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("DesRet V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V");
+ LSTR MSG_AUTORETRACT = _UxGT("Retracción Auto.");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Inter. longitud");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Purgar longitud");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Cambiar Herramienta");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Aumentar Z");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Vel. de Cebado");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Vel. de retracción");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Cambiar filamento");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Cambiar filamento *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Cargar filamento");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Cargar filamento *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Descargar filamento");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Descargar fil. *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Descargar todo");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Iniciar SD/FD");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Cambiar SD/FD");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Lanzar SD/FD");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Sonda Z fuera cama");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Factor de desviación");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Auto-Prueba");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Reiniciar");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Subir pistón");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Bajar pistón");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("Modo Software");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("Modo 5V");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("Modo OD");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Modo almacenar");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Poner BLTouch a 5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Poner BLTouch a OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Informe de drenaje");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("PELIGRO: ¡Una mala configuración puede producir daños! ¿Proceder igualmente?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Iniciar TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Test de desfase Z");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Guardar");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Subir TouchMI");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Subir Sonda Z");
+ LSTR MSG_MANUAL_STOW = _UxGT("Bajar Sonda Z");
+ LSTR MSG_HOME_FIRST = _UxGT("Origen %s%s%s Prim.");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Desf. Sonda");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("Desf. Sonda X");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Desf. Sonda Y");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Desf. Sonda Z");
+ LSTR MSG_BABYSTEP_X = _UxGT("Micropaso X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Micropaso Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Micropaso Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Micropaso @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Total");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Cancelado - Endstop");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Calent. fallido");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP. REDUN.");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("FUGA TÉRMICA");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("FUGA TÉRMICA CAMA");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("FUGA TÉRMICA CAMARA");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Err:TEMP. MÁX");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Err:TEMP. MIN");
+ LSTR MSG_HALTED = _UxGT("IMPRESORA DETENIDA");
+ LSTR MSG_PLEASE_RESET = _UxGT("Por favor, reinicie");
+ LSTR MSG_HEATING = _UxGT("Calentando...");
+ LSTR MSG_COOLING = _UxGT("Enfriando...");
+ LSTR MSG_BED_HEATING = _UxGT("Calentando Cama...");
+ LSTR MSG_BED_COOLING = _UxGT("Enfriando Cama...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Calentando Cámara...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Enfriando Cámara...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Calibración Delta");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Configuración Delta");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibración");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Barra Diagonal");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Altura");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Radio");
+ LSTR MSG_INFO_MENU = _UxGT("Info. Impresora");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Info. Impresora");
+ LSTR MSG_3POINT_LEVELING = _UxGT("Nivelando 3puntos");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Nivelando Lineal");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Nivelando Bilineal");
+ LSTR MSG_UBL_LEVELING = _UxGT("Nivelando UBL");
+ LSTR MSG_MESH_LEVELING = _UxGT("Nivelando en Mallado");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Estadísticas Imp.");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Info. Controlador");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistores");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extrusores");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Baudios");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protocolo");
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Vig. Fuga Térm.: OFF");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Vig. Fuga Térm.: ON");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Luz cabina");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Brillo cabina");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Impresora incorrecta");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Cont. de impresión");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Tiempo total de imp.");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Impresión más larga");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extruido");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Impresiones");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Total");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Más larga");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extruido");
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Temp. Mínima");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Temp. Máxima");
+ LSTR MSG_INFO_PSU = _UxGT("F. Aliment.");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Fuerza de empuje");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Driver %");
+ LSTR MSG_ERROR_TMC = _UxGT("ERROR CONEX. TMC");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Escribe DAC EEPROM");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("CAMBIAR FILAMENTO");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPRESIÓN PAUSADA");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARGAR FILAMENTO");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DESCARGAR FILAMENTO");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPC. REINICIO:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purgar más");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continuar imp.");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Boquilla: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Sens. filamento");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist. filamento mm");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Ir a origen Fallado");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Sondeo Fallado");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ELIJE FILAMENTO");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("¡Actu. MMU Firmware!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Necesita Cuidado");
+ LSTR MSG_MMU2_RESUME = _UxGT("Continuar imp.");
+ LSTR MSG_MMU2_RESUMING = _UxGT("Resumiendo...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("Cargar Filamento");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("Cargar Todo");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Cargar hasta boqui.");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("Expulsar Filamento");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Expulsar Filamento ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Descargar Filamento");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Cargando Fil. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Expulsando Fil. ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Descargando Fil....");
+ LSTR MSG_MMU2_ALL = _UxGT("Todo");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~");
+ LSTR MSG_MMU2_RESET = _UxGT("Reiniciar MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("Reiniciando MMU...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Retirar, y pulsar");
+
+ LSTR MSG_MIX = _UxGT("Mezcla");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Componente =");
+ LSTR MSG_MIXER = _UxGT("Miezclador");
+ LSTR MSG_GRADIENT = _UxGT("Degradado");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Degradado Total");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Mezcla Conmutada");
+ LSTR MSG_CYCLE_MIX = _UxGT("Mezcla Cíclica");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Mezcla de Degradado");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Degradado inverso");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Activar Herr.V");
+ LSTR MSG_START_VTOOL = _UxGT("Inicio Herr.V");
+ LSTR MSG_END_VTOOL = _UxGT(" Fin Herr.V");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Alias Herr.V");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Reiniciar Herr.V");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Cometer mezc. Herr.V");
+ LSTR MSG_VTOOLS_RESET = _UxGT("Herr.V reiniciados");
+ LSTR MSG_START_Z = _UxGT("Inicio Z:");
+ LSTR MSG_END_Z = _UxGT(" Fin Z:");
+
+ LSTR MSG_GAMES = _UxGT("Juegos");
+ LSTR MSG_BRICKOUT = _UxGT("Brickout");
+ LSTR MSG_INVADERS = _UxGT("Invaders");
+ LSTR MSG_SNAKE = _UxGT("Sn4k3");
+ LSTR MSG_MAZE = _UxGT("Maze");
+
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Pulsar el botón para", "reanudar impresión"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Aparcando..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Esperando para", "iniciar el cambio", "de filamento"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Inserte el filamento", "y pulse el botón", "para continuar..."));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Pulse el botón para", "calentar la boquilla"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Calentando boquilla", "Espere por favor..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Espere para", "liberar el filamento"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Espere para", "cargar el filamento"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Espere para", "purgar el filamento"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Pulse para finalizar", "la purga de filamen."));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Esperando impresora", "para reanudar..."));
+ #else
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Pulse para continuar"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Aparcando..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Por Favor espere..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Inserte y Pulse"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Pulse para Calentar"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Calentando..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Liberando..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Cargando..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purgando..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Pulse para finalizar"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Reanudando..."));
+ #endif
+ LSTR MSG_TMC_DRIVERS = _UxGT("Controladores TMC");
+ LSTR MSG_TMC_CURRENT = _UxGT("Amperaje Controlador");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Límite Hibrido");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Origen sin sensores");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit.");
+ LSTR MSG_SERVICE_RESET = _UxGT("Reiniciar");
+ LSTR MSG_SERVICE_IN = _UxGT(" dentro:");
+ LSTR MSG_BACKLASH = _UxGT("Backlash");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Corrección");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Suavizado");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("Nivel Eje X");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrar");
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("T. de esp. Calent.");
+ LSTR MSG_REHEAT = _UxGT("Recalentar");
+ LSTR MSG_REHEATING = _UxGT("Recalentando...");
+}
diff --git a/src/lcd/language/language_eu.h b/src/lcd/language/language_eu.h
new file mode 100644
index 0000000..210fdbd
--- /dev/null
+++ b/src/lcd/language/language_eu.h
@@ -0,0 +1,318 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Basque-Euskera
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_1
+#define NOT_EXTENDED_ISO10646_1_5X7
+
+namespace Language_eu {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 1;
+ LSTR LANGUAGE = _UxGT("Basque-Euskera");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" prest.");
+ LSTR MSG_BACK = _UxGT("Atzera");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Txartela sartuta");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Txartela kenduta");
+ LSTR MSG_MAIN = _UxGT("Menu nagusia");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Auto hasiera");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Itzali motoreak");
+ LSTR MSG_DEBUG_MENU = _UxGT("Arazketa Menua");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Prog. Barra Proba");
+ LSTR MSG_AUTO_HOME = _UxGT("Hasierara joan");
+ LSTR MSG_AUTO_HOME_X = _UxGT("X jatorrira");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Y jatorrira");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Z jatorrira");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("XYZ hasieraratzen");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Klik egin hasteko");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Hurrengo Puntua");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Berdintzea eginda");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Etxe. offset eza.");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsetak ezarrita");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Berotu ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Berotu ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Amaia ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Guztia");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Ohea");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Berotu ") PREHEAT_1_LABEL _UxGT(" Ezarp.");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Berotu $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Berotu $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Berotu $ Amaia");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Berotu $ Amaia ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Berotu $ Guztia");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Berotu $ Ohea");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Berotu $ Ezarp.");
+ #endif
+ LSTR MSG_COOLDOWN = _UxGT("Hoztu");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Energia piztu");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Energia itzali");
+ LSTR MSG_EXTRUDE = _UxGT("Estruitu");
+ LSTR MSG_RETRACT = _UxGT("Atzera eragin");
+ LSTR MSG_MOVE_AXIS = _UxGT("Ardatzak mugitu");
+ LSTR MSG_BED_LEVELING = _UxGT("Ohe berdinketa");
+ LSTR MSG_LEVEL_BED = _UxGT("Ohea berdindu");
+ LSTR MSG_BED_TRAMMING = _UxGT("Ertzak berdindu");
+ LSTR MSG_NEXT_CORNER = _UxGT("Hurrengo ertza");
+ LSTR MSG_EDIT_MESH = _UxGT("Sarea editatu");
+
+ LSTR MSG_UBL_DOING_G29 = _UxGT("G29 exekutatzen");
+ LSTR MSG_UBL_TOOLS = _UxGT("UBL Tresnak");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Sarea eskuz sortu");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Neurtu");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("UBL aktibatu");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL desaktibatu");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Ohearen tenperatura");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Mutur beroaren tenp.");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Sarea editatu");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Sarea editatzea eginda");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Sarea sortu");
+ #if HAS_PREHEAT
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("$ sarea sortu");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("$ sarea balioetsi");
+ #endif
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Sare hotza sortu");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Sarearen altuera doitu");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Sarea balioetsi");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Ohe sarea balioetsi");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Sare berdinketa");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3 puntuko berdinketa");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Lauki-sare berdinketa");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Sarea berdindu");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Mapa mota");
+ LSTR MSG_LED_CONTROL = _UxGT("LED ezarpenak");
+ LSTR MSG_LEDS = _UxGT("Argiak");
+ LSTR MSG_LED_PRESETS = _UxGT("Argi aurrehautaketak");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Gorria");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Laranja");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Horia");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Berdea");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Urdina");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Indigo");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Bioleta");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Zuria");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Lehenetsia");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Argi pertsonalizatuak");
+ LSTR MSG_INTENSITY_R = _UxGT("Intentsitate gorria");
+ LSTR MSG_INTENSITY_G = _UxGT("Intentsitate berdea");
+ LSTR MSG_INTENSITY_B = _UxGT("Intentsitate urdina");
+ LSTR MSG_INTENSITY_W = _UxGT("Intentsitate zuria");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Distira");
+
+ LSTR MSG_MOVING = _UxGT("Mugitzen...");
+ LSTR MSG_FREE_XY = _UxGT("Askatu XY");
+ LSTR MSG_MOVE_X = _UxGT("Mugitu X");
+ LSTR MSG_MOVE_Y = _UxGT("Mugitu Y");
+ LSTR MSG_MOVE_Z = _UxGT("Mugitu Z");
+ LSTR MSG_MOVE_N = _UxGT("Mugitu @");
+ LSTR MSG_MOVE_E = _UxGT("Estrusorea");
+ LSTR MSG_MOVE_EN = _UxGT("Estrusorea *");
+ LSTR MSG_MOVE_N_MM = _UxGT("Mugitu $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Mugitu 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Mugitu 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Mugitu 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Mugitu 100mm");
+ LSTR MSG_SPEED = _UxGT("Abiadura");
+ LSTR MSG_BED_Z = _UxGT("Z Ohea");
+ LSTR MSG_NOZZLE = _UxGT("Pita");
+ LSTR MSG_NOZZLE_N = _UxGT("Pita ~");
+ LSTR MSG_BED = _UxGT("Ohea");
+ LSTR MSG_FAN_SPEED = _UxGT("Haizagailu abiadura");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Haizagailu abiadura ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Haiz.gehig. abiadura");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Haiz.gehig. abiadura ~");
+ LSTR MSG_FLOW = _UxGT("Fluxua");
+ LSTR MSG_FLOW_N = _UxGT("Fluxua ~");
+ LSTR MSG_CONTROL = _UxGT("Kontrola");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fakt");
+ LSTR MSG_AUTOTEMP = _UxGT("Auto tenperatura");
+ LSTR MSG_SELECT = _UxGT("Aukeratu");
+ LSTR MSG_SELECT_E = _UxGT("Aukeratu *");
+ LSTR MSG_ACC = _UxGT("Azelerazioa");
+ LSTR MSG_JERK = _UxGT("Astindua");
+ LSTR MSG_VA_JERK = _UxGT("V") STR_A _UxGT("-astindua");
+ LSTR MSG_VB_JERK = _UxGT("V") STR_B _UxGT("-astindua");
+ LSTR MSG_VC_JERK = _UxGT("V") STR_C _UxGT("-astindua");
+ LSTR MSG_VN_JERK = _UxGT("V@-astindua");
+ LSTR MSG_VE_JERK = _UxGT("Ve-astindua");
+ LSTR MSG_VTRAV_MIN = _UxGT("VBidaia min");
+ LSTR MSG_A_RETRACT = _UxGT("A-retrakt");
+ LSTR MSG_A_TRAVEL = _UxGT("A-bidaia");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Pausoak/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" pausoak/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" pausoak/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" pausoak/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ pausoak/mm");
+ LSTR MSG_E_STEPS = _UxGT("E pausoak/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* pausoak/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Tenperatura");
+ LSTR MSG_MOTION = _UxGT("Mugimendua");
+ LSTR MSG_FILAMENT = _UxGT("Harizpia");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E mm3-tan");
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Hariz. Dia.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Hariz. Dia. *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Deskargatu mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Kargatu mm");
+ LSTR MSG_ADVANCE_K = _UxGT("K Aurrerapena");
+ LSTR MSG_ADVANCE_K_E = _UxGT("K Aurrerapena *");
+ LSTR MSG_CONTRAST = _UxGT("LCD kontrastea");
+ LSTR MSG_STORE_EEPROM = _UxGT("Gorde memoria");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Kargatu memoria");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Larri. berriz.");
+ LSTR MSG_INIT_EEPROM = _UxGT("EEPROM-a hasieratu");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Berriz kargatu");
+ LSTR MSG_INFO_SCREEN = _UxGT("Pantaila info");
+ LSTR MSG_PREPARE = _UxGT("Prestatu");
+ LSTR MSG_TUNE = _UxGT("Doitu");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pausatu inprimak.");
+ LSTR MSG_RESUME_PRINT = _UxGT("Jarraitu inprima.");
+ LSTR MSG_STOP_PRINT = _UxGT("Gelditu inprima.");
+ LSTR MSG_MEDIA_MENU = _UxGT("SD-tik inprimatu");
+ LSTR MSG_NO_MEDIA = _UxGT("Ez dago SD-rik");
+ LSTR MSG_DWELL = _UxGT("Lo egin...");
+ LSTR MSG_USERWAIT = _UxGT("Aginduak zain...");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Inprim. geldi.");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Inprim. deusezta.");
+ LSTR MSG_NO_MOVE = _UxGT("Mugimendu gabe.");
+ LSTR MSG_KILLED = _UxGT("AKABATUTA. ");
+ LSTR MSG_STOPPED = _UxGT("GELDITUTA. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Atzera egin mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Atzera mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Atzera egin V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Igo mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Atzera egin mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Swap Atzera mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Atzera egin V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V");
+ LSTR MSG_AUTORETRACT = _UxGT("Atzera egin");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Aldatu harizpia");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Aldatu harizpia *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Harizpia kargatu");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Harizpia kargatu *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Harizpia deskargatu");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Harizpia deskargatu *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Erabat deskargatu");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Hasieratu SD-a");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Aldatu txartela");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z zunda kanpora");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Okertze faktorea");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch AutoProba");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("BLTouch berrabia.");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("BLTouch jaitsi/luzatu");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("BLTouch igo/jaso");
+ LSTR MSG_HOME_FIRST = _UxGT("Etxera %s%s%s lehenengo");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Z Konpentsatu");
+ LSTR MSG_BABYSTEP_X = _UxGT("Mikro-urratsa X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Mikro-urratsa Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Mikro-urratsa Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Mikro-urratsa @");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Endstop deusezta.");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Err: Beroketa");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: Tenperatura");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("TENP. KONTROL EZA");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Err: Tenp Maximoa");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Err: Tenp Minimoa");
+ LSTR MSG_HALTED = _UxGT("INPRIMA. GELDIRIK");
+ LSTR MSG_PLEASE_RESET = _UxGT("Berrabia. Mesedez");
+ LSTR MSG_HEATING = _UxGT("Berotzen...");
+ LSTR MSG_BED_HEATING = _UxGT("Ohea Berotzen...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibraketa");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Kalibratu X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibratu Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibratu Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibratu Zentrua");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Delta ezarpenak");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Kalibraketa");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Barra diagonala");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Altuera");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Erradioa");
+ LSTR MSG_INFO_MENU = _UxGT("Inprimagailu Inf.");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Inprimagailu Inf.");
+ LSTR MSG_3POINT_LEVELING = _UxGT("3 puntuko berdinketa");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Berdinketa lineala");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Berdinketa bilinearra");
+ LSTR MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling");
+ LSTR MSG_MESH_LEVELING = _UxGT("Sare berdinketa");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Inprima. estatis.");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Txartelaren Info.");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistoreak");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Estrusoreak");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Baudioak");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protokoloa");
+ LSTR MSG_CASE_LIGHT = _UxGT("Kabina Argia");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Argiaren Distira");
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Inprim. Zenbaketa");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Burututa");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Inprim. denbora");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Imprimatze luzeena");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Estruituta guztira");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Inprimatze");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Burututa");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Guztira");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Luzeena");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Estrusio");
+ #endif
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Tenp. Minimoa");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Tenp. Maximoa");
+ LSTR MSG_INFO_PSU = _UxGT("Elikadura-iturria");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Driver-aren potentzia");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Driver %");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Idatzi DAC EEPROM");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("HARIZPIA ALDATU");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("HARIZPIA KARGATU");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("HARIZPIA DESKARGATU");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ALDAKETA AUKERAK:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Inprima. jarraitu");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Pita: ");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Hasi. huts egin du");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Neurketak huts egin du");
+
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Inprimagailu okerra");
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Mesedez, itxaron..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Deskargatzen..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Sartu eta click egin"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Berotzen..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Kargatzen..."));
+}
diff --git a/src/lcd/language/language_fi.h b/src/lcd/language/language_fi.h
new file mode 100644
index 0000000..ff1c23e
--- /dev/null
+++ b/src/lcd/language/language_fi.h
@@ -0,0 +1,131 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Finnish
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_1
+
+namespace Language_fi {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Finnish");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" valmis.");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Kortti asetettu");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Kortti poistettu");
+ LSTR MSG_MAIN = _UxGT("Palaa");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Automaatti");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Vapauta moottorit");
+ LSTR MSG_AUTO_HOME = _UxGT("Aja referenssiin");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Esilämmitä ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Esilämmitä ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT("Suutin ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT(" Kaikki");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Esilä. ") PREHEAT_1_LABEL _UxGT(" Alusta");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Esilämm. ") PREHEAT_1_LABEL _UxGT(" konf");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Esilämmitä $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Esilämmitä $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Esilä. $Suutin");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Esilä. $Suutin ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Esilä. $ Kaikki");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Esilä. $ Alusta");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Esilämm. $ konf");
+ #endif
+ LSTR MSG_COOLDOWN = _UxGT("Jäähdytä");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Virta päälle");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Virta pois");
+ LSTR MSG_EXTRUDE = _UxGT("Pursota");
+ LSTR MSG_RETRACT = _UxGT("Vedä takaisin");
+ LSTR MSG_MOVE_AXIS = _UxGT("Liikuta akseleita");
+ LSTR MSG_MOVE_X = _UxGT("Liikuta X");
+ LSTR MSG_MOVE_Y = _UxGT("Liikuta Y");
+ LSTR MSG_MOVE_Z = _UxGT("Liikuta Z");
+ LSTR MSG_MOVE_N = _UxGT("Liikuta @");
+ LSTR MSG_MOVE_E = _UxGT("Extruder");
+ LSTR MSG_MOVE_EN = _UxGT("Extruder *");
+ LSTR MSG_MOVE_N_MM = _UxGT("Liikuta $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Liikuta 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Liikuta 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Liikuta 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Liikuta 100mm");
+ LSTR MSG_SPEED = _UxGT("Nopeus");
+ LSTR MSG_NOZZLE = _UxGT("Suutin");
+ LSTR MSG_NOZZLE_N = _UxGT("Suutin ~");
+ LSTR MSG_BED = _UxGT("Alusta");
+ LSTR MSG_FAN_SPEED = _UxGT("Tuul. nopeus");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Tuul. nopeus ~");
+ LSTR MSG_FLOW = _UxGT("Virtaus");
+ LSTR MSG_FLOW_N = _UxGT("Virtaus ~");
+ LSTR MSG_CONTROL = _UxGT("Kontrolli");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Kerr");
+ LSTR MSG_AUTOTEMP = _UxGT("Autotemp");
+ LSTR MSG_ACC = _UxGT("Kiihtyv");
+ LSTR MSG_VTRAV_MIN = _UxGT("VLiike min");
+ LSTR MSG_A_RETRACT = _UxGT("A-peruuta");
+ LSTR MSG_TEMPERATURE = _UxGT("Lämpötila");
+ LSTR MSG_MOTION = _UxGT("Liike");
+ LSTR MSG_FILAMENT = _UxGT("Filament");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_CONTRAST = _UxGT("LCD kontrasti");
+ LSTR MSG_STORE_EEPROM = _UxGT("Tallenna muistiin");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Lataa muistista");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Palauta oletus");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Päivitä");
+ LSTR MSG_INFO_SCREEN = _UxGT("Seuraa");
+ LSTR MSG_PREPARE = _UxGT("Valmistele");
+ LSTR MSG_TUNE = _UxGT("Säädä");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Keskeytä tulostus");
+ LSTR MSG_RESUME_PRINT = _UxGT("Jatka tulostusta");
+ LSTR MSG_STOP_PRINT = _UxGT("Pysäytä tulostus");
+ LSTR MSG_MEDIA_MENU = _UxGT("Korttivalikko");
+ LSTR MSG_NO_MEDIA = _UxGT("Ei korttia");
+ LSTR MSG_DWELL = _UxGT("Nukkumassa...");
+ LSTR MSG_USERWAIT = _UxGT("Odotet. valintaa");
+ LSTR MSG_NO_MOVE = _UxGT("Ei liiketta.");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Vedä mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Va. Vedä mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Vedä V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Z mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Va. Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V");
+ LSTR MSG_AUTORETRACT = _UxGT("AutoVeto.");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrointi");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Kalibroi X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibroi Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibroi Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibroi Center");
+
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Väärä tulostin");
+}
diff --git a/src/lcd/language/language_fr.h b/src/lcd/language/language_fr.h
new file mode 100644
index 0000000..55b1b4e
--- /dev/null
+++ b/src/lcd/language/language_fr.h
@@ -0,0 +1,632 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * French
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_1
+
+namespace Language_fr {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Français");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" prête.");
+ LSTR MSG_YES = _UxGT("Oui");
+ LSTR MSG_NO = _UxGT("Non");
+ LSTR MSG_BACK = _UxGT("Retour");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Annulation...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Média inséré");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Média retiré");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Attente média");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Err lecture média");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB débranché");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("Erreur média USB");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Butées");
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Butées SW");
+ LSTR MSG_MAIN = _UxGT("Menu principal");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Config. avancée");
+ LSTR MSG_CONFIGURATION = _UxGT("Configuration");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Exéc. auto.gcode");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Arrêter moteurs");
+ LSTR MSG_DEBUG_MENU = _UxGT("Menu debug");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test barre progress.");
+ LSTR MSG_HOMING = _UxGT("Origine");
+ LSTR MSG_AUTO_HOME = _UxGT("Origine auto");
+ LSTR MSG_AUTO_HOME_A = _UxGT("Origine @ auto");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Origine X auto");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Origine Y auto");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Origine Z auto");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Align. Z auto");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Origine XYZ...");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Clic pour commencer");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Point suivant");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Mise à niveau OK!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Hauteur lissée");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Régl. décal origine");
+ LSTR MSG_HOME_OFFSET_X = _UxGT("Décal. origine X");
+ LSTR MSG_HOME_OFFSET_Y = _UxGT("Décal. origine Y");
+ LSTR MSG_HOME_OFFSET_Z = _UxGT("Décal. origine Z");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Décalages appliqués");
+ LSTR MSG_TRAMMING_WIZARD = _UxGT("Assistant Molettes");
+ LSTR MSG_SELECT_ORIGIN = _UxGT("Molette du lit"); // Not a selection of the origin
+ LSTR MSG_LAST_VALUE_SP = _UxGT("Ecart origine ");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Préchauffage ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Préchauffage ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" buse ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" Tout");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Préch. ") PREHEAT_1_LABEL _UxGT(" lit");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Régler préch. ") PREHEAT_1_LABEL;
+
+ LSTR MSG_PREHEAT_M = _UxGT("Préchauffage $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Préchauffage $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Préch. $ buse");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Préch. $ buse ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Préch. $ Tout");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Préch. $ lit");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Régler préch. $");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Préchauf. perso");
+ LSTR MSG_COOLDOWN = _UxGT("Refroidir");
+ LSTR MSG_LASER_MENU = _UxGT("Contrôle Laser");
+ LSTR MSG_LASER_POWER = _UxGT("Puissance");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Inverser broches");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Allumer alim.");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Eteindre alim.");
+ LSTR MSG_EXTRUDE = _UxGT("Extrusion");
+ LSTR MSG_RETRACT = _UxGT("Rétractation");
+ LSTR MSG_MOVE_AXIS = _UxGT("Déplacer un axe");
+ LSTR MSG_BED_LEVELING = _UxGT("Régler Niv. lit");
+ LSTR MSG_LEVEL_BED = _UxGT("Niveau du lit");
+ LSTR MSG_BED_TRAMMING = _UxGT("Niveau des coins");
+ LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Relever le coin jusqu'à la sonde");
+ LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Coins dans la tolérance. Niveau lit.");
+ LSTR MSG_NEXT_CORNER = _UxGT("Coin suivant");
+ LSTR MSG_MESH_EDITOR = _UxGT("Modif. maille"); // 13 car. max
+ LSTR MSG_EDIT_MESH = _UxGT("Modifier grille");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Modification arrêtée");
+ LSTR MSG_PROBING_POINT = _UxGT("Mesure point");
+ LSTR MSG_MESH_X = _UxGT("Index X");
+ LSTR MSG_MESH_Y = _UxGT("Index Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Valeur Z");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Commandes perso");
+
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Mesure point");
+ LSTR MSG_M48_TEST = _UxGT("Ecart sonde Z M48");
+ LSTR MSG_M48_DEVIATION = _UxGT("Ecart");
+ LSTR MSG_M48_POINT = _UxGT("Point M48");
+ LSTR MSG_IDEX_MENU = _UxGT("Mode IDEX");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplication");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copie miroir");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Contrôle complet");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Offsets Outil");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("Buse 2 Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("Buse 2 @");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26: Chauffage du lit");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("Buse en chauffe...");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Amorce manuelle...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Amorce longueur fixe");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Amorce terminée");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 annulé");
+ LSTR MSG_G26_LEAVING = _UxGT("Sortie G26");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("G29 en cours");
+ LSTR MSG_UBL_TOOLS = _UxGT("Outils UBL");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Niveau lit unifié");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Maillage manuel");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Poser câle & mesurer");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Mesure");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("ôter et mesurer lit");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Aller au suivant");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Activer l'UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Désactiver l'UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Température lit");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Température lit");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Température buse");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Température buse");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Modifier grille");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Modif. grille perso");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Réglage fin");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Terminer");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Créer la grille");
+ #if HAS_PREHEAT
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Créer grille $");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Impr. grille $");
+ #endif
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Créer grille ...");
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Mesure à froid");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ajuster haut. couche");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Hauteur (x0.1mm)");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Vérifier grille");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Impr. grille ...");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Continuer grille");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Niveau par mailles");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Niveau à 3 points");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Niveau par grille");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Effectuer mesures");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Points latéraux");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Type de carte");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Exporter grille");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Export pour hôte");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Export en CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Export sauvegarde");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Infos debug UBL");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Nombre de points");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Remplissage manuel");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Remplissage auto");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Remplissage grille");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Tout effacer");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Effacer le + près");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Réglage fin (tous)");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Réglage fin + près");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Stockage grille");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Slot mémoire");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Charger la grille");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Stocker la grille");
+ LSTR MSG_MESH_LOADED = _UxGT("Grille %i chargée");
+ LSTR MSG_MESH_SAVED = _UxGT("Grille %i enreg.");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Pas de mémoire");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Err: Enreg. UBL");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Err: Ouvrir UBL");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Décal. Z arrêté");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Assistant UBL");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Mesure à froid");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2.Compléter auto.");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Vérifier grille");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Réglage fin");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Vérifier grille");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Réglage fin");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7.Stocker grille");
+
+ LSTR MSG_LED_CONTROL = _UxGT("Contrôle LED");
+ LSTR MSG_LEDS = _UxGT("Lumière");
+ LSTR MSG_LED_PRESETS = _UxGT("Préregl. LED");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Rouge");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Orange");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Jaune");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Vert");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Bleu");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Indigo");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Violet");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Blanc");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Defaut");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("LEDs perso.");
+ LSTR MSG_INTENSITY_R = _UxGT("Intensité rouge");
+ LSTR MSG_INTENSITY_G = _UxGT("Intensité vert");
+ LSTR MSG_INTENSITY_B = _UxGT("Intensité bleu");
+ LSTR MSG_INTENSITY_W = _UxGT("Intensité blanc");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Luminosité");
+
+ LSTR MSG_MOVING = _UxGT("Déplacement...");
+ LSTR MSG_FREE_XY = _UxGT("Débloquer XY");
+ LSTR MSG_MOVE_X = _UxGT("Déplacer X");
+ LSTR MSG_MOVE_Y = _UxGT("Déplacer Y");
+ LSTR MSG_MOVE_Z = _UxGT("Déplacer Z");
+ LSTR MSG_MOVE_N = _UxGT("Déplacer @");
+ LSTR MSG_MOVE_E = _UxGT("Extruder");
+ LSTR MSG_MOVE_EN = _UxGT("Extruder *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Buse trop froide");
+ LSTR MSG_MOVE_N_MM = _UxGT("Déplacer $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Déplacer 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Déplacer 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Déplacer 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Déplacer 100mm");
+ LSTR MSG_MOVE_0001IN = _UxGT("Déplacer 0.001\"");
+ LSTR MSG_MOVE_001IN = _UxGT("Déplacer 0.01\"");
+ LSTR MSG_MOVE_01IN = _UxGT("Déplacer 0.1\"");
+ LSTR MSG_MOVE_1IN = _UxGT("Déplacer 1\"");
+ LSTR MSG_SPEED = _UxGT("Vitesse");
+ LSTR MSG_BED_Z = _UxGT("Lit Z");
+ LSTR MSG_NOZZLE = _UxGT("Buse");
+ LSTR MSG_NOZZLE_N = _UxGT("Buse ~");
+ LSTR MSG_BED = _UxGT("Lit");
+ LSTR MSG_CHAMBER = _UxGT("Caisson");
+ LSTR MSG_FAN_SPEED = _UxGT("Vit. ventil. "); // 15 car. max
+ LSTR MSG_FAN_SPEED_N = _UxGT("Vit. ventil. ~");
+ LSTR MSG_STORED_FAN_N = _UxGT("Vit. enreg. ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Extra ventil. ");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra ventil. ~");
+
+ LSTR MSG_FLOW = _UxGT("Flux");
+ LSTR MSG_FLOW_N = _UxGT("Flux ~");
+ LSTR MSG_CONTROL = _UxGT("Contrôler");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Facteur");
+ LSTR MSG_AUTOTEMP = _UxGT("Temp. Auto.");
+ LSTR MSG_LCD_ON = _UxGT("Marche");
+ LSTR MSG_LCD_OFF = _UxGT("Arrêt");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("PID Autotune");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("Tuning PID terminé");
+ LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Echec Autotune! E incorrect");
+ LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Echec Autotune! Temp. trop haute");
+ LSTR MSG_PID_TIMEOUT = _UxGT("Echec Autotune! Opér. expirée");
+ LSTR MSG_SELECT = _UxGT("Sélectionner");
+ LSTR MSG_SELECT_E = _UxGT("Sélectionner *");
+ LSTR MSG_ACC = _UxGT("Accélération");
+ LSTR MSG_JERK = _UxGT("Jerk");
+ LSTR MSG_VA_JERK = _UxGT("V") STR_A _UxGT(" jerk");
+ LSTR MSG_VB_JERK = _UxGT("V") STR_B _UxGT(" jerk");
+ LSTR MSG_VC_JERK = _UxGT("V") STR_C _UxGT(" jerk");
+ LSTR MSG_VN_JERK = _UxGT("V@ jerk");
+ LSTR MSG_VE_JERK = _UxGT("Ve jerk");
+ LSTR MSG_MAX_SPEED = _UxGT("Max Vélocité");
+ LSTR MSG_VMAX_A = _UxGT("Vit. Max ") STR_A;
+ LSTR MSG_VMAX_B = _UxGT("Vit. Max ") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("Vit. Max ") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("Vit. Max @");
+ LSTR MSG_VMAX_E = _UxGT("Vit. Max E");
+ LSTR MSG_VMAX_EN = _UxGT("Vit. Max *");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Déviat. jonct.");
+ LSTR MSG_VMIN = _UxGT("Vit. Min");
+ LSTR MSG_VTRAV_MIN = _UxGT("Vmin course");
+ LSTR MSG_ACCELERATION = _UxGT("Accélération");
+ LSTR MSG_AMAX_A = _UxGT("Max Accél. ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Max Accél. ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Max Accél. ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Max Accél. @");
+ LSTR MSG_AMAX_E = _UxGT("Max Accél. E");
+ LSTR MSG_AMAX_EN = _UxGT("Max Accél. *");
+ LSTR MSG_A_RETRACT = _UxGT("Acc.rétraction");
+ LSTR MSG_A_TRAVEL = _UxGT("Acc.course");
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("Fréquence max");
+ LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Vitesse min");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Pas/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" pas/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" pas/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" pas/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ pas/mm");
+ LSTR MSG_E_STEPS = _UxGT("E pas/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* pas/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Température");
+ LSTR MSG_MOTION = _UxGT("Mouvement");
+ LSTR MSG_FILAMENT = _UxGT("Filament");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("Limite en mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("Limite *");
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Diamètre fil.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Diamètre fil. *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Retrait mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Charger mm");
+ LSTR MSG_ADVANCE_K = _UxGT("Avance K");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Avance K *");
+ LSTR MSG_BRIGHTNESS = _UxGT("Luminosité LCD");
+ LSTR MSG_CONTRAST = _UxGT("Contraste LCD");
+ LSTR MSG_LCD_TIMEOUT_SEC = _UxGT("Veille LCD (s)");
+ LSTR MSG_BRIGHTNESS_OFF = _UxGT("Éteindre l'écran LCD");
+ LSTR MSG_STORE_EEPROM = _UxGT("Enregistrer config.");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Charger config.");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Restaurer défauts");
+ LSTR MSG_INIT_EEPROM = _UxGT("Initialiser EEPROM");
+ LSTR MSG_SETTINGS_STORED = _UxGT("Config. enregistrée");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("MaJ Firmware SD");
+ LSTR MSG_RESET_PRINTER = _UxGT("RaZ imprimante");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualiser");
+ LSTR MSG_INFO_SCREEN = _UxGT("Surveiller");
+ LSTR MSG_PREPARE = _UxGT("Préparer");
+ LSTR MSG_TUNE = _UxGT("Régler");
+ LSTR MSG_START_PRINT = _UxGT("Démarrer impression");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Suivant");
+ LSTR MSG_BUTTON_INIT = _UxGT("Init.");
+ LSTR MSG_BUTTON_STOP = _UxGT("Stop");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Imprimer");
+ LSTR MSG_BUTTON_RESET = _UxGT("Reset");
+ LSTR MSG_BUTTON_IGNORE = _UxGT("Ignorer");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Annuler");
+ LSTR MSG_BUTTON_DONE = _UxGT("Terminé");
+ LSTR MSG_BUTTON_BACK = _UxGT("Retour");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Procéder");
+ LSTR MSG_BUTTON_SKIP = _UxGT("Passer");
+ LSTR MSG_PAUSING = _UxGT("Mise en pause...");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pause impression");
+ LSTR MSG_RESUME_PRINT = _UxGT("Reprendre impr.");
+ LSTR MSG_STOP_PRINT = _UxGT("Arrêter impr.");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Impression objet");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Annuler objet");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Annuler objet =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Récup. coup.");
+ LSTR MSG_MEDIA_MENU = _UxGT("Impression SD");
+ LSTR MSG_NO_MEDIA = _UxGT("Pas de média");
+ LSTR MSG_DWELL = _UxGT("Repos...");
+ LSTR MSG_USERWAIT = _UxGT("Attente utilis.");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Impr. en pause");
+ LSTR MSG_PRINTING = _UxGT("Impression");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Impr. annulée");
+ LSTR MSG_NO_MOVE = _UxGT("Moteurs bloqués");
+ LSTR MSG_KILLED = _UxGT("KILLED");
+ LSTR MSG_STOPPED = _UxGT("STOPPÉ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Rétractation mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Ech. rétr. mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Vit. rétract°");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Saut Z mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Rét.reprise mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Ech.reprise mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("V.rét. reprise");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("V.éch. reprise");
+ LSTR MSG_AUTORETRACT = _UxGT("Rétraction auto");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Changement outil");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Augmenter Z");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Vitesse primaire");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Vitesse rétract°");
+ LSTR MSG_FILAMENT_PARK_ENABLED = _UxGT("Garer Extrudeur");
+ LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Vitesse reprise");
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Vit. ventil.");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Temps ventil.");
+ LSTR MSG_TOOL_MIGRATION_ON = _UxGT("Auto ON");
+ LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF");
+ LSTR MSG_TOOL_MIGRATION = _UxGT("Migration d'outil");
+ LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("Migration auto");
+ LSTR MSG_TOOL_MIGRATION_END = _UxGT("Extrudeur Final");
+ LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrer vers *");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Attente buse");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Longueur retrait");
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Longueur Extra");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Longueur de purge");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Changer filament");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Changer filament *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Charger filament");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Charger filament *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Retrait filament");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Retrait filament *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Retirer tout");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Charger le média");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Actualiser média");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Retirer le média");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Sonde Z hors lit");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Facteur écart");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Self-Test");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Reset");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Ranger");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Déployer");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("Mode SW");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("Mode 5V");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("Mode OD");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Appliquer Mode");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Mise en 5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Mise en OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Afficher Mode");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Init. TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Test décalage Z");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Sauvegarde");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Déployer TouchMI");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Déployer Sonde Z");
+ LSTR MSG_MANUAL_STOW = _UxGT("Ranger Sonde Z");
+ LSTR MSG_HOME_FIRST = _UxGT("Origine %s%s%s Premier");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Position sonde Z");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("Décalage X");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Décalage Y");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Décalage Z");
+ LSTR MSG_BABYSTEP_X = _UxGT("Babystep X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Babystep Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Babystep Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Babystep @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Total");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Butée abandon");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Err de chauffe");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Err TEMP. REDONDANTE");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("Err THERMIQUE");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Err TEMP. MAX");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Err TEMP. MIN");
+
+ LSTR MSG_HALTED = _UxGT("IMPR. STOPPÉE");
+ LSTR MSG_PLEASE_RESET = _UxGT("Redémarrer SVP");
+ LSTR MSG_SHORT_DAY = _UxGT("j"); // One character only
+ LSTR MSG_SHORT_HOUR = _UxGT("h"); // One character only
+ LSTR MSG_SHORT_MINUTE = _UxGT("m"); // One character only
+
+ LSTR MSG_HEATING = _UxGT("en chauffe...");
+ LSTR MSG_COOLING = _UxGT("Refroidissement");
+ LSTR MSG_BED_HEATING = _UxGT("Lit en chauffe...");
+ LSTR MSG_BED_COOLING = _UxGT("Refroid. du lit...");
+ LSTR MSG_PROBE_HEATING = _UxGT("Probe en chauffe...");
+ LSTR MSG_PROBE_COOLING = _UxGT("Refroid. Probe...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Chauffe caisson...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Refroid. caisson...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Calibration Delta");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Calibrer X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrer Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrer Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrer centre");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Réglages Delta");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Calibration Auto");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Diagonale");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Hauteur");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Rayon");
+
+ LSTR MSG_INFO_MENU = _UxGT("Infos imprimante");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Infos imprimante");
+ LSTR MSG_3POINT_LEVELING = _UxGT("Niveau à 3 points");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Niveau linéaire");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Niveau bilinéaire");
+ LSTR MSG_UBL_LEVELING = _UxGT("Niveau lit unifié");
+ LSTR MSG_MESH_LEVELING = _UxGT("Niveau par grille");
+ LSTR MSG_MESH_DONE = _UxGT("Niveau terminé");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Stats. imprimante");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Infos carte");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistances");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extrudeurs");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Bauds");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protocole");
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Protection inactive");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Protection active");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend Idle Timeout");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Lumière caisson");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Luminosité");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Imprimante incorrecte");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Nbre impressions");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Terminées");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Tps impr. total");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Impr. la + longue");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Total filament");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Impressions");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Terminées");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Total");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("+ long");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Filament");
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Temp Min");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Temp Max");
+ LSTR MSG_INFO_PSU = _UxGT("Alim.");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Puiss. moteur ");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("Driver @ %");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM sauv.");
+ LSTR MSG_ERROR_TMC = _UxGT("ERREUR CONNEXION TMC");
+
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("CHANGER FILAMENT");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPR. PAUSE");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CHARGER FIL");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DECHARGER FIL");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPTIONS REPRISE:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purger encore");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Reprendre impr.");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Buse: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Capteur fil.");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Echec origine");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Echec sonde");
+
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("MAJ firmware MMU!!");
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOISIR FILAMENT");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU ne répond plus");
+ LSTR MSG_MMU2_RESUME = _UxGT("Continuer Imp. MMU");
+ LSTR MSG_MMU2_RESUMING = _UxGT("Reprise MMU...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("Charge dans MMU");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("Charger tous dans MMU");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Charger dans buse");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("Ejecter fil. du MMU");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Ejecter fil. ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Retrait filament");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Chargem. fil. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejection fil...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Retrait fil....");
+ LSTR MSG_MMU2_ALL = _UxGT("Tous");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filament ~");
+ LSTR MSG_MMU2_RESET = _UxGT("Réinit. MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("Réinit. MMU...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Retrait, click");
+
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Composante =");
+ LSTR MSG_MIXER = _UxGT("Mixeur");
+ LSTR MSG_GRADIENT = _UxGT("Dégradé");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Dégradé complet");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Toggle mix");
+ LSTR MSG_CYCLE_MIX = _UxGT("Cycle mix");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Mix dégradé");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Inverser dégradé");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Active V-tool");
+ LSTR MSG_START_VTOOL = _UxGT("Début V-tool");
+ LSTR MSG_END_VTOOL = _UxGT(" Fin V-tool");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Réinit. V-tools");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Valider Mix V-tool");
+ LSTR MSG_VTOOLS_RESET = _UxGT("V-tools réinit. ok");
+ LSTR MSG_START_Z = _UxGT("Début Z:");
+ LSTR MSG_END_Z = _UxGT(" Fin Z:");
+ LSTR MSG_GAMES = _UxGT("Jeux");
+ LSTR MSG_BRICKOUT = _UxGT("Casse-briques");
+ LSTR MSG_INVADERS = _UxGT("Invaders");
+ LSTR MSG_SNAKE = _UxGT("Sn4k3");
+ LSTR MSG_MAZE = _UxGT("Labyrinthe");
+
+ LSTR MSG_BAD_PAGE = _UxGT("Erreur index page");
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("Erreur vitesse page");
+
+ #if LCD_HEIGHT >= 4
+ // Up to 3 lines allowed
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Presser bouton", "pour reprendre"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parking..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Attente filament", "pour démarrer"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Insérer filament", "et app. bouton", "pour continuer..."));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Presser le bouton", "pour chauffer..."));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Buse en chauffe", "Patienter SVP..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Attente", "retrait du filament"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Attente", "chargement filament"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Attente", "Purge filament"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Presser pour finir", "la purge du filament"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Attente reprise", "impression"));
+ #else // LCD_HEIGHT < 4
+ // Up to 2 lines allowed
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Clic pour continuer"));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Patience..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insérer fil."));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Chauffer ?"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Chauffage..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Retrait fil..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Chargement..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purge..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Terminer ?"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Reprise..."));
+ #endif // LCD_HEIGHT < 4
+
+ LSTR MSG_TMC_CURRENT = _UxGT("Courant driver");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Seuil hybride");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Home sans capteur");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Mode pas à pas");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop activé");
+ LSTR MSG_SERVICE_RESET = _UxGT("Réinit.");
+ LSTR MSG_SERVICE_IN = _UxGT(" dans:");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Correction");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Lissage");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("Niveau axe X");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Etalon. auto.");
+ #if ENABLED(TOUCH_UI_FTDI_EVE)
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("En protection, temp. réduite. Ok pour rechauffer et continuer.");
+ #else
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("En protection");
+ #endif
+ LSTR MSG_REHEAT = _UxGT("Chauffer");
+ LSTR MSG_REHEATING = _UxGT("Réchauffe...");
+
+ LSTR MSG_PROBE_WIZARD = _UxGT("Assistant Sonde Z");
+ LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Mesure référence");
+ LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Dépl. vers pos");
+
+ LSTR MSG_SOUND = _UxGT("Sons");
+
+ LSTR MSG_TOP_LEFT = _UxGT("Coin haut gauche");
+ LSTR MSG_BOTTOM_LEFT = _UxGT("Coin bas gauche");
+ LSTR MSG_TOP_RIGHT = _UxGT("Coin haut droit");
+ LSTR MSG_BOTTOM_RIGHT = _UxGT("Coin bas droit");
+ LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Calibration terminée");
+ LSTR MSG_CALIBRATION_FAILED = _UxGT("Échec de l'étalonnage");
+
+ LSTR MSG_SD_CARD = _UxGT("Carte SD");
+ LSTR MSG_USB_DISK = _UxGT("Clé USB");
+}
diff --git a/src/lcd/language/language_gl.h b/src/lcd/language/language_gl.h
new file mode 100644
index 0000000..9ae64f0
--- /dev/null
+++ b/src/lcd/language/language_gl.h
@@ -0,0 +1,595 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Galician language (ISO "gl")
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_1
+
+namespace Language_gl {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 1;
+ LSTR LANGUAGE = _UxGT("Galician");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" lista.");
+ LSTR MSG_YES = _UxGT("SI");
+ LSTR MSG_NO = _UxGT("NON");
+ LSTR MSG_BACK = _UxGT("Atrás");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Cancelando...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Tarxeta inserida");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Tarxeta retirada");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Agardando ao SD/FD");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Erro lectura SD/FD");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Disp. USB retirado");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("Inicio USB fallido");
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Desbord. Subch.");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("FinCarro");
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("FinCarro SW");
+ LSTR MSG_MAIN = _UxGT("Menú principal");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Axustes avanzados");
+ LSTR MSG_CONFIGURATION = _UxGT("Configuración");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Autoarranque");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Apagar motores");
+ LSTR MSG_DEBUG_MENU = _UxGT("Menú depuración");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test barra progreso");
+ LSTR MSG_AUTO_HOME = _UxGT("Ir a orixe");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Ir orixe X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Ir orixe Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Ir orixe Z");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Autoaliñar Z");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Ir orixes XYZ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Prema pulsador");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Seguinte punto");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Fin Nivelación!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Compensación Altura");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Axustar Desfases");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Desfases aplicados");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Prequentar ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Prequentar ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Bico ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Todo");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" Cama");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Preque. ") PREHEAT_1_LABEL _UxGT(" conf");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Prequentar $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Prequentar $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Preque. $ Bico");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Preque. $ Bico ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Preque. $ Todo");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preque. $ Cama");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preque. $ conf");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Preque. Personali.");
+ LSTR MSG_COOLDOWN = _UxGT("Arrefriar");
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("Frecuencia");
+ LSTR MSG_LASER_MENU = _UxGT("Control Láser");
+ LSTR MSG_LASER_POWER = _UxGT("Potencia Láser");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Control Fuso");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Potencia Fuso");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Inverter xiro");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Acender");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Apagar");
+ LSTR MSG_EXTRUDE = _UxGT("Extruír");
+ LSTR MSG_RETRACT = _UxGT("Retraer");
+ LSTR MSG_MOVE_AXIS = _UxGT("Mover eixe");
+ LSTR MSG_BED_LEVELING = _UxGT("Nivelando Cama");
+ LSTR MSG_LEVEL_BED = _UxGT("Nivelar Cama");
+ LSTR MSG_BED_TRAMMING = _UxGT("Nivelar Cantos");
+ LSTR MSG_NEXT_CORNER = _UxGT("Seguinte Canto");
+ LSTR MSG_MESH_EDITOR = _UxGT("Editor Mallado");
+ LSTR MSG_EDIT_MESH = _UxGT("Editar Mallado");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Ed. Mallado Detida");
+ LSTR MSG_PROBING_POINT = _UxGT("Punto de Proba");
+ LSTR MSG_MESH_X = _UxGT("Índice X");
+ LSTR MSG_MESH_Y = _UxGT("Índice Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Valor Z");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Comandos Personaliz.");
+ LSTR MSG_M48_TEST = _UxGT("M48 Probar Sonda");
+ LSTR MSG_M48_POINT = _UxGT("M48 Punto");
+ LSTR MSG_M48_DEVIATION = _UxGT("Desviación");
+ LSTR MSG_IDEX_MENU = _UxGT("Modo IDEX");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Ferramentas Compens");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Estacionar");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicación");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia Espello");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Control Total");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2º Bico Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2º Bico @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Executando G29");
+ LSTR MSG_UBL_TOOLS = _UxGT("Ferramentas UBL");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Punto de inclinación");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Facer Malla Manual");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Colocar Calzo e Medir");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Medir");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Quitar e Medir Cama");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Mover ao Seguinte");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Activar UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Desactivar UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Temp Cama");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp Cama");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp Bico");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp Bico");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Editar Malla");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit. Malla Person.");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Axuste Fino da Malla");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Fin Edición da Malla");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crear Malla Person.");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Crear Malla");
+ #if HAS_PREHEAT
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Crear Malla ($)");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Validar Malla ($)");
+ #endif
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Crear Malla Fría");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Axustar Altura Malla");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Altura");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validar Malla");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validar Malla perso.");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 Quentando Cama");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 Quentando Bico");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Traballo manual...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Traballo Lonxit Fixa");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Fin Traballo");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 Cancelado");
+ LSTR MSG_G26_LEAVING = _UxGT("Saíndo de G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Continuar Malla");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Nivelación Malla");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Nivelación 3Puntos");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Nivelación Grid");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Nivelar Malla");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Puntos Laterais");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Tipo de Mapa ");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Gardar Mapa");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Enviar ao Host");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Gardar en CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Backup Externo");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Info do UBL");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Cantidade de Recheo");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Recheo Manual");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Recheo Intelixente");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Recheo da Malla");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidar todo");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidar cercanos");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Axustar Fino Todo");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Axustar Fino Cerc");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Almacenamento Malla");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Rañura Memoria");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Cargar Malla Cama");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Gardar Malla Cama");
+ LSTR MSG_MESH_LOADED = _UxGT("Malla %i Cargada");
+ LSTR MSG_MESH_SAVED = _UxGT("Malla %i Gardada");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Sen Gardar");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Erro: Gardadado UBL");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Erro: Recuperación UBL");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Desfase de Z: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Desfase de Z Detido");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Paso a Paso");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Crear Malla Fría");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2. Recheo Intelixente");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Validar Malla");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Axustar Fino Todo");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Validar Malla");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Axustar Fino Todo");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7. Gardar Malla Cama");
+
+ LSTR MSG_LED_CONTROL = _UxGT("Control LED");
+ LSTR MSG_LEDS = _UxGT("Luces");
+ LSTR MSG_LED_PRESETS = _UxGT("Axustes Luz");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Vermello");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Laranxa");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Amarelo");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Verde");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Azul");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Índigo");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Violeta");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Branco");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Por defecto");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Luces personalizadas");
+ LSTR MSG_INTENSITY_R = _UxGT("Intensidade Vermello");
+ LSTR MSG_INTENSITY_G = _UxGT("Intensidade Verde");
+ LSTR MSG_INTENSITY_B = _UxGT("Intensidade Azul");
+ LSTR MSG_INTENSITY_W = _UxGT("Intensidade Branco");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Brillo");
+
+ LSTR MSG_MOVING = _UxGT("Movendo...");
+ LSTR MSG_FREE_XY = _UxGT("Libre XY");
+ LSTR MSG_MOVE_X = _UxGT("Mover X");
+ LSTR MSG_MOVE_Y = _UxGT("Mover Y");
+ LSTR MSG_MOVE_Z = _UxGT("Mover Z");
+ LSTR MSG_MOVE_N = _UxGT("Mover @");
+ LSTR MSG_MOVE_E = _UxGT("Extrusor");
+ LSTR MSG_MOVE_EN = _UxGT("Extrusor *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Bico moi frío");
+ LSTR MSG_MOVE_N_MM = _UxGT("Mover $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Mover 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Mover 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Mover 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Mover 100mm");
+ LSTR MSG_SPEED = _UxGT("Velocidade");
+ LSTR MSG_BED_Z = _UxGT("Cama Z");
+ LSTR MSG_NOZZLE = _UxGT("Bico");
+ LSTR MSG_NOZZLE_N = _UxGT("Bico ~");
+ LSTR MSG_NOZZLE_PARKED = _UxGT("Bico Estacionado");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Bico Standby");
+ LSTR MSG_BED = _UxGT("Cama");
+ LSTR MSG_CHAMBER = _UxGT("Cámara");
+ LSTR MSG_FAN_SPEED = _UxGT("Vel. Ventilador");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Vel. Ventilador ~");
+ LSTR MSG_STORED_FAN_N = _UxGT("Ventilador Mem. ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Vel. Vent. Extra");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Vel. Vent. Extra ~");
+ LSTR MSG_CONTROLLER_FAN = _UxGT("Controlador Vent.");
+ LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Velocidade Repouso");
+ LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Modo Auto");
+ LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("Velocidade Activa");
+ LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("Tempo Repouso");
+ LSTR MSG_FLOW = _UxGT("Fluxo");
+ LSTR MSG_FLOW_N = _UxGT("Fluxo ~");
+ LSTR MSG_CONTROL = _UxGT("Control");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact");
+ LSTR MSG_AUTOTEMP = _UxGT("Temperatura Auto.");
+ LSTR MSG_LCD_ON = _UxGT("Acender");
+ LSTR MSG_LCD_OFF = _UxGT("Apagar");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("Auto-Sint. PID");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("Auto-Sint. PID *");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("Fin Auto-Sint PID");
+ LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Auto-Sint. fallida! Extrusor danado.");
+ LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Auto-Sint. fallida! Temperatura moi alta.");
+ LSTR MSG_PID_TIMEOUT = _UxGT("Auto-Sint. fallida! Tempo excedido.");
+ LSTR MSG_SELECT = _UxGT("Escolla");
+ LSTR MSG_SELECT_E = _UxGT("Escolla *");
+ LSTR MSG_ACC = _UxGT("Acel");
+ LSTR MSG_JERK = _UxGT("Jerk");
+ LSTR MSG_VA_JERK = _UxGT("Max ") STR_A _UxGT(" Jerk");
+ LSTR MSG_VB_JERK = _UxGT("Max ") STR_B _UxGT(" Jerk");
+ LSTR MSG_VC_JERK = _UxGT("Max ") STR_C _UxGT(" Jerk");
+ LSTR MSG_VN_JERK = _UxGT("Max @ Jerk");
+ LSTR MSG_VE_JERK = _UxGT("Max E Jerk");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Desvío Unión");
+ LSTR MSG_MAX_SPEED = _UxGT("Max Velocidade");
+ LSTR MSG_VMAX_A = _UxGT("Max ") STR_A _UxGT(" Speed");
+ LSTR MSG_VMAX_B = _UxGT("Max ") STR_B _UxGT(" Speed");
+ LSTR MSG_VMAX_C = _UxGT("Max ") STR_C _UxGT(" Speed");
+ LSTR MSG_VMAX_N = _UxGT("Max @ Speed");
+ LSTR MSG_VMAX_E = _UxGT("Max E Speed");
+ LSTR MSG_VMAX_EN = _UxGT("Max * Speed");
+ LSTR MSG_VMIN = _UxGT("Vmin");
+ LSTR MSG_VTRAV_MIN = _UxGT("V-viaxe min");
+ LSTR MSG_ACCELERATION = _UxGT("Aceleración");
+ LSTR MSG_AMAX_A = _UxGT("Max ") STR_A _UxGT(" Accel");
+ LSTR MSG_AMAX_B = _UxGT("Max ") STR_B _UxGT(" Accel");
+ LSTR MSG_AMAX_C = _UxGT("Max ") STR_C _UxGT(" Accel");
+ LSTR MSG_AMAX_E = _UxGT("Max E Accel");
+ LSTR MSG_AMAX_EN = _UxGT("Max * Accel");
+ LSTR MSG_A_RETRACT = _UxGT("A-retrac.");
+ LSTR MSG_A_TRAVEL = _UxGT("A-viaxe");
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("Frecuencia max");
+ LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Avance min");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Pasos/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" pasos/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" pasos/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" pasos/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ pasos/mm");
+ LSTR MSG_E_STEPS = _UxGT("E pasos/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* pasos/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperatura");
+ LSTR MSG_MOTION = _UxGT("Movemento");
+ LSTR MSG_FILAMENT = _UxGT("Filamento");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Diam. fil.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Diam. fil. *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Descarga mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Carga mm");
+ LSTR MSG_ADVANCE_K = _UxGT("Avance K");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Avance K *");
+ LSTR MSG_CONTRAST = _UxGT("Constraste LCD");
+ LSTR MSG_STORE_EEPROM = _UxGT("Gardar Configuración");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Cargar Configuración");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Rest. Defecto");
+ LSTR MSG_INIT_EEPROM = _UxGT("Inicializar EEPROM");
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("Erro: CRC EEPROM");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Erro: Índice EEPROM");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Erro: Versión EEPROM");
+ LSTR MSG_SETTINGS_STORED = _UxGT("Config Gardada");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Actualizar SD/FD");
+ LSTR MSG_RESET_PRINTER = _UxGT("Reiniciar Impresora");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Recargar");
+ LSTR MSG_INFO_SCREEN = _UxGT("Información");
+ LSTR MSG_PREPARE = _UxGT("Preparar");
+ LSTR MSG_TUNE = _UxGT("Axustar");
+ LSTR MSG_START_PRINT = _UxGT("Comezar impresión");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Seguinte");
+ LSTR MSG_BUTTON_INIT = _UxGT("Comezar");
+ LSTR MSG_BUTTON_STOP = _UxGT("Deter");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Imprimir");
+ LSTR MSG_BUTTON_RESET = _UxGT("Reiniciar");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Cancelar");
+ LSTR MSG_BUTTON_DONE = _UxGT("Listo");
+ LSTR MSG_BUTTON_BACK = _UxGT("Atrás");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Proceder");
+ LSTR MSG_PAUSING = _UxGT("Pausando...");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pausar impresión");
+ LSTR MSG_RESUME_PRINT = _UxGT("Retomar impresión");
+ LSTR MSG_STOP_PRINT = _UxGT("Deter impresión");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Imprimindo Obxecto");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Cancelar Obxecto");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Cancelar Obxecto =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Recuperar Impresión");
+ LSTR MSG_MEDIA_MENU = _UxGT("Tarxeta SD");
+ LSTR MSG_NO_MEDIA = _UxGT("Sen tarxeta SD");
+ LSTR MSG_DWELL = _UxGT("En repouso...");
+ LSTR MSG_USERWAIT = _UxGT("Prema para Retomar..");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Impresión Pausada");
+ LSTR MSG_PRINTING = _UxGT("Imprimindo...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Impresión Cancelada");
+ LSTR MSG_PRINT_DONE = _UxGT("Fin Impresión");
+ LSTR MSG_NO_MOVE = _UxGT("Sen movemento.");
+ LSTR MSG_KILLED = _UxGT("MORTO.");
+ LSTR MSG_STOPPED = _UxGT("DETIDO.");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Retraer mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Cambio retra. mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Retraer V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Alzar Z mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Recup. retra. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Cambio recup. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Recuperacion V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V");
+ LSTR MSG_AUTORETRACT = _UxGT("Auto-Retracción");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Lonxitude Retracción");
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Cambio Extra");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Lonxitude de Purga");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Cambiar Ferramenta");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Levantar Z");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Velocidade prim.");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Vel. de Retracción");
+ LSTR MSG_FILAMENT_PARK_ENABLED = _UxGT("Extrusor Est.");
+ LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Vel. Recuperación");
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Vel. Ventilador");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Tempo Ventilador");
+ LSTR MSG_TOOL_MIGRATION_ON = _UxGT("Auto ON");
+ LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF");
+ LSTR MSG_TOOL_MIGRATION = _UxGT("Cambio Ferramenta");
+ LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("Cambio Automático");
+ LSTR MSG_TOOL_MIGRATION_END = _UxGT("Último Extrusor");
+ LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("Cambio a *");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Cambiar Filamento");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Cambiar Filamento *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Cargar Filamento");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Cargar Filamento *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Descargar Filamento");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Descargar Filamento *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Descargar Todo");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Iniciar SD/FD");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Cambiar SD/FD");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Lanzar SD/FD");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Sonda-Z fóra Cama");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Factor de Desviación");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Auto-Test");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Reiniciar");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Recoller");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Estender");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("Modo Software");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("Modo 5V");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("Modo OD");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Modo Almacenar");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Axustar BLTouch a 5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Axustar BLTouch a OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Modo de Informe");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("PERIGO: Unha mala configuración pode producir daños! Proceder igualmente?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Iniciar TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Test de Desfase Z");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Gardar");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Estender TouchMI");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Estender Sonda Z");
+ LSTR MSG_MANUAL_STOW = _UxGT("Recoller Sonda Z");
+ LSTR MSG_HOME_FIRST = _UxGT("Orixe %s%s%s Primeiro");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Desfases Sonda");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("Desfase Sonda X");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Desfase Sonda Y");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Desfase Z");
+ LSTR MSG_BABYSTEP_X = _UxGT("Micropaso X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Micropaso Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Micropaso Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Micropaso @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Total");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Erro FinCarro");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Fallo Quentando");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Erro:Temp Redundante");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("FUGA TÉRMICA");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("FUGA TÉRMICA CAMA");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("FUGA TÉRMICA CÁMARA");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Erro:TEMP MÁX");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Erro:TEMP MÍN");
+ LSTR MSG_HALTED = _UxGT("IMPRESORA DETIDA");
+ LSTR MSG_PLEASE_RESET = _UxGT("Debe reiniciar!");
+ LSTR MSG_HEATING = _UxGT("Quentando...");
+ LSTR MSG_COOLING = _UxGT("Arrefriando...");
+ LSTR MSG_BED_HEATING = _UxGT("Quentando cama...");
+ LSTR MSG_BED_COOLING = _UxGT("Enfriando Cama...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Quentando Cámara...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Arrefriando Cámara...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Calibracion Delta");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Configuración Delta");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibración");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Barra Diagonal");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Altura");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Radio");
+ LSTR MSG_INFO_MENU = _UxGT("Acerca de...");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Información");
+ LSTR MSG_3POINT_LEVELING = _UxGT("Nivelación 3puntos");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Nivelación Lineal");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Nivelación Bilineal");
+ LSTR MSG_UBL_LEVELING = _UxGT("Nivelación UBL");
+ LSTR MSG_MESH_LEVELING = _UxGT("Nivelación en Malla");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Estatísticas");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Placa nai");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistores");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extrusores");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Baudios");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protocolo");
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Reloxo Traballo: OFF");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Reloxo Traballo: ON");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Luz da Caixa");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Brillo Luces");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("IMPRESORA INCORRECTA");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Total Impresións");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Tempo Total Imp.");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Impresión máis longa");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extruído");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Impresións");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Total");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Máis Longa");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extruido");
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Temp Mín");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Temp Máx");
+ LSTR MSG_INFO_PSU = _UxGT("Fonte Alimentación");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Forza do Motor");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Driver %");
+ LSTR MSG_ERROR_TMC = _UxGT("ERRO CONEX. TMC");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Escribe DAC EEPROM");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("CAMBIAR FILAMENTO");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPRESIÓN PAUSADA");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARGAR FILAMENTO");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DESCARGAR FILAMENTO");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPCIÓN DE RETOMAR:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purgar máis");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Retomar traballo");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Bico: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Sensor Filamento");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist mm Sensor Fil");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Fallo ao ir á Orixe");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Fallo ao Sondar");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ESCOLLE FILAMENTO");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("Actualizar FW MMU!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Precisa Atención.");
+ LSTR MSG_MMU2_RESUME = _UxGT("Retomar impr.");
+ LSTR MSG_MMU2_RESUMING = _UxGT("Retomando...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("Cargar Filamento");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("Cargar Todo");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Cargar até bico");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("Expulsar Filamento");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Expulsar Filamento ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Descargar Filamento");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Cargando Fil. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Expulsando Fil. ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Descargando Fil...");
+ LSTR MSG_MMU2_ALL = _UxGT("Todo");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~");
+ LSTR MSG_MMU2_RESET = _UxGT("Reiniciar MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("Reiniciando MMU...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Expulsar, premer");
+
+ LSTR MSG_MIX = _UxGT("Mestura");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Compoñente =");
+ LSTR MSG_MIXER = _UxGT("Mesturadora");
+ LSTR MSG_GRADIENT = _UxGT("Degradado");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Degradado Total");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Mestura Conmutada");
+ LSTR MSG_CYCLE_MIX = _UxGT("Mestura Cíclica");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Mestura de Degradado");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Degradado Inverso");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Activar Ferr-V");
+ LSTR MSG_START_VTOOL = _UxGT("Inicio Ferr-V");
+ LSTR MSG_END_VTOOL = _UxGT(" Fin Ferr-V");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Alias Ferr-V");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Reiniciar Ferr-V");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Commit mest. Ferr-V");
+ LSTR MSG_VTOOLS_RESET = _UxGT("Ferr-V reiniciadas");
+ LSTR MSG_START_Z = _UxGT("Inicio Z:");
+ LSTR MSG_END_Z = _UxGT(" Fin Z:");
+
+ LSTR MSG_GAMES = _UxGT("Xogos");
+ LSTR MSG_BRICKOUT = _UxGT("Brickout");
+ LSTR MSG_INVADERS = _UxGT("Invaders");
+ LSTR MSG_SNAKE = _UxGT("Sn4k3");
+ LSTR MSG_MAZE = _UxGT("Labirinto");
+
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Preme o botón para", "continuar impresión"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Estacionando..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Agarde para", "comezar cambio", "de filamento"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Introduza o", "filamento e", "faga click"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Prema o botón para", "quentar o bico"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Quentando bico", "Agarde, por favor..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Agarde pola", "descarga do", "filamento"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Agarde pola", "carga do", "filamento"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Agarde para", "purgar o filamento"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Prema para finalizar", "a purga do filamen."));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Agarde a que", "se retome", "a impresión"));
+ #else
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Premer para continuar"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Estacionando..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Agarde..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Introduza e click"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Prema para quentar"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Quentando..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Descargando..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Cargando..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purgando..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Prema para finalizar"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Retomando..."));
+ #endif
+
+ LSTR MSG_TMC_DRIVERS = _UxGT("Controladores TMC");
+ LSTR MSG_TMC_CURRENT = _UxGT("Controlador Actual");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Limiar Hibrido");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Orixe sen Sensores");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit.");
+ LSTR MSG_SERVICE_RESET = _UxGT("Reiniciar");
+ LSTR MSG_SERVICE_IN = _UxGT(" dentro:");
+ LSTR MSG_BACKLASH = _UxGT("Reacción");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Corrección");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Suavizado");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("Nivel Eixe X");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrar");
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Tempo exc. Quent.");
+ LSTR MSG_REHEAT = _UxGT("Requentar");
+ LSTR MSG_REHEATING = _UxGT("Requentando...");
+}
diff --git a/src/lcd/language/language_hr.h b/src/lcd/language/language_hr.h
new file mode 100644
index 0000000..08ff6cc
--- /dev/null
+++ b/src/lcd/language/language_hr.h
@@ -0,0 +1,173 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Croatian (Hrvatski)
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays.
+
+namespace Language_hr {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Croatian");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" spreman.");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("SD kartica umetnuta");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("SD kartica uklonjena");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
+ LSTR MSG_MAIN = _UxGT("Main");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Auto pokretanje");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Ugasi steppere");
+ LSTR MSG_AUTO_HOME = _UxGT("Automatski homing");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Home-aj X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Home-aj Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Home-aj Z");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Home-aj XYZ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Klikni za početak");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Sljedeća točka");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Niveliranje gotovo!");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Postavi home offsete");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets postavljeni");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Predgrij ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Predgrij ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Dizna ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Sve");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" Bed");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Predgrij ") PREHEAT_1_LABEL _UxGT(" conf");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Predgrij $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Predgrij $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Predgrij $ Dizna");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Predgrij $ Dizna ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Predgrij $ Sve");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Predgrij $ Bed");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Predgrij $ conf");
+ #endif
+ LSTR MSG_COOLDOWN = _UxGT("Hlađenje");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Uključi napajanje");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Isključi napajanje");
+ LSTR MSG_MOVE_AXIS = _UxGT("Miči os");
+ LSTR MSG_BED_LEVELING = _UxGT("Niveliraj bed");
+ LSTR MSG_LEVEL_BED = _UxGT("Niveliraj bed");
+ LSTR MSG_MOVE_X = _UxGT("Miči X");
+ LSTR MSG_MOVE_Y = _UxGT("Miči Y");
+ LSTR MSG_MOVE_Z = _UxGT("Miči Z");
+ LSTR MSG_MOVE_N = _UxGT("Miči @");
+ LSTR MSG_MOVE_E = _UxGT("Miči E");
+ LSTR MSG_MOVE_EN = _UxGT("Miči *");
+ LSTR MSG_MOVE_N_MM = _UxGT("Miči $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Miči 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Miči 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Miči 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Miči 100mm");
+ LSTR MSG_SPEED = _UxGT("Brzina");
+ LSTR MSG_BED_Z = _UxGT("Bed Z");
+ LSTR MSG_NOZZLE = _UxGT("Dizna");
+ LSTR MSG_NOZZLE_N = _UxGT("Dizna ~");
+ LSTR MSG_BED = _UxGT("Bed");
+ LSTR MSG_FAN_SPEED = _UxGT("Brzina ventilatora");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Brzina ventilatora ~");
+ LSTR MSG_SELECT = _UxGT("Odaberi");
+ LSTR MSG_SELECT_E = _UxGT("Odaberi *");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperature");
+ LSTR MSG_MOTION = _UxGT("Gibanje");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Fil. Dia.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *");
+ LSTR MSG_CONTRAST = _UxGT("Kontrast LCD-a");
+ LSTR MSG_STORE_EEPROM = _UxGT("Pohrani u memoriju");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Učitaj memoriju");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Učitaj Defaults");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Osvježi");
+ LSTR MSG_INFO_SCREEN = _UxGT("Info screen");
+ LSTR MSG_PREPARE = _UxGT("Pripremi");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pauziraj print");
+ LSTR MSG_RESUME_PRINT = _UxGT("Nastavi print");
+ LSTR MSG_STOP_PRINT = _UxGT("Zaustavi print");
+ LSTR MSG_MEDIA_MENU = _UxGT("Printaj s SD kartice");
+ LSTR MSG_NO_MEDIA = _UxGT("Nema SD kartice");
+ LSTR MSG_USERWAIT = _UxGT("Čekaj korisnika...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Print otkazan");
+ LSTR MSG_STOPPED = _UxGT("ZAUSTAVLJEN. ");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Promijeni filament");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Promijeni filament *");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Init. SD karticu");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Promijeni SD karticu");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Grijanje neuspješno");
+ LSTR MSG_HEATING = _UxGT("Grijanje...");
+ LSTR MSG_BED_HEATING = _UxGT("Grijanje Bed-a...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibracija");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Kalibriraj X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibriraj Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibriraj Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibriraj Središte");
+ LSTR MSG_INFO_MENU = _UxGT("O printeru");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Podaci o printeru");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Statistika printera");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Podaci o elektronici");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistori");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extruderi");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Baud");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protokol");
+ LSTR MSG_CASE_LIGHT = _UxGT("Osvjetljenje");
+
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Neispravan pisač");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Broj printova");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Završeni");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Ukupno printanja");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Najduži print");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extrudirano ukupno");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Printovi");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Završeni");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Ukupno");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Najduži");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extrudirano");
+ #endif
+
+ LSTR MSG_INFO_PSU = _UxGT("Napajanje");
+
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Nastavi print");
+
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Čekaj", "filament unload"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Pričekaj", "filament load"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Nastavljam..."));
+
+ #if LCD_HEIGHT >= 4
+ // Up to 3 lines allowed
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Čekaj početak", "filamenta", "promijeni"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Umetni filament", "i pritisni tipku", "za nastavak..."));
+ #else
+ // Up to 2 lines allowed
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT("Pričekaj...");
+ #endif
+}
diff --git a/src/lcd/language/language_hu.h b/src/lcd/language/language_hu.h
new file mode 100644
index 0000000..eebcb75
--- /dev/null
+++ b/src/lcd/language/language_hu.h
@@ -0,0 +1,706 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Hungarian / Magyar
+ *
+ * LCD Menu Messages. See also https://marlinfw.org/docs/development/lcd_language.html
+ * Hungarian translation by AntoszHUN. I am constantly improving and updating the translation.
+ * Translation last updated: 08/30/2021 - 22:20
+ *
+ * LCD Menü Üzenetek. Lásd még https://marlinfw.org/docs/development/lcd_language.html
+ * A Magyar fordítást készítette: AntoszHUN. A fordítást folyamatosan javítom és frissítem.
+ * A Fordítás utolsó frissítése: 2021.08.30. - 22:20
+ */
+
+namespace Language_hu {
+ using namespace Language_en; // A fordítás az örökölt Amerikai Angol (English) karakterláncokat használja.
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Magyar");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Kész.");
+ LSTR MSG_YES = _UxGT("IGEN");
+ LSTR MSG_NO = _UxGT("NEM");
+ LSTR MSG_BACK = _UxGT("Vissza");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Megszakítás...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Tároló behelyezve");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Tároló eltávolítva");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Várakozás a tárolóra");
+ LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Tároló-kártya hiba");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Tároló olvasási hiba");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB eltávolítva");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB eszköz hiba");
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Túlfolyás");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Végállás"); // Maximum 8 karakter
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Szoft. végállás");
+ LSTR MSG_MAIN = _UxGT("");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("További beállítások");
+ LSTR MSG_CONFIGURATION = _UxGT("Konfiguráció");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Fájl auto. futtatás");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Motorok kikapcsolása");
+ LSTR MSG_DEBUG_MENU = _UxGT("Hiba Menü");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Haladás sáv teszt");
+ LSTR MSG_AUTO_HOME = _UxGT("X-Y-Z auto kezdöpont");
+ LSTR MSG_AUTO_HOME_A = _UxGT("Kezdö @");
+ LSTR MSG_AUTO_HOME_X = _UxGT("X kezdöpont");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Y kezdöpont");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Z kezdöpont");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-igazítás");
+ LSTR MSG_ITERATION = _UxGT("G34 Ismétlés: %i");
+ LSTR MSG_DECREASING_ACCURACY = _UxGT("Pontosság csökken!");
+ LSTR MSG_ACCURACY_ACHIEVED = _UxGT("Pontosság elérve");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("X-Y-Z kezdöpont");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Kattints a kezdéshez.");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Következö pont");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Szintezés kész!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Szint csökkentés");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Kezdöpont eltolás");
+ LSTR MSG_HOME_OFFSET_X = _UxGT("X Kezdö eltol.");
+ LSTR MSG_HOME_OFFSET_Y = _UxGT("Y Kezdö eltol.");
+ LSTR MSG_HOME_OFFSET_Z = _UxGT("Z Kezdö eltol.");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Eltolás beállítva.");
+ LSTR MSG_TRAMMING_WIZARD = _UxGT("Elektromos varázsló");
+ LSTR MSG_SELECT_ORIGIN = _UxGT("Eredeti választása");
+ LSTR MSG_LAST_VALUE_SP = _UxGT("Utolsó érték ");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Fütés ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Fütés ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Fej");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Fej ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Mind");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Ágy");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Fütés ") PREHEAT_1_LABEL _UxGT(" Beáll");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Fütés $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Fütés $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Fütés $ Fej");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Fütés $ Fej ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Fütés $ Mind");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Fütés $ Ágy");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Fütés $ Beáll");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Egyedi elömelegítés");
+ LSTR MSG_COOLDOWN = _UxGT("Visszahütés");
+
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia");
+ LSTR MSG_LASER_MENU = _UxGT("Lézer vezérlés");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Orsó vezérlés");
+ LSTR MSG_LASER_POWER = _UxGT("Lézer telj.");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Orsó telj.");
+ LSTR MSG_LASER_TOGGLE = _UxGT("Lézer váltás");
+ LSTR MSG_LASER_EVAC_TOGGLE = _UxGT("Hütés váltás");
+ LSTR MSG_LASER_ASSIST_TOGGLE = _UxGT("Levegö segéd");
+ LSTR MSG_LASER_PULSE_MS = _UxGT("Impulzus teszt ms");
+ LSTR MSG_LASER_FIRE_PULSE = _UxGT("Tüz impulzus");
+ LSTR MSG_FLOWMETER_FAULT = _UxGT("Áramlási hiba");
+ LSTR MSG_SPINDLE_TOGGLE = _UxGT("Orsóváltás");
+ LSTR MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Vákuum váltás");
+ LSTR MSG_SPINDLE_FORWARD = _UxGT("Orsó elöre");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Orsó hátra");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Bekapcsolás");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Kikapcsolás");
+ LSTR MSG_EXTRUDE = _UxGT("Adagol");
+ LSTR MSG_RETRACT = _UxGT("Visszahúz");
+ LSTR MSG_MOVE_AXIS = _UxGT("Tengelyek mozgatása");
+ LSTR MSG_BED_LEVELING = _UxGT("Ágy szintezés");
+ LSTR MSG_LEVEL_BED = _UxGT("Ágy szintezése");
+ LSTR MSG_BED_TRAMMING = _UxGT("Sarok szint");
+ LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Ágy emelése a szonda váltásig");
+ LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Minden sarok tolerancián belül. Szint jó.");
+ LSTR MSG_BED_TRAMMING_GOOD_POINTS = _UxGT("Jó pontok: ");
+ LSTR MSG_BED_TRAMMING_LAST_Z = _UxGT("Utolsó Z: ");
+ LSTR MSG_NEXT_CORNER = _UxGT("Következö sarok");
+ LSTR MSG_MESH_EDITOR = _UxGT("Háló szerkesztö");
+ LSTR MSG_EDIT_MESH = _UxGT("Háló szerkesztése");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Háló szerk. állj");
+ LSTR MSG_PROBING_POINT = _UxGT("Próbapont");
+ LSTR MSG_MESH_X = _UxGT("Index X");
+ LSTR MSG_MESH_Y = _UxGT("Index Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Z érték");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Egyéni parancs");
+ LSTR MSG_M48_TEST = _UxGT("M48 Szonda teszt");
+ LSTR MSG_M48_POINT = _UxGT("M48 Pont");
+ LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Szonda határon kívül");
+ LSTR MSG_M48_DEVIATION = _UxGT("Eltérés");
+ LSTR MSG_IDEX_MENU = _UxGT("IDEX mód");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Eszköz eltolás");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Automata parkolás");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikálás");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Tükrözött másolás");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Teljes felügyelet");
+ LSTR MSG_IDEX_DUPE_GAP = _UxGT("X-hézag másolása");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2. fej Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2. fej @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Szintezz! G29");
+ LSTR MSG_UBL_TOOLS = _UxGT("UBL eszköz");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Egységes ágy szint");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Döntési pont");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Kézi háló építés");
+ LSTR MSG_UBL_MESH_WIZARD = _UxGT("UBL Háló varázsló");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Tégy alátétet és mérj");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Mérés");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Üres ágyat mérj");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Továbblépés");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("UBL aktívál");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL deaktívál");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Ágy höfok");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Egyéni ágy höfok");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Fejhöfok");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Egyéni fejhöfok");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Háló szerkesztés");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Egyéni háló szerkesztés");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Finomított háló");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Háló kész");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Egyéni háló építés");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Háló építés");
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Háló építés ($)");
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Hideg háló építés");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Háló magasság állítás");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Magasság összege");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Háló elfogadás");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló elfogadás ($)");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valódi háló elfogadása");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 Ágy fütés");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fej fütés");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Kézi alapozás...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Fix hosszúságú alap");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Alapozás kész");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 Törölve");
+ LSTR MSG_G26_LEAVING = _UxGT("Kilépö G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Ágy háló folyt.");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Háló szintezés");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Pontos szintezés");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Rács szintezés");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Háló szint");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Oldal pontok");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Térkép típus");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Háló térkép kimenet");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host kimenet");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV kimenet");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Nyomtató bizt.mentés");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("UBL infó kimenet");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Kitöltési költség");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Kézi kitöltés");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Okos kitöltés");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Háló kitöltés");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Minden érvénytelen");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Közelebbi érvénytelen");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Mindet finomhangolja");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Közelebbi finomhangolása");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Háló tárolás");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Memória foglalat");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Ágy háló betöltés");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Ágy háló mentés");
+ LSTR MSG_MESH_LOADED = _UxGT("M117 Háló %i betöltve");
+ LSTR MSG_MESH_SAVED = _UxGT("M117 Háló %i mentve");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Nincs tároló");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Hiba: UBL mentés");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Hiba: UBL visszaáll.");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-eltolás: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-eltolás leállítva");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Lépésröl lépésre UBL");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Hideg háló készítés");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligens kitöltés");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Háló érvényesítés");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Minden finomítása");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Háló érvényesítés");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Minden finomítása");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7. Ágy háló mentése");
+
+ LSTR MSG_LED_CONTROL = _UxGT("LED vezérlés");
+ LSTR MSG_LEDS = _UxGT("Világítás");
+ LSTR MSG_LED_PRESETS = _UxGT("Beállított színek");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Piros");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Narancs");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Sárga");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Zöld");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Kék");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Indigó");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Viola");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Fehér");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Alapérték");
+ LSTR MSG_LED_CHANNEL_N = _UxGT("Csatorna =");
+ LSTR MSG_LEDS2 = _UxGT("LED-ek #2");
+ LSTR MSG_NEO2_PRESETS = _UxGT("Fény #2 megadott");
+ LSTR MSG_NEO2_BRIGHTNESS = _UxGT("Fényerö");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Egyéni szín");
+ LSTR MSG_INTENSITY_R = _UxGT("Piros intenzitás");
+ LSTR MSG_INTENSITY_G = _UxGT("Zöld intenzitás");
+ LSTR MSG_INTENSITY_B = _UxGT("Kék intenzitás");
+ LSTR MSG_INTENSITY_W = _UxGT("Fehér intenzitás");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Fényerö");
+
+ LSTR MSG_MOVING = _UxGT("Mozgás...");
+ LSTR MSG_FREE_XY = _UxGT("XY szabad");
+ LSTR MSG_MOVE_X = _UxGT("X mozgás");
+ LSTR MSG_MOVE_Y = _UxGT("Y mozgás");
+ LSTR MSG_MOVE_Z = _UxGT("Z mozgás");
+ LSTR MSG_MOVE_N = _UxGT("@ mozgás");
+ LSTR MSG_MOVE_E = _UxGT("Adagoló");
+ LSTR MSG_MOVE_EN = _UxGT("Adagoló *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("A fej túl hideg");
+ LSTR MSG_MOVE_N_MM = _UxGT("Mozgás $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Mozgás 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Mozgás 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Mozgás 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Mozgás 100mm");
+ LSTR MSG_MOVE_0001IN = _UxGT("Mozgás 0.025mm");
+ LSTR MSG_MOVE_001IN = _UxGT("Mozgás 0.254mm");
+ LSTR MSG_MOVE_01IN = _UxGT("Mozgás 2.54mm");
+ LSTR MSG_MOVE_1IN = _UxGT("Mozgáá 25.4mm");
+ LSTR MSG_SPEED = _UxGT("Sebesség");
+ LSTR MSG_BED_Z = _UxGT("Z ágy");
+ LSTR MSG_NOZZLE = _UxGT("Fej");
+ LSTR MSG_NOZZLE_N = _UxGT("Fej ~");
+ LSTR MSG_NOZZLE_PARKED = _UxGT("Fej parkolva");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Fej készenlétbe");
+ LSTR MSG_BED = _UxGT("Ágy");
+ LSTR MSG_CHAMBER = _UxGT("Burkolat");
+ LSTR MSG_COOLER = _UxGT("Lézer hütövíz");
+ LSTR MSG_COOLER_TOGGLE = _UxGT("Hütö kapcsoló");
+ LSTR MSG_FLOWMETER_SAFETY = _UxGT("Áramlásbiztonság");
+ LSTR MSG_LASER = _UxGT("Lézer");
+ LSTR MSG_FAN_SPEED = _UxGT("Hütés sebesség");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Hütés sebesség =");
+ LSTR MSG_STORED_FAN_N = _UxGT("Tárolt hütés =");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Extra hütés sebesség");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra hütés sebesség =");
+ LSTR MSG_CONTROLLER_FAN = _UxGT("Hütésvezérlés");
+ LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Alapjárat");
+ LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Automatikus mód");
+ LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív sebesség");
+ LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("Készenlét");
+ LSTR MSG_FLOW = _UxGT("Folyás");
+ LSTR MSG_FLOW_N = _UxGT("Folyás ~");
+ LSTR MSG_CONTROL = _UxGT("Konfiguráció");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Minimum");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Maximum");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Tényezö");
+ LSTR MSG_AUTOTEMP = _UxGT("Automata höfok");
+ LSTR MSG_LCD_ON = _UxGT("Be");
+ LSTR MSG_LCD_OFF = _UxGT("Ki");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("PID hangolás");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID hangolás *");
+ LSTR MSG_PID_CYCLE = _UxGT("PID ciklus");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("PID hangolás kész");
+ LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Hangolási hiba! Rossz adagoló.");
+ LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Hangolási hiba! Magas hömérséklet.");
+ LSTR MSG_PID_TIMEOUT = _UxGT("Hangolási hiba! Idötúllépés.");
+ LSTR MSG_SELECT = _UxGT("Kiválaszt");
+ LSTR MSG_SELECT_E = _UxGT("Kiválaszt *");
+ LSTR MSG_ACC = _UxGT("Gyorsítás");
+ LSTR MSG_JERK = _UxGT("Rántás");
+ LSTR MSG_VA_JERK = _UxGT("Seb.") STR_A _UxGT("-Rántás");
+ LSTR MSG_VB_JERK = _UxGT("Seb.") STR_B _UxGT("-Rántás");
+ LSTR MSG_VC_JERK = _UxGT("Seb.") STR_C _UxGT("-Rántás");
+ LSTR MSG_VN_JERK = _UxGT("Seb.@-Rántás");
+ LSTR MSG_VE_JERK = _UxGT("E ránt. seb.");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Csomopont eltérés");
+ LSTR MSG_MAX_SPEED = _UxGT("Max Sebesség (mm/s)");
+ LSTR MSG_VMAX_A = _UxGT("Max Seb. ") STR_A;
+ LSTR MSG_VMAX_B = _UxGT("Max Seb. ") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("Max Seb. ") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("Max Seb. @");
+ LSTR MSG_VMAX_E = _UxGT("Max Seb. E");
+ LSTR MSG_VMAX_EN = _UxGT("Max sebesség *");
+ LSTR MSG_VMIN = _UxGT("Min sebesség");
+ LSTR MSG_VTRAV_MIN = _UxGT("Min utazó.seb.");
+ LSTR MSG_ACCELERATION = _UxGT("Gyorsulás");
+ LSTR MSG_AMAX_A = _UxGT("Max gyors. ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Max gyors. ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Max gyors. ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Max gyors. @");
+ LSTR MSG_AMAX_E = _UxGT("Max gyors. E");
+ LSTR MSG_AMAX_EN = _UxGT("Max gyorsulás *");
+ LSTR MSG_A_RETRACT = _UxGT("Visszahúzás");
+ LSTR MSG_A_TRAVEL = _UxGT("Utazás");
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("Max frekvencia");
+ LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Min elötolás");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Lépés/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" Lépés/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" Lépés/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" Lépés/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ lépés/mm");
+ LSTR MSG_E_STEPS = _UxGT("E lépés/mm");
+ LSTR MSG_EN_STEPS = _UxGT("*Lépés/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Höfok");
+ LSTR MSG_MOTION = _UxGT("Mozgatások");
+ LSTR MSG_FILAMENT = _UxGT("Nyomtatószál");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E mm³-ben");
+ LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit mm³-ben");
+ LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *");
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Szál. átm.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Szál. átm. *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Kiadás mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Betöltés mm");
+ LSTR MSG_ADVANCE_K = _UxGT("Haladó K");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Haladó K *");
+ LSTR MSG_CONTRAST = _UxGT("LCD kontraszt");
+ LSTR MSG_STORE_EEPROM = _UxGT("Mentés EEPROM");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Betöltés EEPROM");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Alapértelmezett");
+ LSTR MSG_INIT_EEPROM = _UxGT("EEPROM inicializálás");
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("Hiba: EEPROM CRC");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Hiba: EEPROM index");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Hiba: EEPROM verzió");
+ LSTR MSG_SETTINGS_STORED = _UxGT("Beállítások mentve");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Tároló frissítés");
+ LSTR MSG_RESET_PRINTER = _UxGT("Nyomtató újraindítása");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Frissítés");
+ LSTR MSG_INFO_SCREEN = _UxGT("");
+ LSTR MSG_PREPARE = _UxGT("Vezérlés");
+ LSTR MSG_TUNE = _UxGT("Hangolás");
+ LSTR MSG_POWER_MONITOR = _UxGT("Teljesítménymonitor");
+ LSTR MSG_CURRENT = _UxGT("Jelenlegi");
+ LSTR MSG_VOLTAGE = _UxGT("Feszültség");
+ LSTR MSG_POWER = _UxGT("Energia");
+ LSTR MSG_START_PRINT = _UxGT("Nyomtatás indítása");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Tovább");
+ LSTR MSG_BUTTON_INIT = _UxGT("Kezdet");
+ LSTR MSG_BUTTON_STOP = _UxGT("Állj");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Nyomtatás");
+ LSTR MSG_BUTTON_RESET = _UxGT("Újraindítás");
+ LSTR MSG_BUTTON_IGNORE = _UxGT("Mellöz");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Mégse");
+ LSTR MSG_BUTTON_DONE = _UxGT("Kész");
+ LSTR MSG_BUTTON_BACK = _UxGT("Vissza");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Folytatás");
+ LSTR MSG_BUTTON_SKIP = _UxGT("Kihagy");
+ LSTR MSG_PAUSING = _UxGT("Szüneteltetve...");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Nyomtatás szünetelés");
+ LSTR MSG_RESUME_PRINT = _UxGT("Nyomtatás folytatása");
+ LSTR MSG_HOST_START_PRINT = _UxGT("Hoszt indítás");
+ LSTR MSG_STOP_PRINT = _UxGT("Nyomtatás leállítása");
+ LSTR MSG_END_LOOPS = _UxGT("Hurok ismétlés vége");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Objektum nyomtatása");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Objektum törlése");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Objektum törlése =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Kiesés helyreáll.");
+ LSTR MSG_MEDIA_MENU = _UxGT("Nyomtatás tárolóról");
+ LSTR MSG_NO_MEDIA = _UxGT("Nincs tároló");
+ LSTR MSG_DWELL = _UxGT("Alvás...");
+ LSTR MSG_USERWAIT = _UxGT("Katt a folytatáshoz...");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Nyomtatás szünetelve");
+ LSTR MSG_PRINTING = _UxGT("Nyomtatás...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Nyomtatás leállítva");
+ LSTR MSG_PRINT_DONE = _UxGT("Nyomtatás kész");
+ LSTR MSG_NO_MOVE = _UxGT("Nincs mozgás.");
+ LSTR MSG_KILLED = _UxGT("HALOTT! ");
+ LSTR MSG_STOPPED = _UxGT("MEGÁLLT! ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Visszahúzás mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Visszahúzás cs. mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Viszahúzás");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Ugrás mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Visszah.helyre mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.visszah.helyre mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Visszahúzás V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S Vissza.h V");
+ LSTR MSG_AUTORETRACT = _UxGT("Auto visszah.");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás távolság");
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra csere");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Tisztítási távolság");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Szerszámcsere");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z emelés");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Fösebesség");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Visszah. sebesség");
+ LSTR MSG_FILAMENT_PARK_ENABLED = _UxGT("Fej parkolás");
+ LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Visszav.visszah. sebesség");
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("FAN sebesség");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("FAN idö");
+ LSTR MSG_TOOL_MIGRATION_ON = _UxGT("Auto BE");
+ LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("Auto KI");
+ LSTR MSG_TOOL_MIGRATION = _UxGT("Szerszámcsere");
+ LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("Automata csere");
+ LSTR MSG_TOOL_MIGRATION_END = _UxGT("Utolsó adagoló");
+ LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("Csere *");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Szálcsere");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Szálcsere *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Szál betöltés");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Szál betöltés *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Szál eltávolítás");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Szál eltávolítás *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Mindet eltávolít");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Tároló");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Tároló csere");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Tároló Kiadása");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z szonda tálcán kivül");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Ferdeség faktor");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Önteszt");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Visszaállítás");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Elhelyez");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Telepít");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("SW-Mód");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mód");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mód");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Módok");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("BLTouch 5V mód");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("BLTouch OD mód");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Jelentés");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("VESZÉLY: A rossz beállítások kárt okozhatnak! Biztos továbblép?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Kezd TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Z eltolás teszt");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Mentés");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI használ");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Z-Szonda telepítés");
+ LSTR MSG_MANUAL_STOW = _UxGT("Z-Szonda elhelyezés");
+ LSTR MSG_HOME_FIRST = _UxGT("Elöször %s%s%s kell");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Szonda eltolások");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("X szonda eltolás");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Y szonda eltolás");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Z szonda eltolás");
+ LSTR MSG_MOVE_NOZZLE_TO_BED = _UxGT("Fej az ágyhoz");
+ LSTR MSG_BABYSTEP_X = _UxGT("Mikrolépés X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Mikrolépés Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Mikrolépés Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Mikrolépés @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Teljes");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Végállás megszakítva!");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Fütés hiba!");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Hiba: SZÜKSÉGTELEN HÖFOK");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("FÜTÉS KIMARADÁS");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("ÁGY FÜTÉS KIMARADÁS");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMRA FÜTÉS KIMARADÁS");
+ LSTR MSG_THERMAL_RUNAWAY_COOLER = _UxGT("Hütés kimaradás");
+ LSTR MSG_COOLING_FAILED = _UxGT("Hütés sikertelen");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Hiba: MAX höfok");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Hiba: MIN höfok");
+ LSTR MSG_HALTED = _UxGT("A NYOMTATÓ LEÁLLT");
+ LSTR MSG_PLEASE_RESET = _UxGT("Indítsd újra!");
+ LSTR MSG_SHORT_DAY = _UxGT("n"); // Csak egy karakter
+ LSTR MSG_SHORT_HOUR = _UxGT("ó"); // Csak egy karakter
+ LSTR MSG_SHORT_MINUTE = _UxGT("p"); // Csak egy karakter
+ LSTR MSG_HEATING = _UxGT("Fütés...");
+ LSTR MSG_COOLING = _UxGT("Hütés...");
+ LSTR MSG_BED_HEATING = _UxGT("Ágy fütés...");
+ LSTR MSG_BED_COOLING = _UxGT("Ágy hütés...");
+ LSTR MSG_PROBE_HEATING = _UxGT("Szonda fütése...");
+ LSTR MSG_PROBE_COOLING = _UxGT("Szonda hütése...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Kamra fütés...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Kamra hütés...");
+ LSTR MSG_LASER_COOLING = _UxGT("Lézer hütés...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta kalibráció");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("X kalibrálás");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Y kalibrálás");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Z kalibrálás");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Központ kalibrálás");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Delta beállítások");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto kalibráció");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Diag rúd");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Magasság");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Sugár");
+ LSTR MSG_INFO_MENU = _UxGT("A Nyomtatóról");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Nyomtató infó");
+ LSTR MSG_3POINT_LEVELING = _UxGT("3-Pontos szintezés");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Lineáris szintezés");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Bilineáris szintezés");
+ LSTR MSG_UBL_LEVELING = _UxGT("Egységes ágy szintezés");
+ LSTR MSG_MESH_LEVELING = _UxGT("Háló szintezés");
+ LSTR MSG_MESH_DONE = _UxGT("Háló szintezés kész");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Statisztikák");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Alaplap infó");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termisztorok");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Adagolók");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Átviteli sebesség");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protokol");
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Futáselemzés: KI");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Futáselemzés: BE");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Fej üresjárati idök.");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Munkalámpa");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Fényerösség");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("HELYTELEN NYOMTATÓ");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Nyomtatás számláló");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Befejezett");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Összes nyomtatási idö");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Leghosszabb munkaidö");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Összes anyag");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Nyomtatások");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Befejezett");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Összes");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Leghosszabb");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Kiadott");
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Min höfok");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Max höfok");
+ LSTR MSG_INFO_PSU = _UxGT("PSU");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Meghajtási erö");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ meghajtó %");
+ LSTR MSG_ERROR_TMC = _UxGT("TMC CSATLAKOZÁSI HIBA");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM írása");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("NYOMTATÓSZÁL CSERE");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("NYOMTATÁS SZÜNETEL");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("SZÁL BETÖLTÉS");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("SZÁL ELTÁVOLÍTÁS");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("FOLYTATÁSI OPCIÓ:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Tisztítsd meg");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Folytatás");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Fej: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Túlfutás szenzor");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Túlfutás táv. mm");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Tájolási hiba");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Szondázás hiba");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SZÁLVÁLASZTÁS");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU szoftver feltöltése!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU figyelmeztetés.");
+ LSTR MSG_MMU2_RESUME = _UxGT("Nyomtatás folytatása");
+ LSTR MSG_MMU2_RESUMING = _UxGT("Folytatás...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("Szál betöltése");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("Összes betöltése");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Fej betöltése");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("Szál kidobás");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Szál kidobás ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Kiadja a szálat");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Szál betölt. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Szál kidobás. ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Szál kiadása....");
+ LSTR MSG_MMU2_ALL = _UxGT("Mind");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Nyomtatószál ~");
+ LSTR MSG_MMU2_RESET = _UxGT("MMU újraindítás");
+ LSTR MSG_MMU2_RESETTING = _UxGT("MMU újraindul...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Kidob, kattint");
+
+ LSTR MSG_MIX = _UxGT("Kever");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Összetevö =");
+ LSTR MSG_MIXER = _UxGT("Keverö");
+ LSTR MSG_GRADIENT = _UxGT("Színátm.");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Teljes színátm.");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Váltás keverésre");
+ LSTR MSG_CYCLE_MIX = _UxGT("Ciklikus keverés");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Színátm. keverés");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Fordított színátm.");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Aktív V-szerszám");
+ LSTR MSG_START_VTOOL = _UxGT("Kezdés V-szerszám");
+ LSTR MSG_END_VTOOL = _UxGT(" Vége V-szerszám");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Ál V-szerszám");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Újra V-szerszám");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Gyors V-szerszám Kev.");
+ LSTR MSG_VTOOLS_RESET = _UxGT("V-szersz. visszaáll.");
+ LSTR MSG_START_Z = _UxGT("Kezdés Z:");
+ LSTR MSG_END_Z = _UxGT(" Vége Z:");
+
+ LSTR MSG_GAMES = _UxGT("Játékok");
+ LSTR MSG_BRICKOUT = _UxGT("Brickout");
+ LSTR MSG_INVADERS = _UxGT("Invaders");
+ LSTR MSG_SNAKE = _UxGT("Sn4k3");
+ LSTR MSG_MAZE = _UxGT("Maze");
+
+ LSTR MSG_BAD_PAGE = _UxGT("Rossz oldalindex");
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("Rossz oldalsebesség");
+
+ LSTR MSG_EDIT_PASSWORD = _UxGT("Jelszó szerkesztése");
+ LSTR MSG_LOGIN_REQUIRED = _UxGT("Belépés szükséges");
+ LSTR MSG_PASSWORD_SETTINGS = _UxGT("Jelszóbeállítások");
+ LSTR MSG_ENTER_DIGIT = _UxGT("Írja be a számokat");
+ LSTR MSG_CHANGE_PASSWORD = _UxGT("Jelszó Beáll/Szerk");
+ LSTR MSG_REMOVE_PASSWORD = _UxGT("Jelszó törlése");
+ LSTR MSG_PASSWORD_SET = _UxGT("A jelszó ");
+ LSTR MSG_START_OVER = _UxGT("Újrakezdés");
+ LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Mentsd el!");
+ LSTR MSG_PASSWORD_REMOVED = _UxGT("Jelszó törölve");
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nyomj gombot", "nyomtatás folytatáshoz"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Várj míg", "szálcsere", "indítás"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Szál behelyezés", "majd nyomj gombot", "a folytatáshoz"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nyomj gombot", "a fej fütéséhez"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Fej fütése", "Kérlek várj..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Várj a", "szál kiadására"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Várj a", "szál betöltésére"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Várj a", "szál tisztításra"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Kattints a készre", "szál tiszta"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Várj a nyomtatóra", "majd folytat..."));
+ #else
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Katt a folytatáshoz"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Kérlek várj..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Behelyez majd katt"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Katt a fütéshez"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Fütés..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Kiadás..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Betöltés..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Tisztítás..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Katt ha kész"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Folytatás..."));
+ #endif
+ LSTR MSG_TMC_DRIVERS = _UxGT("TMC meghajtók");
+ LSTR MSG_TMC_CURRENT = _UxGT("Meghajtó áram");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hibrid küszöbérték");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Motoros kezdöpont");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Léptetö mód");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop mód");
+ LSTR MSG_SERVICE_RESET = _UxGT("Újraindítás");
+ LSTR MSG_SERVICE_IN = _UxGT(" be:");
+ LSTR MSG_BACKLASH = _UxGT("Holtjáték");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Korrekció");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Simítás");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("X tengely szint");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Önkalibrálás");
+ #if ENABLED(TOUCH_UI_FTDI_EVE)
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Tétlenségi idökorlát, a hömérséklet csökkent. Nyomd meg az OK gombot az ismételt felfütéshez, és újra a folytatáshoz.");
+ #else
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Fütés idökorlátja");
+ #endif
+ LSTR MSG_REHEAT = _UxGT("Újrafüt");
+ LSTR MSG_REHEATING = _UxGT("Újrafütés...");
+
+ LSTR MSG_PROBE_WIZARD = _UxGT("Z szonda varázsló");
+ LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Z referencia mérés");
+ LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Menj a próba pontra");
+
+ LSTR MSG_SOUND = _UxGT("Hang");
+
+ LSTR MSG_TOP_LEFT = _UxGT("Bal felsö");
+ LSTR MSG_BOTTOM_LEFT = _UxGT("Bal alsó");
+ LSTR MSG_TOP_RIGHT = _UxGT("Jobb felsö");
+ LSTR MSG_BOTTOM_RIGHT = _UxGT("Jobb alsó");
+ LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Kalibrálás befejezve");
+ LSTR MSG_CALIBRATION_FAILED = _UxGT("Kalibrálási hiba");
+
+ LSTR MSG_DRIVER_BACKWARD = _UxGT(" meghajtók hátra");
+
+ LSTR MSG_SD_CARD = _UxGT("SD Kártya");
+ LSTR MSG_USB_DISK = _UxGT("USB Lemez");
+}
+
+#if FAN_COUNT == 1
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED
+#else
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N
+#endif
diff --git a/src/lcd/language/language_it.h b/src/lcd/language/language_it.h
new file mode 100644
index 0000000..f0c21de
--- /dev/null
+++ b/src/lcd/language/language_it.h
@@ -0,0 +1,821 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Italian
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ *
+ * Substitutions are applied for the following characters when used in menu items titles:
+ *
+ * $ displays an inserted string
+ * = displays '0'....'10' for indexes 0 - 10
+ * ~ displays '1'....'11' for indexes 0 - 10
+ * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL)
+ * @ displays an axis name such as XYZUVW, or E for an extruder
+ */
+
+#define DISPLAY_CHARSET_ISO10646_1
+
+namespace Language_it {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 1;
+ LSTR LANGUAGE = _UxGT("Italiano");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" pronta.");
+ LSTR MSG_YES = _UxGT("Si");
+ LSTR MSG_NO = _UxGT("No");
+ LSTR MSG_HIGH = _UxGT("ALTO");
+ LSTR MSG_LOW = _UxGT("BASSO");
+ LSTR MSG_BACK = _UxGT("Indietro");
+ LSTR MSG_ERROR = _UxGT("Errore");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Annullando...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Media inserito");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Media rimosso");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Aspettando media");
+ LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Iniz.Media fallita");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Err.leggendo media");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Dispos.USB rimosso");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("Avvio USB fallito");
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Overflow subchiamate");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Finecor."); // Max 8 characters
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Finecorsa Soft");
+ LSTR MSG_MAIN = _UxGT("Menu principale");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Impostaz. avanzate");
+ LSTR MSG_TOOLBAR_SETUP = _UxGT("Cnf barra strumenti");
+ LSTR MSG_OPTION_DISABLED = _UxGT("Opzione disab.");
+ LSTR MSG_CONFIGURATION = _UxGT("Configurazione");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Esegui files auto");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Disabilita Motori");
+ LSTR MSG_DEBUG_MENU = _UxGT("Menu di debug");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test barra avanzam.");
+ LSTR MSG_HOMING = _UxGT("Azzeramento");
+ LSTR MSG_AUTO_HOME = _UxGT("Auto Home");
+ LSTR MSG_AUTO_HOME_A = _UxGT("Home @");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Home X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Home Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Home Z");
+ LSTR MSG_FILAMENT_SET = _UxGT("Impostaz.filamento");
+ LSTR MSG_FILAMENT_MAN = _UxGT("Gestione filamento");
+ LSTR MSG_MANUAL_LEVELING = _UxGT("Livel.manuale");
+ LSTR MSG_LEVBED_FL = _UxGT("Davanti Sinistra");
+ LSTR MSG_LEVBED_FR = _UxGT("Davanti Destra");
+ LSTR MSG_LEVBED_C = _UxGT("Centro");
+ LSTR MSG_LEVBED_BL = _UxGT("Dietro Sinistra");
+ LSTR MSG_LEVBED_BR = _UxGT("Dietro Destra");
+ LSTR MSG_MANUAL_MESH = _UxGT("Mesh Manuale");
+ LSTR MSG_AUTO_MESH = _UxGT("Generaz.Autom.Mesh");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Allineam.automat. Z");
+ LSTR MSG_ITERATION = _UxGT("Iterazione G34: %i");
+ LSTR MSG_DECREASING_ACCURACY = _UxGT("Precisione in calo!");
+ LSTR MSG_ACCURACY_ACHIEVED = _UxGT("Precisione raggiunta");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Home assi XYZ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Premi per iniziare");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Punto successivo");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Livel. terminato!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Fade Height");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Imp. offset home");
+ LSTR MSG_HOME_OFFSET_X = _UxGT("Offset home X");
+ LSTR MSG_HOME_OFFSET_Y = _UxGT("Offset home Y");
+ LSTR MSG_HOME_OFFSET_Z = _UxGT("Offset home Z");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Offset applicato");
+ LSTR MSG_TRAMMING_WIZARD = _UxGT("Wizard Tramming");
+ LSTR MSG_SELECT_ORIGIN = _UxGT("Selez. origine");
+ LSTR MSG_LAST_VALUE_SP = _UxGT("Ultimo valore ");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Preriscalda ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Preriscalda ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Ugello ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Tutto");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" Piatto");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Preris.") PREHEAT_1_LABEL _UxGT(" conf");
+ #ifdef PREHEAT_2_LABEL
+ LSTR MSG_PREHEAT_2 = _UxGT("Preris.") PREHEAT_2_LABEL;
+ LSTR MSG_PREHEAT_2_SETTINGS = _UxGT("Preris.") PREHEAT_2_LABEL _UxGT(" conf");
+ #endif
+ #ifdef PREHEAT_3_LABEL
+ LSTR MSG_PREHEAT_3 = _UxGT("Preris.") PREHEAT_3_LABEL;
+ LSTR MSG_PREHEAT_3_SETTINGS = _UxGT("Preris.") PREHEAT_3_LABEL _UxGT(" conf");
+ #endif
+ LSTR MSG_PREHEAT_M = _UxGT("Preriscalda $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Preriscalda $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Preris.$ Ugello");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Preris.$ Ugello ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Preris.$ Tutto");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preris.$ Piatto");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preris.$ conf");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Prerisc.personal.");
+ LSTR MSG_COOLDOWN = _UxGT("Raffredda");
+
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("Frequenza");
+ LSTR MSG_LASER_MENU = _UxGT("Controllo laser");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Controllo mandrino");
+ LSTR MSG_LASER_POWER = _UxGT("Potenza laser");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Potenza mandrino");
+ LSTR MSG_LASER_TOGGLE = _UxGT("Alterna Laser");
+ LSTR MSG_LASER_EVAC_TOGGLE = _UxGT("Alterna soffiatore");
+ LSTR MSG_LASER_ASSIST_TOGGLE = _UxGT("Alterna aria supp.");
+ LSTR MSG_LASER_PULSE_MS = _UxGT("ms impulso di test");
+ LSTR MSG_LASER_FIRE_PULSE = _UxGT("Spara impulso");
+ LSTR MSG_FLOWMETER_FAULT = _UxGT("Err.flusso refrig.");
+ LSTR MSG_SPINDLE_TOGGLE = _UxGT("Alterna mandrino");
+ LSTR MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Alterna vuoto");
+ LSTR MSG_SPINDLE_FORWARD = _UxGT("Mandrino in avanti");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Inverti mandrino");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Accendi aliment.");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Spegni aliment.");
+ LSTR MSG_EXTRUDE = _UxGT("Estrudi");
+ LSTR MSG_RETRACT = _UxGT("Ritrai");
+ LSTR MSG_MOVE_AXIS = _UxGT("Muovi Asse");
+ LSTR MSG_BED_LEVELING = _UxGT("Livella piano");
+ LSTR MSG_LEVEL_BED = _UxGT("Livella piano");
+ LSTR MSG_BED_TRAMMING = _UxGT("Tarat.fine piano");
+ LSTR MSG_BED_TRAMMING_MANUAL = _UxGT("Tarat.fine Manuale");
+ LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Regola la vite finché la sonda non rileva il piano.");
+ LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Tolleranza raggiunta su tutti gli angoli. Piano livellato!");
+ LSTR MSG_BED_TRAMMING_GOOD_POINTS = _UxGT("Punti buoni: ");
+ LSTR MSG_BED_TRAMMING_LAST_Z = _UxGT("Ultimo Z: ");
+ LSTR MSG_NEXT_CORNER = _UxGT("Prossimo punto");
+ LSTR MSG_MESH_EDITOR = _UxGT("Editor Mesh");
+ LSTR MSG_MESH_VIEWER = _UxGT("Visualiz. Mesh");
+ LSTR MSG_EDIT_MESH = _UxGT("Modifica Mesh");
+ LSTR MSG_MESH_VIEW = _UxGT("Visualizza Mesh");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Modif. Mesh Fermata");
+ LSTR MSG_NO_VALID_MESH = _UxGT("Mesh non valida");
+ LSTR MSG_ACTIVATE_MESH = _UxGT("Attiva livellamento");
+ LSTR MSG_PROBING_POINT = _UxGT("Punto sondato");
+ LSTR MSG_MESH_X = _UxGT("Indice X");
+ LSTR MSG_MESH_Y = _UxGT("Indice Y");
+ LSTR MSG_MESH_INSET = _UxGT("Mesh Inset");
+ LSTR MSG_MESH_MIN_X = _UxGT("Mesh X minimo");
+ LSTR MSG_MESH_MAX_X = _UxGT("Mesh X massimo");
+ LSTR MSG_MESH_MIN_Y = _UxGT("Mesh Y minimo");
+ LSTR MSG_MESH_MAX_Y = _UxGT("Mesh Y massimo");
+ LSTR MSG_MESH_AMAX = _UxGT("Massimizza area");
+ LSTR MSG_MESH_CENTER = _UxGT("Area centrale");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Valore di Z");
+ LSTR MSG_MESH_CANCEL = _UxGT("Mesh cancellato");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Comandi personaliz.");
+ LSTR MSG_M48_TEST = _UxGT("Test sonda M48");
+ LSTR MSG_M48_POINT = _UxGT("Punto M48");
+ LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda oltre i limiti");
+ LSTR MSG_M48_DEVIATION = _UxGT("Deviazione");
+ LSTR MSG_IDEX_MENU = _UxGT("Modo IDEX");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Strumenti Offsets");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicazione");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia speculare");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Pieno controllo");
+ LSTR MSG_IDEX_DUPE_GAP = _UxGT("X-Gap-X duplicato");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2° ugello Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2° ugello @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("G29 in corso");
+ LSTR MSG_UBL_TOOLS = _UxGT("Strumenti UBL");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Livel.letto unificato");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Punto inclinaz.");
+ LSTR MSG_UBL_TILT_MESH = _UxGT("Inclina Mesh");
+ LSTR MSG_UBL_TILTING_GRID = _UxGT("Dim.griglia inclin.");
+ LSTR MSG_UBL_MESH_TILTED = _UxGT("Mesh inclinata");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Mesh Manuale");
+ LSTR MSG_UBL_MESH_WIZARD = _UxGT("Creaz.guid.mesh UBL");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Metti spes. e misura");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Misura");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Rimuovi e mis.piatto");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Spostamento succes.");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Attiva UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Disattiva UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Piatto");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp. Piatto");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Ugello");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp. Ugello");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Modifica Mesh");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Modif.Mesh personal.");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Ritocca Mesh");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Modif.Mesh fatta");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Crea Mesh personal.");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Crea Mesh");
+ #if HAS_PREHEAT
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Crea Mesh ($)");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Valida Mesh ($)");
+ #endif
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Crea Mesh a freddo");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Aggiusta Alt. Mesh");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Altezza");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Valida Mesh");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 riscald.letto");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 riscald.ugello");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Priming manuale...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Prime a lung.fissa");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Priming terminato");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 Annullato");
+ LSTR MSG_G26_LEAVING = _UxGT("Uscita da G26");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valida Mesh pers.");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Continua Mesh");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Livell. Mesh");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Livell. 3 Punti");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Livell. Griglia Mesh");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Livella Mesh");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Punti laterali");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Tipo di Mappa");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Esporta Mappa");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Esporta per Host");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Esporta in CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Backup esterno");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Esporta Info UBL");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Riempimento");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Riempimento Manuale");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Riempimento Smart");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Riempimento Mesh");
+ LSTR MSG_UBL_MESH_FILLED = _UxGT("Pts mancanti riempiti");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Invalida Tutto");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalid.Punto Vicino");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Ritocca Tutto");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ritocca Punto Vicino");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Salvate");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Slot di memoria");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Carica Mesh Piatto");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Salva Mesh Piatto");
+ LSTR MSG_UBL_INVALID_SLOT = _UxGT("Prima selez. uno slot Mesh");
+ LSTR MSG_MESH_LOADED = _UxGT("Mesh %i caricata");
+ LSTR MSG_MESH_SAVED = _UxGT("Mesh %i salvata");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Nessuna memoria");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Err: Salvataggio UBL");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Err: Ripristino UBL");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Fermato");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL passo passo");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Crea Mesh a freddo");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2.Riempimento Smart");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Valida Mesh");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ritocca All");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Valida Mesh");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ritocca All");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7.Salva Mesh Piatto");
+
+ LSTR MSG_LED_CONTROL = _UxGT("Controllo LED");
+ LSTR MSG_LEDS = _UxGT("Luci");
+ LSTR MSG_LED_PRESETS = _UxGT("Presets luce");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Rosso");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Arancione");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Giallo");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Verde");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Blu");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Indaco");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Viola");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Bianco");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Predefinito");
+ LSTR MSG_LED_CHANNEL_N = _UxGT("Canale =");
+ LSTR MSG_LEDS2 = _UxGT("Luci #2");
+ LSTR MSG_NEO2_PRESETS = _UxGT("Presets luce #2");
+ LSTR MSG_NEO2_BRIGHTNESS = _UxGT("Luminosità");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Luci personalizzate");
+ LSTR MSG_INTENSITY_R = _UxGT("Intensità rosso");
+ LSTR MSG_INTENSITY_G = _UxGT("Intensità verde");
+ LSTR MSG_INTENSITY_B = _UxGT("Intensità blu");
+ LSTR MSG_INTENSITY_W = _UxGT("Intensità bianco");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Luminosità");
+
+ LSTR MSG_MOVING = _UxGT("In movimento...");
+ LSTR MSG_FREE_XY = _UxGT("XY liberi");
+ LSTR MSG_MOVE_X = _UxGT("Muovi X");
+ LSTR MSG_MOVE_Y = _UxGT("Muovi Y");
+ LSTR MSG_MOVE_Z = _UxGT("Muovi Z");
+ LSTR MSG_MOVE_N = _UxGT("Muovi @");
+ LSTR MSG_MOVE_E = _UxGT("Estrusore");
+ LSTR MSG_MOVE_EN = _UxGT("Estrusore *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Ugello freddo");
+ LSTR MSG_MOVE_N_MM = _UxGT("Muovi di $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Muovi di 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Muovi di 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Muovi di 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Muovi di 100mm");
+ LSTR MSG_MOVE_0001IN = _UxGT("Muovi di 0.001\"");
+ LSTR MSG_MOVE_001IN = _UxGT("Muovi di 0.01\"");
+ LSTR MSG_MOVE_01IN = _UxGT("Muovi di 0.1\"");
+ LSTR MSG_MOVE_1IN = _UxGT("Muovi di 1\"");
+ LSTR MSG_SPEED = _UxGT("Velocità");
+ LSTR MSG_BED_Z = _UxGT("Piatto Z");
+ LSTR MSG_NOZZLE = _UxGT("Ugello");
+ LSTR MSG_NOZZLE_N = _UxGT("Ugello ~");
+ LSTR MSG_NOZZLE_PARKED = _UxGT("Ugello parcheggiato");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Ugello in pausa");
+ LSTR MSG_BED = _UxGT("Piatto");
+ LSTR MSG_CHAMBER = _UxGT("Camera");
+ LSTR MSG_COOLER = _UxGT("Raffreddam. laser");
+ LSTR MSG_COOLER_TOGGLE = _UxGT("Alterna raffreddam.");
+ LSTR MSG_FLOWMETER_SAFETY = _UxGT("Sicurezza flusso");
+ LSTR MSG_LASER = _UxGT("Laser");
+ LSTR MSG_FAN_SPEED = _UxGT("Vel. ventola"); // Max 15 characters
+ LSTR MSG_FAN_SPEED_N = _UxGT("Vel. ventola ~"); // Max 15 characters
+ LSTR MSG_STORED_FAN_N = _UxGT("Ventola mem. ~"); // Max 15 characters
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Extra vel.vent."); // Max 15 characters
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra v.vent. ~"); // Max 15 characters
+ LSTR MSG_CONTROLLER_FAN = _UxGT("Controller vent.");
+ LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Vel. inattivo");
+ LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Modo autom.");
+ LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("Vel. attivo");
+ LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("Tempo inattivo");
+ LSTR MSG_FLOW = _UxGT("Flusso");
+ LSTR MSG_FLOW_N = _UxGT("Flusso ~");
+ LSTR MSG_CONTROL = _UxGT("Controllo");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact");
+ LSTR MSG_AUTOTEMP = _UxGT("Autotemp");
+ LSTR MSG_LCD_ON = _UxGT("On");
+ LSTR MSG_LCD_OFF = _UxGT("Off");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("Calibrazione PID");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("Calib.PID *");
+ LSTR MSG_PID_CYCLE = _UxGT("Ciclo PID");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("Calibr.PID eseguita");
+ LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Calibr.PID fallito!");
+ LSTR MSG_BAD_EXTRUDER_NUM = _UxGT("Estrusore invalido.");
+ LSTR MSG_TEMP_TOO_HIGH = _UxGT("Temp.troppo alta.");
+ LSTR MSG_TIMEOUT = _UxGT("Tempo scaduto.");
+ LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Calibrazione fallita! Estrusore errato.");
+ LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Calibrazione fallita! Temperatura troppo alta.");
+ LSTR MSG_PID_TIMEOUT = _UxGT("Calibrazione fallita! Tempo scaduto.");
+ LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Testing heat loss");
+ LSTR MSG_MPC_AUTOTUNE = _UxGT("MPC Autotune");
+ LSTR MSG_MPC_EDIT = _UxGT("Modif.MPC *");
+ LSTR MSG_MPC_POWER_E = _UxGT("Potenza *");
+ LSTR MSG_MPC_BLOCK_HEAT_CAPACITY_E = _UxGT("C blocco *");
+ LSTR MSG_SENSOR_RESPONSIVENESS_E = _UxGT("Reattiv.Sens. *");
+ LSTR MSG_MPC_AMBIENT_XFER_COEFF_E = _UxGT("H ambiente *");
+ LSTR MSG_MPC_AMBIENT_XFER_COEFF_FAN_E = _UxGT("H Amb. vent. *");
+ LSTR MSG_SELECT = _UxGT("Seleziona");
+ LSTR MSG_SELECT_E = _UxGT("Seleziona *");
+ LSTR MSG_ACC = _UxGT("Accel");
+ LSTR MSG_JERK = _UxGT("Jerk");
+ LSTR MSG_VA_JERK = _UxGT("Max Jerk ") STR_A;
+ LSTR MSG_VB_JERK = _UxGT("Max Jerk ") STR_B;
+ LSTR MSG_VC_JERK = _UxGT("Max Jerk ") STR_C;
+ LSTR MSG_VN_JERK = _UxGT("Max Jerk @");
+ LSTR MSG_VE_JERK = _UxGT("Max Jerk E");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Deviaz. giunzioni");
+ LSTR MSG_MAX_SPEED = _UxGT("Vel.massima (mm/s)");
+ LSTR MSG_VMAX_A = _UxGT("Vel.Massima ") STR_A;
+ LSTR MSG_VMAX_B = _UxGT("Vel.Massima ") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("Vel.Massima ") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("Vel.Massima @");
+ LSTR MSG_VMAX_E = _UxGT("Vel.Massima E");
+ LSTR MSG_VMAX_EN = _UxGT("Vel.Massima *");
+ LSTR MSG_VMIN = _UxGT("Vel.Minima");
+ LSTR MSG_VTRAV_MIN = _UxGT("Vel.Min spostam.");
+ LSTR MSG_ACCELERATION = _UxGT("Accelerazione");
+ LSTR MSG_AMAX_A = _UxGT("Acc.Massima ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Acc.Massima ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Acc.Massima ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Acc.Massima @");
+ LSTR MSG_AMAX_E = _UxGT("Acc.Massima E");
+ LSTR MSG_AMAX_EN = _UxGT("Acc.Massima *");
+ LSTR MSG_A_RETRACT = _UxGT("A-Ritrazione");
+ LSTR MSG_A_TRAVEL = _UxGT("A-Spostamento");
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("Frequenza max");
+ LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Feed min");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Passi/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" passi/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" passi/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" passi/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ passi/mm");
+ LSTR MSG_E_STEPS = _UxGT("E passi/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* passi/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperatura");
+ LSTR MSG_MOTION = _UxGT("Movimento");
+ LSTR MSG_FILAMENT = _UxGT("Filamento");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("Limite E in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("Limite E *");
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Diam. filo");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Diam. filo *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Rimuovi mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Carica mm");
+ LSTR MSG_ADVANCE_K = _UxGT("K Avanzamento");
+ LSTR MSG_ADVANCE_K_E = _UxGT("K Avanzamento *");
+ LSTR MSG_CONTRAST = _UxGT("Contrasto LCD");
+ LSTR MSG_BRIGHTNESS = _UxGT("Luminosità LCD");
+ LSTR MSG_LCD_TIMEOUT_SEC = _UxGT("Timeout LCD (s)");
+ LSTR MSG_SCREEN_TIMEOUT = _UxGT("Timeout LCD (m)");
+ LSTR MSG_BRIGHTNESS_OFF = _UxGT("Spegni Retroillum.");
+ LSTR MSG_STORE_EEPROM = _UxGT("Salva impostazioni");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Carica impostazioni");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Ripristina imp.");
+ LSTR MSG_INIT_EEPROM = _UxGT("Inizializza EEPROM");
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("Err: CRC EEPROM");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Err: Indice EEPROM");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Err: Versione EEPROM");
+ LSTR MSG_SETTINGS_STORED = _UxGT("Impostazioni mem.");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Aggiorna media");
+ LSTR MSG_RESET_PRINTER = _UxGT("Resetta stampante");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Aggiorna");
+ LSTR MSG_INFO_SCREEN = _UxGT("Schermata info");
+ LSTR MSG_INFO_MACHINENAME = _UxGT("Nome macchina");
+ LSTR MSG_INFO_SIZE = _UxGT("Dimens.");
+ LSTR MSG_INFO_FWVERSION = _UxGT("Versione firmware");
+ LSTR MSG_INFO_BUILD = _UxGT("Dataora compilaz.");
+ LSTR MSG_PREPARE = _UxGT("Prepara");
+ LSTR MSG_TUNE = _UxGT("Regola");
+ LSTR MSG_POWER_MONITOR = _UxGT("Controllo aliment.");
+ LSTR MSG_CURRENT = _UxGT("Corrente");
+ LSTR MSG_VOLTAGE = _UxGT("Tensione");
+ LSTR MSG_POWER = _UxGT("Potenza");
+ LSTR MSG_START_PRINT = _UxGT("Avvia stampa");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Prossimo");
+ LSTR MSG_BUTTON_INIT = _UxGT("Inizializza");
+ LSTR MSG_BUTTON_STOP = _UxGT("Stop");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Stampa");
+ LSTR MSG_BUTTON_RESET = _UxGT("Resetta");
+ LSTR MSG_BUTTON_IGNORE = _UxGT("Ignora");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Annulla");
+ LSTR MSG_BUTTON_CONFIRM = _UxGT("Conferma");
+ LSTR MSG_BUTTON_CONTINUE = _UxGT("Continua");
+ LSTR MSG_BUTTON_DONE = _UxGT("Fatto");
+ LSTR MSG_BUTTON_BACK = _UxGT("Indietro");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Procedi");
+ LSTR MSG_BUTTON_SKIP = _UxGT("Salta");
+ LSTR MSG_BUTTON_INFO = _UxGT("Info");
+ LSTR MSG_BUTTON_LEVEL = _UxGT("Livello");
+ LSTR MSG_BUTTON_PAUSE = _UxGT("Pausa");
+ LSTR MSG_BUTTON_RESUME = _UxGT("Riprendi");
+ LSTR MSG_BUTTON_ADVANCED = _UxGT("Avanzato");
+ LSTR MSG_BUTTON_SAVE = _UxGT("Memorizza");
+ LSTR MSG_BUTTON_PURGE = _UxGT("Spurga");
+ LSTR MSG_PAUSING = _UxGT("Messa in pausa...");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pausa stampa");
+ LSTR MSG_ADVANCED_PAUSE = _UxGT("Pausa Avanzata");
+ LSTR MSG_RESUME_PRINT = _UxGT("Riprendi stampa");
+ LSTR MSG_HOST_START_PRINT = _UxGT("Host Avvio");
+ LSTR MSG_STOP_PRINT = _UxGT("Arresta stampa");
+ LSTR MSG_END_LOOPS = _UxGT("Fine cicli di rip.");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Stampa Oggetto");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Cancella Oggetto");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Canc. Oggetto =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Ripresa da PowerLoss");
+ LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Cont.proc.stampa");
+ LSTR MSG_MEDIA_MENU = _UxGT("Stampa da media");
+ LSTR MSG_NO_MEDIA = _UxGT("Media non presente");
+ LSTR MSG_DWELL = _UxGT("Sospensione...");
+ LSTR MSG_USERWAIT = _UxGT("Premi tasto..");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Stampa sospesa");
+ LSTR MSG_PRINTING = _UxGT("Stampa...");
+ LSTR MSG_STOPPING = _UxGT("Fermata...");
+ LSTR MSG_REMAINING_TIME = _UxGT("Rimanente");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Stampa Annullata");
+ LSTR MSG_PRINT_DONE = _UxGT("Stampa Eseguita");
+ LSTR MSG_PRINTER_KILLED = _UxGT("Stampante uccisa!");
+ LSTR MSG_TURN_OFF = _UxGT("Spegni stampante");
+ LSTR MSG_NO_MOVE = _UxGT("Nessun Movimento");
+ LSTR MSG_KILLED = _UxGT("UCCISO. ");
+ LSTR MSG_STOPPED = _UxGT("ARRESTATO. ");
+ LSTR MSG_FWRETRACT = _UxGT("Ritraz.da firmware");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Ritrai mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Scamb. Ritrai mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Ritrai V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Salta mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Avanza mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Scamb. Avanza mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Avanza V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Scamb. Avanza V");
+ LSTR MSG_AUTORETRACT = _UxGT("AutoRitrai");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Lunghezza scambio");
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra scambio");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Lunghezza spurgo");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Cambio utensile");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Risalita Z");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Velocità innesco");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Velocità ritrazione");
+ LSTR MSG_FILAMENT_PARK_ENABLED = _UxGT("Parcheggia testa");
+ LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Recover Speed");
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Velocità ventola");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Tempo ventola");
+ LSTR MSG_TOOL_MIGRATION_ON = _UxGT("Auto ON");
+ LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF");
+ LSTR MSG_TOOL_MIGRATION = _UxGT("Migrazione utensile");
+ LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-migrazione");
+ LSTR MSG_TOOL_MIGRATION_END = _UxGT("Ultimo estrusore");
+ LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("Migra a *");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Cambia filamento");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Cambia filam. *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Carica filamento");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Carica filamento *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Rimuovi filamento");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Rimuovi filam. *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Rimuovi tutto");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Collega media");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Cambia media");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Rilascia media");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z probe fuori piatto");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Fattore distorsione");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Autotest BLTouch");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Resetta BLTouch");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Estendi BLTouch");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("BLTouch modo SW");
+ LSTR MSG_BLTOUCH_SPEED_MODE = _UxGT("Alta Velocità");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("BLTouch modo 5V");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("BLTouch modo OD");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("BLTouch modo mem.");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Metti BLTouch a 5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Metti BLTouch a OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Segnala modo");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("PERICOLO: impostazioni errate possono cause danni! Procedo comunque?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Inizializ.TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Test Z offset");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Memorizzare");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Estendi TouchMI");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Estendi Sonda-Z");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Ritrai BLTouch");
+ LSTR MSG_MANUAL_STOW = _UxGT("Ritrai Sonda-Z");
+ LSTR MSG_HOME_FIRST = _UxGT("Home %s%s%s prima");
+ LSTR MSG_ZPROBE_SETTINGS = _UxGT("Impostazioni sonda");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Offsets sonda");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("Offset X sonda");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Offset Y sonda");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Offset Z sonda");
+ LSTR MSG_ZPROBE_MARGIN = _UxGT("Margine sonda");
+ LSTR MSG_Z_FEED_RATE = _UxGT("Velocità Z");
+ LSTR MSG_ENABLE_HS_MODE = _UxGT("Abilita modo HS");
+ LSTR MSG_MOVE_NOZZLE_TO_BED = _UxGT("Muovi ugel.su letto");
+ LSTR MSG_BABYSTEP_X = _UxGT("Babystep X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Babystep Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Babystep Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Babystep @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Totali");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Interrompi se FC");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Risc.Fallito"); // Max 12 characters
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP RIDONDANTE");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("TEMP FUORI CONTROLLO");
+ LSTR MSG_TEMP_MALFUNCTION = _UxGT("MALFUNZIONAMENTO TEMP");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("TEMP PIAT.FUORI CTRL");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("T.CAMERA FUORI CTRL");
+ LSTR MSG_THERMAL_RUNAWAY_COOLER = _UxGT("RAFFREDAM.FUORI CTRL");
+ LSTR MSG_COOLING_FAILED = _UxGT("Raffreddam. fallito");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Err: TEMP MASSIMA");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Err: TEMP MINIMA");
+ LSTR MSG_HALTED = _UxGT("STAMPANTE FERMATA");
+ LSTR MSG_PLEASE_WAIT = _UxGT("Attendere prego...");
+ LSTR MSG_PLEASE_RESET = _UxGT("Riavviare prego");
+ LSTR MSG_PREHEATING = _UxGT("Preriscaldam...");
+ LSTR MSG_HEATING = _UxGT("Riscaldamento...");
+ LSTR MSG_COOLING = _UxGT("Raffreddamento..");
+ LSTR MSG_BED_HEATING = _UxGT("Risc. piatto...");
+ LSTR MSG_BED_COOLING = _UxGT("Raffr. piatto...");
+ LSTR MSG_PROBE_HEATING = _UxGT("Risc. sonda...");
+ LSTR MSG_PROBE_COOLING = _UxGT("Raffr. sonda...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Risc. camera...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Raffr. camera...");
+ LSTR MSG_LASER_COOLING = _UxGT("Raffr. laser...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Calibraz. Delta");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Calibra X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Calibra Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Calibra Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibra centro");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Impostaz. Delta");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto calibrazione");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Barra Diagonale");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Altezza");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Raggio");
+ LSTR MSG_INFO_MENU = _UxGT("Info su stampante");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Info. stampante");
+ LSTR MSG_3POINT_LEVELING = _UxGT("Livel. a 3 punti");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Livel. Lineare");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Livel. Bilineare");
+ LSTR MSG_UBL_LEVELING = _UxGT("Livel.piatto unific.");
+ LSTR MSG_MESH_LEVELING = _UxGT("Livel. Mesh");
+ LSTR MSG_MESH_DONE = _UxGT("Sond.mesh eseguito");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Statistiche");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Info. scheda");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistori");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Estrusori");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Baud");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protocollo");
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Controllo fuga: OFF");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Controllo fuga: ON");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Timeout inatt.ugello");
+ LSTR MSG_FAN_SPEED_FAULT = _UxGT("Err.vel.della ventola");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Luci Case");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Luminosità Luci");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("STAMPANTE ERRATA");
+
+ LSTR MSG_COLORS_GET = _UxGT("Ottieni colori");
+ LSTR MSG_COLORS_SELECT = _UxGT("Selez.colori");
+ LSTR MSG_COLORS_APPLIED = _UxGT("Colori applicati");
+ LSTR MSG_COLORS_RED = _UxGT("Rosso");
+ LSTR MSG_COLORS_GREEN = _UxGT("Verde");
+ LSTR MSG_COLORS_BLUE = _UxGT("Blu");
+ LSTR MSG_COLORS_WHITE = _UxGT("Bianco");
+ LSTR MSG_UI_LANGUAGE = _UxGT("Lingua UI");
+ LSTR MSG_SOUND_ENABLE = _UxGT("Abilita suono");
+ LSTR MSG_LOCKSCREEN = _UxGT("Blocca Schermo");
+ LSTR MSG_LOCKSCREEN_LOCKED = _UxGT("Stamp. bloccata,");
+ LSTR MSG_LOCKSCREEN_UNLOCK = _UxGT("Scroll x sbloccare.");
+ LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Attendere fino al riavvio.");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Nessun supporto inserito.");
+ LSTR MSG_PLEASE_PREHEAT = _UxGT("Si prega di preriscaldare l'hot end.");
+ LSTR MSG_INFO_PRINT_COUNT_RESET = _UxGT("Azzera contatori stampa");
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Contatori stampa");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Tempo totale");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Lavoro più lungo");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Totale estruso");
+ #else
+ LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("No Supporto");
+ LSTR MSG_PLEASE_PREHEAT = _UxGT("Prerisc. hot end.");
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Stampe");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Durata");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Più lungo");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Estruso");
+ #endif
+
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Completate");
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Temp min");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Temp max");
+ LSTR MSG_INFO_PSU = _UxGT("Alimentatore");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Potenza Drive");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("Driver @ %");
+ LSTR MSG_ERROR_TMC = _UxGT("ERR.CONNESSIONE TMC");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Scrivi DAC EEPROM");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("CAMBIO FILAMENTO");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("STAMPA IN PAUSA");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARICA FILAMENTO");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("RIMUOVI FILAMENTO");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPZIONI RIPRESA:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Spurga di più");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Riprendi stampa");
+ LSTR MSG_FILAMENT_CHANGE_PURGE_CONTINUE = _UxGT("Spurga o continua?");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Ugello: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Sens.filo termin."); // Max 17 characters
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist mm filo term.");
+ LSTR MSG_RUNOUT_ENABLE = _UxGT("Abil.filo termin.");
+ LSTR MSG_RUNOUT_ACTIVE = _UxGT("Filo termin. attivo");
+ LSTR MSG_INVERT_EXTRUDER = _UxGT("Inverti estrusore");
+ LSTR MSG_EXTRUDER_MIN_TEMP = _UxGT("Temp.min estrusore");
+ LSTR MSG_FANCHECK = _UxGT("Verif.tacho vent."); // Max 17 characters
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Home fallito");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Sondaggio fallito");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SCELTA FILAMENTO");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("Agg.firmware MMU!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU chiede attenz.");
+ LSTR MSG_MMU2_RESUME = _UxGT("MMU riprendi");
+ LSTR MSG_MMU2_RESUMING = _UxGT("MMU ripresa...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU carica");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("MMU carica tutto");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Carica fino ugello");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU espelli");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU espelli ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU scarica");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Caric.fil. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Esplus.filam. ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Scaric.filam. ...");
+ LSTR MSG_MMU2_ALL = _UxGT("Tutto");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~");
+ LSTR MSG_MMU2_RESET = _UxGT("Azzera MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("Azzeramento MMU...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Rimuovi, click");
+
+ LSTR MSG_MIX = _UxGT("Miscela");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Componente =");
+ LSTR MSG_MIXER = _UxGT("Miscelatore");
+ LSTR MSG_GRADIENT = _UxGT("Gradiente");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Gradiente pieno");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Alterna miscela");
+ LSTR MSG_CYCLE_MIX = _UxGT("Ciclo miscela");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Miscela gradiente");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Inverti gradiente");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("V-tool attivo");
+ LSTR MSG_START_VTOOL = _UxGT("V-tool iniziale");
+ LSTR MSG_END_VTOOL = _UxGT("V-tool finale");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("V-tool alias");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Ripristina V-tools");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Commit mix V-tool");
+ LSTR MSG_VTOOLS_RESET = _UxGT("V-tools ripristin.");
+ LSTR MSG_START_Z = _UxGT("Z inizio:");
+ LSTR MSG_END_Z = _UxGT("Z fine:");
+
+ LSTR MSG_GAMES = _UxGT("Giochi");
+ LSTR MSG_BRICKOUT = _UxGT("Brickout");
+ LSTR MSG_INVADERS = _UxGT("Invaders");
+ LSTR MSG_SNAKE = _UxGT("Sn4k3");
+ LSTR MSG_MAZE = _UxGT("Maze");
+
+ LSTR MSG_BAD_PAGE = _UxGT("Indice pag. errato");
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("Vel. pag. errata");
+
+ LSTR MSG_EDIT_PASSWORD = _UxGT("Modif.password");
+ LSTR MSG_LOGIN_REQUIRED = _UxGT("Login richiesto");
+ LSTR MSG_PASSWORD_SETTINGS = _UxGT("Impostaz.password");
+ LSTR MSG_ENTER_DIGIT = _UxGT("Inserisci cifra");
+ LSTR MSG_CHANGE_PASSWORD = _UxGT("Imp./Modif.password");
+ LSTR MSG_REMOVE_PASSWORD = _UxGT("Elimina password");
+ LSTR MSG_PASSWORD_SET = _UxGT("La password è ");
+ LSTR MSG_START_OVER = _UxGT("Ricominciare");
+ LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Ricordati di mem.!");
+ LSTR MSG_PASSWORD_REMOVED = _UxGT("Password eliminata");
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Premi per", "riprendere", "la stampa"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parcheggiando..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Attendere avvio", "del cambio", "di filamento"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Inserisci il", "filamento e premi", "per continuare"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Premi per", "riscaldare ugello"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Riscaldam. ugello", "Attendere prego..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Attendere", "l'espulsione", "del filamento"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Attendere", "il caricamento", "del filamento"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Attendere", "lo spurgo", "del filamento"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Premi x terminare", "lo spurgo", "del filamento"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Attendere", "la ripresa", "della stampa..."));
+ #else // LCD_HEIGHT < 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Premi x continuare"));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Attendere..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Inserisci e premi"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Riscalda ugello"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Riscaldamento..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Espulsione..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Caricamento..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Spurgo filamento"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Premi x terminare"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Ripresa..."));
+ #endif // LCD_HEIGHT < 4
+
+ LSTR MSG_TMC_DRIVERS = _UxGT("Driver TMC");
+ LSTR MSG_TMC_CURRENT = _UxGT("Correnti driver");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Soglia modo ibrido");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless homing");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stealthchop");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Stealthchop");
+
+ LSTR MSG_SERVICE_RESET = _UxGT("Resetta");
+ LSTR MSG_SERVICE_IN = _UxGT(" tra:");
+
+ LSTR MSG_BACKLASH = _UxGT("Gioco");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Correzione");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Appianamento");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("Livello asse X");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Auto Calibra");
+ #if ENABLED(TOUCH_UI_FTDI_EVE)
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Timeout inattività, temperatura diminuita. Premere OK per riscaldare e riprendere di nuovo.");
+ #else
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Timeout riscaldatore");
+ #endif
+ LSTR MSG_REHEAT = _UxGT("Riscalda");
+ LSTR MSG_REHEATING = _UxGT("Riscaldando...");
+ LSTR MSG_REHEATDONE = _UxGT("Riscaldato");
+
+ LSTR MSG_PROBE_WIZARD = _UxGT("Wizard Z offset");
+ LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Altezza di riferimento sonda");
+ LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Spostati in posizione di rilevazione");
+
+ LSTR MSG_XATC = _UxGT("Proc.guid.X-Twist");
+ LSTR MSG_XATC_DONE = _UxGT("Proc.guid.X-Twist eseg.!");
+ LSTR MSG_XATC_UPDATE_Z_OFFSET = _UxGT("Agg.Offset-Z sonda a ");
+
+ LSTR MSG_SOUND = _UxGT("Suoni");
+
+ LSTR MSG_TOP_LEFT = _UxGT("Alto sinistra");
+ LSTR MSG_BOTTOM_LEFT = _UxGT("Basso sinistra");
+ LSTR MSG_TOP_RIGHT = _UxGT("Alto destra");
+ LSTR MSG_BOTTOM_RIGHT = _UxGT("Basso destra");
+ LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Calibrazione completata");
+ LSTR MSG_CALIBRATION_FAILED = _UxGT("Calibrazione fallita");
+
+ LSTR MSG_DRIVER_BACKWARD = _UxGT(" driver invertito");
+
+ LSTR MSG_SD_CARD = _UxGT("Scheda SD");
+ LSTR MSG_USB_DISK = _UxGT("Disco USB");
+
+ LSTR MSG_HOST_SHUTDOWN = _UxGT("Arresta host");
+}
diff --git a/src/lcd/language/language_jp_kana.h b/src/lcd/language/language_jp_kana.h
new file mode 100644
index 0000000..bc8c9ba
--- /dev/null
+++ b/src/lcd/language/language_jp_kana.h
@@ -0,0 +1,249 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Japanese (Kana)
+ * UTF-8 for Graphical Display
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+//#define DISPLAY_CHARSET_ISO10646_KANA
+
+namespace Language_jp_kana {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 3;
+ LSTR LANGUAGE = _UxGT("Japanese");
+
+ // This is just to show the potential benefit of Unicode.
+ // This translation can be improved by using the full charset of unicode codeblock U+30A0 to U+30FF.
+
+ // 片仮名表示定義
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" ジュンビカンリョウ");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("メディアガソウニュウサレマシタ"); // "Card inserted"
+ LSTR MSG_MEDIA_REMOVED = _UxGT("メディアガアリマセン"); // "Card removed"
+ LSTR MSG_RELEASE_MEDIA = _UxGT("メディアノトリダシ");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("エンドストップ"); // "Endstops" // Max length 8 characters
+ LSTR MSG_MAIN = _UxGT("メイン"); // "Main"
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("ジドウカイシ"); // "Autostart"
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("モーターデンゲン オフ"); // "Disable steppers"
+ LSTR MSG_DEBUG_MENU = _UxGT("デバッグメニュー"); // "Debug Menu"
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("プログレスバー テスト"); // "Progress Bar Test"
+ LSTR MSG_AUTO_HOME = _UxGT("ゲンテンフッキ"); // "Auto home"
+ LSTR MSG_AUTO_HOME_X = _UxGT("Xジク ゲンテンフッキ"); // "Home X"
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Yジク ゲンテンフッキ"); // "Home Y"
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Zジク ゲンテンフッキ"); // "Home Z"
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("ゲンテンフッキチュウ"); // "Homing XYZ"
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("レベリングカイシ"); // "Click to Begin"
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("ツギノソクテイテンヘ"); // "Next Point"
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("レベリングカンリョウ"); // "Leveling Done!"
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("キジュンオフセットセッテイ"); // "Set home offsets"
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("オフセットガテキヨウサレマシタ"); // "Offsets applied"
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" ヨネツ"); // "Preheat " PREHEAT_1_LABEL
+ LSTR MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" ヨネツ ~"); // "Preheat " PREHEAT_1_LABEL
+ LSTR MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" ヨネツノズル"); // " Nozzle"
+ LSTR MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" ヨネツノズル ~"); // " Nozzle"
+ LSTR MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" スベテヨネツ"); // " All"
+ LSTR MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" ベッドヨネツ"); // " Bed"
+ LSTR MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" ヨネツセッテイ"); // " conf"
+
+ LSTR MSG_PREHEAT_M = _UxGT("$ ヨネツ"); // "Preheat " PREHEAT_1_LABEL
+ LSTR MSG_PREHEAT_M_H = _UxGT("$ ヨネツ ~"); // "Preheat " PREHEAT_1_LABEL
+ LSTR MSG_PREHEAT_M_END = _UxGT("$ ヨネツノズル"); // " Nozzle"
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("$ ヨネツノズル ~"); // " Nozzle"
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("$ スベテヨネツ"); // " All"
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("$ ベッドヨネツ"); // " Bed"
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("$ ヨネツセッテイ"); // " conf"
+ #endif
+ LSTR MSG_COOLDOWN = _UxGT("カネツテイシ"); // "Cooldown"
+ LSTR MSG_SWITCH_PS_ON = _UxGT("デンゲン オン"); // "Switch power on"
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("デンゲン オフ"); // "Switch power off"
+ LSTR MSG_EXTRUDE = _UxGT("オシダシ"); // "Extrude"
+ LSTR MSG_RETRACT = _UxGT("ヒキコミセッテイ"); // "Retract"
+ LSTR MSG_MOVE_AXIS = _UxGT("ジクイドウ"); // "Move axis"
+ LSTR MSG_BED_LEVELING = _UxGT("ベッドレベリング"); // "Bed leveling"
+ LSTR MSG_LEVEL_BED = _UxGT("ベッドレベリング"); // "Level bed"
+
+ LSTR MSG_MOVING = _UxGT("イドウチュウ"); // "Moving..."
+ LSTR MSG_FREE_XY = _UxGT("XYジク カイホウ"); // "Free XY"
+ LSTR MSG_MOVE_X = _UxGT("Xジク イドウ"); // "Move X"
+ LSTR MSG_MOVE_Y = _UxGT("Yジク イドウ"); // "Move Y"
+ LSTR MSG_MOVE_Z = _UxGT("Zジク イドウ"); // "Move Z"
+ LSTR MSG_MOVE_N = _UxGT("@ジク イドウ"); // "Move @"
+ LSTR MSG_MOVE_E = _UxGT("エクストルーダー"); // "Extruder"
+ LSTR MSG_MOVE_EN = _UxGT("* エクストルーダー"); // "En"
+ LSTR MSG_MOVE_N_MM = _UxGT("$mm イドウ"); // "Move 0.025mm"
+ LSTR MSG_MOVE_01MM = _UxGT("0.1mm イドウ"); // "Move 0.1mm"
+ LSTR MSG_MOVE_1MM = _UxGT(" 1mm イドウ"); // "Move 1mm"
+ LSTR MSG_MOVE_10MM = _UxGT(" 10mm イドウ"); // "Move 10mm"
+ LSTR MSG_MOVE_100MM = _UxGT(" 100mm イドウ"); // "Move 100mm"
+ LSTR MSG_SPEED = _UxGT("ソクド"); // "Speed"
+ LSTR MSG_BED_Z = _UxGT("Zオフセット"); // "Bed Z"
+ LSTR MSG_NOZZLE = _UxGT("ノズル"); // "Nozzle"
+ LSTR MSG_BED = _UxGT("ベッド"); // "Bed"
+ LSTR MSG_FAN_SPEED = _UxGT("ファンソクド"); // "Fan speed"
+ LSTR MSG_FLOW = _UxGT("トシュツリョウ"); // "Flow"
+ LSTR MSG_CONTROL = _UxGT("セイギョ"); // "Control"
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" サイテイ"); // " Min"
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" サイコウ"); // " Max"
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" ファクター"); // " Fact"
+ LSTR MSG_AUTOTEMP = _UxGT("ジドウオンドセイギョ"); // "Autotemp"
+ LSTR MSG_LCD_ON = _UxGT("オン"); // "On"
+ LSTR MSG_LCD_OFF = _UxGT("オフ"); // "Off"
+ LSTR MSG_SELECT = _UxGT("センタク"); // "Select"
+ LSTR MSG_SELECT_E = _UxGT("センタク *");
+ LSTR MSG_ACC = _UxGT("カソクド mm/s") SUPERSCRIPT_TWO; // "Accel"
+ LSTR MSG_JERK = _UxGT("ヤクドウ mm/s"); // "Jerk"
+ LSTR MSG_VA_JERK = _UxGT("ジク ヤクドウ mm/s") STR_A; // "Va-jerk"
+ LSTR MSG_VB_JERK = _UxGT("ジク ヤクドウ mm/s") STR_B; // "Vb-jerk"
+ LSTR MSG_VC_JERK = _UxGT("ジク ヤクドウ mm/s") STR_C; // "Vc-jerk"
+ LSTR MSG_VN_JERK = _UxGT("ジク ヤクドウ mm/s@"); // "V@-jerk"
+ LSTR MSG_A_STEPS = STR_A _UxGT("ステップ/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT("ステップ/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT("ステップ/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ステップ/mm");
+ LSTR MSG_VE_JERK = _UxGT("エクストルーダー ヤクド"); // "Ve-jerk"
+ LSTR MSG_VMAX_A = _UxGT("サイダイオクリソクド ") STR_A; // "Vmax A"
+ LSTR MSG_VMAX_B = _UxGT("サイダイオクリソクド ") STR_B; // "Vmax B"
+ LSTR MSG_VMAX_C = _UxGT("サイダイオクリソクド ") STR_C; // "Vmax C"
+ LSTR MSG_VMAX_E = _UxGT("サイダイオクリソクド E"); // "Vmax E"
+ LSTR MSG_VMAX_EN = _UxGT("サイダイオクリソクド *"); // "Vmax E1"
+ LSTR MSG_VMIN = _UxGT("サイショウオクリソクド"); // "Vmin"
+ LSTR MSG_VTRAV_MIN = _UxGT("サイショウイドウソクド"); // "VTrav min"
+ LSTR MSG_ACCELERATION = _UxGT("カソクド mm/s") SUPERSCRIPT_TWO; // "Accel"
+ LSTR MSG_A_RETRACT = _UxGT("ヒキコミカソクド"); // "A-retract"
+ LSTR MSG_A_TRAVEL = _UxGT("イドウカソクド"); // "A-travel"
+ LSTR MSG_TEMPERATURE = _UxGT("オンド"); // "Temperature"
+ LSTR MSG_MOTION = _UxGT("ウゴキセッテイ"); // "Motion"
+ LSTR MSG_FILAMENT = _UxGT("フィラメント"); // "Filament"
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("フィラメントチョッケイ"); // "Fil. Dia."
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("フィラメントチョッケイ *");
+ LSTR MSG_CONTRAST = _UxGT("LCDコントラスト"); // "LCD contrast"
+ LSTR MSG_STORE_EEPROM = _UxGT("EEPROMヘホゾン"); // "Store memory"
+ LSTR MSG_LOAD_EEPROM = _UxGT("EEPROMカラヨミコミ"); // "Load memory"
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("セッテイリセット"); // "Restore Defaults"
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("リフレッシュ"); // "Refresh"
+ LSTR MSG_INFO_SCREEN = _UxGT("ジョウホウガメン"); // "Info screen"
+ LSTR MSG_PREPARE = _UxGT("ジュンビセッテイ"); // "Prepare"
+ LSTR MSG_TUNE = _UxGT("チョウセイ"); // "Tune"
+ LSTR MSG_PAUSE_PRINT = _UxGT("イチジテイシ"); // "Pause print"
+ LSTR MSG_RESUME_PRINT = _UxGT("プリントサイカイ"); // "Resume print"
+ LSTR MSG_STOP_PRINT = _UxGT("プリントテイシ"); // "Stop print"
+ LSTR MSG_MEDIA_MENU = _UxGT("メディアカラプリント"); // "Print from SD"
+ LSTR MSG_NO_MEDIA = _UxGT("メディアガアリマセン"); // "Card removed"
+ LSTR MSG_DWELL = _UxGT("キュウシ"); // "Sleep..."
+ LSTR MSG_USERWAIT = _UxGT("ツヅケルニハクリックシテクダサイ"); // "Wait for user..."
+ LSTR MSG_PRINT_ABORTED = _UxGT("プリントガチュウシサレマシタ"); // "Print aborted"
+ LSTR MSG_NO_MOVE = _UxGT("ウゴキマセン"); // "No move."
+ LSTR MSG_KILLED = _UxGT("ヒジョウテイシ"); // "KILLED. "
+ LSTR MSG_STOPPED = _UxGT("テイシシマシタ"); // "STOPPED. "
+ LSTR MSG_CONTROL_RETRACT = _UxGT("ヒキコミリョウ mm"); // "Retract mm"
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("ヒキコミリョウS mm"); // "Swap Re.mm"
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("ヒキコミソクド mm/s"); // "Retract V"
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("ノズルタイヒ mm"); // "Hop mm"
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("ホショウリョウ mm"); // "Unretr. mm"
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("ホショウリョウS mm"); // "S Unretr. mm"
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("ホショウソクド mm/s"); // "Unretract V"
+ LSTR MSG_AUTORETRACT = _UxGT("ジドウヒキコミ"); // "Auto-Retract"
+ LSTR MSG_FILAMENTCHANGE = _UxGT("フィラメントコウカン"); // "Change filament"
+ LSTR MSG_ATTACH_MEDIA = _UxGT("メディアサイヨミコミ"); // "Init. SD card"
+ LSTR MSG_CHANGE_MEDIA = _UxGT("メディアコウカン"); // "Change SD card"
+ LSTR MSG_ZPROBE_OUT = _UxGT("Zプローブ ベッドガイ"); // "Z probe out. bed"
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch ジコシンダン"); // "BLTouch Self-Test"
+ LSTR MSG_BLTOUCH_RESET = _UxGT("BLTouch リセット"); // "Reset BLTouch"
+ LSTR MSG_HOME_FIRST = _UxGT("サキニ %s%s%s ヲフッキサセテクダサイ"); // "Home ... first"
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Zオフセット"); // "Z Offset"
+ LSTR MSG_BABYSTEP_X = _UxGT("Xジク ビドウ"); // "Babystep X"
+ LSTR MSG_BABYSTEP_Y = _UxGT("Yジク ビドウ"); // "Babystep Y"
+ LSTR MSG_BABYSTEP_Z = _UxGT("Zジク ビドウ"); // "Babystep Z"
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("イドウゲンカイケンチキノウ"); // "Endstop abort"
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("カネツシッパイ"); // "Heating failed"
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("エラー:ジョウチョウサーミスターキノウ"); // "Err: REDUNDANT TEMP"
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("ネツボウソウ"); // "THERMAL RUNAWAY"
+ LSTR MSG_ERR_MAXTEMP = _UxGT("エラー:サイコウオンチョウカ"); // "Err: MAXTEMP"
+ LSTR MSG_ERR_MINTEMP = _UxGT("エラー:サイテイオンミマン"); // "Err: MINTEMP"
+ LSTR MSG_HALTED = _UxGT("プリンターハテイシシマシタ"); // "PRINTER HALTED"
+ LSTR MSG_PLEASE_RESET = _UxGT("リセットシテクダサイ"); // "Please reset"
+ LSTR MSG_HEATING = _UxGT("カネツチュウ"); // "Heating..."
+ LSTR MSG_BED_HEATING = _UxGT("ベッド カネツチュウ"); // "Bed Heating..."
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("デルタ コウセイ"); // "Delta Calibration"
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Xジク コウセイ"); // "Calibrate X"
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Yジク コウセイ"); // "Calibrate Y"
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Zジク コウセイ"); // "Calibrate Z"
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("チュウシン コウセイ"); // "Calibrate Center"
+ LSTR MSG_INFO_MENU = _UxGT("コノプリンターニツイテ"); // "About Printer"
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("プリンタージョウホウ"); // "Printer Info"
+ LSTR MSG_INFO_STATS_MENU = _UxGT("プリントジョウキョウ"); // "Printer Stats"
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("セイギョケイジョウホウ"); // "Board Info"
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("サーミスター"); // "Thermistors"
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("エクストルーダースウ"); // "Extruders"
+ LSTR MSG_INFO_BAUDRATE = _UxGT("ボーレート"); // "Baud"
+ LSTR MSG_INFO_PROTOCOL = _UxGT("プロトコル"); // "Protocol"
+ LSTR MSG_CASE_LIGHT = _UxGT("キョウタイナイショウメイ"); // "Case light"
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("プリントスウ "); // "Print Count"
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("カンリョウスウ"); // "Completed"
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("プリントジカンルイケイ"); // "Total print time"
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("サイチョウプリントジカン"); // "Longest job time"
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("フィラメントシヨウリョウルイケイ"); // "Extruded total"
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("セッテイサイテイオン"); // "Min Temp"
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("セッテイサイコウオン"); // "Max Temp"
+ LSTR MSG_INFO_PSU = _UxGT("デンゲンシュベツ"); // "Power Supply"
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("モータークドウリョク"); // "Drive Strength"
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ DACシュツリョク %"); // "@ Driver %"
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("EEPROMヘホゾン"); // "Store memory"
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("イチジテイシ");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("プリントサイカイ"); // "Resume print"
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("コウカンヲカイシシマス", "シバラクオマチクダサイ")); // "Wait for start of the filament"
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("フィラメントヌキダシチュウ", "シバラクオマチクダサイ")); // "Wait for filament unload"
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("フィラメントヲソウニュウシ,", "クリックスルトゾッコウシマス")); // "Insert filament and press button"
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("フィラメントソウテンチュウ", "シバラクオマチクダサイ")); // "Wait for filament load"
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("プリントヲサイカイシマス", "シバラクオマチクダサイ")); // "Wait for print to resume"
+
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("マチガッタプリンター"); // "Wrong printer"
+
+ LSTR MSG_CONFIGURATION = _UxGT("セッテイカンリ");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("ショウサイセッテイ");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("コショカイフク");
+ LSTR MSG_INIT_EEPROM = _UxGT("EEPROMショキカ");
+
+ LSTR MSG_BUTTON_NEXT = _UxGT("ツギヘ");
+ LSTR MSG_BUTTON_INIT = _UxGT("ショキカ");
+ LSTR MSG_BUTTON_STOP = _UxGT("ストップ");
+ LSTR MSG_BUTTON_PRINT = _UxGT("プリント");
+ LSTR MSG_BUTTON_RESET = _UxGT("リセット");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("キャンセル");
+ LSTR MSG_BUTTON_DONE = _UxGT("カンリョウ");
+
+ LSTR MSG_YES = _UxGT("ハイ");
+ LSTR MSG_NO = _UxGT("イイエ");
+ LSTR MSG_BACK = _UxGT("モドリ");
+ LSTR MSG_MAX_SPEED = _UxGT("ソクド");
+ LSTR MSG_STEPS_PER_MM = _UxGT("ステップ/mm");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("ユーザーコマンド");
+ LSTR MSG_PRINT_PAUSED = _UxGT("プリントガイチジテイシサレマシタ");
+ LSTR MSG_PRINTING = _UxGT("プリントチュウ...");
+}
diff --git a/src/lcd/language/language_ko_KR.h b/src/lcd/language/language_ko_KR.h
new file mode 100644
index 0000000..50c73f6
--- /dev/null
+++ b/src/lcd/language/language_ko_KR.h
@@ -0,0 +1,106 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Korean
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+namespace Language_ko_KR {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 1;
+ LSTR LANGUAGE = _UxGT("Korean");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" 준비.");
+ LSTR MSG_BACK = _UxGT("뒤로");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("카드 삽입됨");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("카드 제거됨");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("엔드스탑");
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("소프트 엔드스탑");
+ LSTR MSG_MAIN = _UxGT("뒤로");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("고급 설정");
+ LSTR MSG_CONFIGURATION = _UxGT("설정");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("자동 시작");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("모터 정지");
+ LSTR MSG_DEBUG_MENU = _UxGT("디버깅 메뉴");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("프로그레스바 테스트");
+ LSTR MSG_AUTO_HOME = _UxGT("오토홈");
+ LSTR MSG_AUTO_HOME_X = _UxGT("X 홈으로");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Y 홈으로");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Z 홈으로");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("XYZ 홈으로");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("누르면 시작합니다");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("다음 Point");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("레벨링 완료!");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("예열하기 - ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("예열하기 - ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" 노즐");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("예열하기 - ") PREHEAT_1_LABEL _UxGT(" 노즐 ~");
+
+ LSTR MSG_PREHEAT_M = _UxGT("예열하기 - $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("예열하기 - $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("예열하기 - $ 노즐");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("예열하기 - $ 노즐 ~");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Custom 예열");
+ LSTR MSG_COOLDOWN = _UxGT("식히기");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("스위치 전원 켜기");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("스위치 전원 끄기");
+ LSTR MSG_EXTRUDE = _UxGT("밀어내기");
+ LSTR MSG_RETRACT = _UxGT("당기기");
+ LSTR MSG_MOVE_AXIS = _UxGT("축 이동");
+ LSTR MSG_BED_LEVELING = _UxGT("베드 레벨링");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("미러 사본");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("오토레벨링 하기");
+ LSTR MSG_NOZZLE = _UxGT("노즐");
+ LSTR MSG_NOZZLE_N = _UxGT("노즐 ~");
+ LSTR MSG_BED = _UxGT("베드");
+ LSTR MSG_FAN_SPEED = _UxGT("펜 속도");
+ LSTR MSG_FAN_SPEED_N = _UxGT("펜 속도 ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("엑스트라 펜 속도");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("엑스트라 펜 속도 ~");
+ LSTR MSG_TEMPERATURE = _UxGT("온도");
+ LSTR MSG_MOTION = _UxGT("동작");
+ LSTR MSG_STORE_EEPROM = _UxGT("설정 저장하기");
+ LSTR MSG_LOAD_EEPROM = _UxGT("설정 읽어오기");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("설정 되돌리기");
+ LSTR MSG_INIT_EEPROM = _UxGT("EEPROM 초기화");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("새로고침");
+ LSTR MSG_INFO_SCREEN = _UxGT("처음으로");
+ LSTR MSG_PREPARE = _UxGT("준비하기");
+ LSTR MSG_PAUSE_PRINT = _UxGT("일시정지");
+ LSTR MSG_RESUME_PRINT = _UxGT("재시작");
+ LSTR MSG_STOP_PRINT = _UxGT("출력중지");
+ LSTR MSG_MEDIA_MENU = _UxGT("SD 카드출력");
+ LSTR MSG_NO_MEDIA = _UxGT("SD 카드없음");
+ LSTR MSG_DWELL = _UxGT("슬립모드...");
+ LSTR MSG_PRINT_PAUSED = _UxGT("일시 정지됨");
+ LSTR MSG_PRINTING = _UxGT("출력중...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("취소됨");
+ LSTR MSG_KILLED = _UxGT("죽음. ");
+ LSTR MSG_STOPPED = _UxGT("멈춤. ");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("잘못된 프린터");
+}
diff --git a/src/lcd/language/language_nl.h b/src/lcd/language/language_nl.h
new file mode 100644
index 0000000..8aa74d7
--- /dev/null
+++ b/src/lcd/language/language_nl.h
@@ -0,0 +1,230 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Dutch
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_1
+#define NOT_EXTENDED_ISO10646_1_5X7
+
+namespace Language_nl {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 1;
+ LSTR LANGUAGE = _UxGT("Dutch");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" gereed.");
+ LSTR MSG_BACK = _UxGT("Terug");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Kaart ingestoken");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Kaart verwijderd");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
+ LSTR MSG_MAIN = _UxGT("Hoofdmenu");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Autostart");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Motoren uit");
+ LSTR MSG_DEBUG_MENU = _UxGT("Debug Menu"); // accepted English terms
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Vooruitgang Test");
+
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Klik voor begin");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Volgende Plaats");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Bed level kompl.");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Zet home offsets");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("H offset toegep.");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" voorverwarmen");
+ LSTR MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" voorverw. ~");
+ LSTR MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" voorverw. Einde");
+ LSTR MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" voorverw. Einde ~");
+ LSTR MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" voorverw. aan");
+ LSTR MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" voorverw. Bed");
+ LSTR MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" verw. conf");
+
+ LSTR MSG_PREHEAT_M = _UxGT("$ voorverwarmen");
+ LSTR MSG_PREHEAT_M_H = _UxGT("$ voorverw. ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("$ voorverw. Einde");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("$ voorverw. Einde ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("$ voorverw. aan");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("$ voorverw. Bed");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("$ verw. conf");
+ #endif
+ LSTR MSG_COOLDOWN = _UxGT("Afkoelen");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Stroom aan");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Stroom uit");
+ LSTR MSG_EXTRUDE = _UxGT("Extrude");
+ LSTR MSG_RETRACT = _UxGT("Retract");
+ LSTR MSG_MOVE_AXIS = _UxGT("As verplaatsen");
+ LSTR MSG_BED_LEVELING = _UxGT("Bed Leveling");
+ LSTR MSG_LEVEL_BED = _UxGT("Level bed");
+
+ LSTR MSG_MOVING = _UxGT("Verplaatsen...");
+ LSTR MSG_FREE_XY = _UxGT("Vrij XY");
+ LSTR MSG_MOVE_X = _UxGT("Verplaats X");
+ LSTR MSG_MOVE_Y = _UxGT("Verplaats Y");
+ LSTR MSG_MOVE_Z = _UxGT("Verplaats Z");
+ LSTR MSG_MOVE_N = _UxGT("Verplaats @");
+ LSTR MSG_MOVE_E = _UxGT("Extruder");
+ LSTR MSG_MOVE_EN = _UxGT("Extruder *");
+ LSTR MSG_MOVE_N_MM = _UxGT("Verplaats $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Verplaats 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Verplaats 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Verplaats 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Verplaats 100mm");
+ LSTR MSG_SPEED = _UxGT("Snelheid");
+ LSTR MSG_BED_Z = _UxGT("Bed Z");
+ LSTR MSG_NOZZLE = _UxGT("Nozzle");
+ LSTR MSG_NOZZLE_N = _UxGT("Nozzle ~");
+ LSTR MSG_BED = _UxGT("Bed");
+ LSTR MSG_FAN_SPEED = _UxGT("Fan snelheid");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Fan snelheid ~");
+ LSTR MSG_FLOW = _UxGT("Flow");
+ LSTR MSG_FLOW_N = _UxGT("Flow ~");
+ LSTR MSG_CONTROL = _UxGT("Control");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact");
+ LSTR MSG_AUTOTEMP = _UxGT("Autotemp");
+ LSTR MSG_LCD_ON = _UxGT("Aan");
+ LSTR MSG_LCD_OFF = _UxGT("Uit");
+ LSTR MSG_SELECT = _UxGT("Selecteer");
+ LSTR MSG_SELECT_E = _UxGT("Selecteer *");
+ LSTR MSG_ACC = _UxGT("Versn");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperatuur");
+ LSTR MSG_MOTION = _UxGT("Beweging");
+ LSTR MSG_FILAMENT = _UxGT("Filament");
+ LSTR MSG_ADVANCE_K = _UxGT("Advance K"); // accepted english dutch
+ LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *"); // accepted english dutch
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Fil. Dia.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *");
+ LSTR MSG_CONTRAST = _UxGT("LCD contrast");
+ LSTR MSG_STORE_EEPROM = _UxGT("Geheugen opslaan");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Geheugen laden");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Noodstop reset");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ververs");
+ LSTR MSG_INFO_SCREEN = _UxGT("Info scherm");
+ LSTR MSG_PREPARE = _UxGT("Voorbereiden");
+ LSTR MSG_TUNE = _UxGT("Afstellen");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Print pauzeren");
+ LSTR MSG_RESUME_PRINT = _UxGT("Print hervatten");
+ LSTR MSG_STOP_PRINT = _UxGT("Print stoppen");
+ LSTR MSG_MEDIA_MENU = _UxGT("Print van SD");
+ LSTR MSG_NO_MEDIA = _UxGT("Geen SD kaart");
+ LSTR MSG_DWELL = _UxGT("Slapen...");
+ LSTR MSG_USERWAIT = _UxGT("Wachten...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Print afgebroken");
+ LSTR MSG_NO_MOVE = _UxGT("Geen beweging.");
+ LSTR MSG_KILLED = _UxGT("Afgebroken. ");
+ LSTR MSG_STOPPED = _UxGT("Gestopt. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Retract mm"); // accepted English term in Dutch
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Ruil Retract mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Retract F");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Ruil Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretr. FR");
+ LSTR MSG_AUTORETRACT = _UxGT("Auto-Retract");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Verv. Filament");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Verv. Filament *");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Init. SD kaart");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Verv. SD Kaart");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z probe uit. bed");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Zelf-Test");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch");
+ LSTR MSG_HOME_FIRST = _UxGT("Home %s%s%s Eerst");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Z Offset"); // accepted English term in Dutch
+ LSTR MSG_BABYSTEP_X = _UxGT("Babystap X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Babystap Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Babystap Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Babystap @");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Endstop afbr.");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Voorverw. fout");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Redun. temp fout");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("Therm. wegloop");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Err: Max. temp");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Err: Min. temp");
+ LSTR MSG_HALTED = _UxGT("PRINTER GESTOPT");
+ LSTR MSG_PLEASE_RESET = _UxGT("Reset A.U.B.");
+ LSTR MSG_HEATING = _UxGT("Voorwarmen...");
+ LSTR MSG_BED_HEATING = _UxGT("Bed voorverw...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta Calibratie");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Kalibreer X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibreer Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibreer Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibreer Midden");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Delta conf");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibratie");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Case licht");
+
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Onjuiste printer");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Printed Aantal");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Totaal Voltooid");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Totale Printtijd");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Langste Printtijd");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Totaal Extrudeert");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Aantal");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Voltooid");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Printtijd ");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Langste");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extrud.");
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Min Temp");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Max Temp");
+ LSTR MSG_INFO_PSU = _UxGT("PSU"); // accepted English term in Dutch
+
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Motorstroom");
+
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("DAC Opslaan");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Hervat print");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozzle: "); // accepted English term
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ #if LCD_HEIGHT >= 4
+ // Up to 3 lines
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Wacht voor start", "filament te", "verwisselen"));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Wacht voor", "filament uit", "te laden"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klik knop om...", "verw. nozzle.")); //nozzle accepted English term
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozzle verw.", "Wacht a.u.b."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Laad filament", "en druk knop", "om verder..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Wacht voor", "filament te", "laden"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Wacht voor print", "om verder", "te gaan"));
+ #else
+ // Up to 2 lines
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Wacht voor", "start..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Wacht voor", "uitladen..."));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klik knop om...", "verw. nozzle.")); //nozzle accepted English term
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Verwarmen..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("Laad filament", "en druk knop"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Wacht voor", "inladen..."));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Wacht voor", "printing..."));
+ #endif
+}
diff --git a/src/lcd/language/language_pl.h b/src/lcd/language/language_pl.h
new file mode 100644
index 0000000..635866b
--- /dev/null
+++ b/src/lcd/language/language_pl.h
@@ -0,0 +1,549 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Polish - includes accented characters
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ *
+ * Substitutions are applied for the following characters when used in menu items titles:
+ *
+ * $ displays an inserted string
+ * = displays '0'....'10' for indexes 0 - 10
+ * ~ displays '1'....'11' for indexes 0 - 10
+ * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL)
+ * @ displays an axis name such as XYZUVW, or E for an extruder
+ */
+
+#define DISPLAY_CHARSET_ISO10646_PL
+
+namespace Language_pl {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Polski");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" gotowy.");
+ LSTR MSG_YES = _UxGT("TAK");
+ LSTR MSG_NO = _UxGT("NIE");
+ LSTR MSG_BACK = _UxGT("Wstecz");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Przerywanie...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Karta włożona");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Karta usunięta");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Oczekiwanie na kartę");
+ LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Błąd inicializacji karty");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Bład odczytu karty");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Urządzenie USB usunięte");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("Błąd uruchomienia USB");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Krańców."); // Max length 8 characters
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Progr. Krańcówki");
+ LSTR MSG_MAIN = _UxGT("Menu główne");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Ustawienie zaawansowane");
+ LSTR MSG_CONFIGURATION = _UxGT("Konfiguracja");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Autostart");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Wyłącz silniki");
+ LSTR MSG_DEBUG_MENU = _UxGT("Menu Debugowania");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Testowy pasek postępu");
+ LSTR MSG_AUTO_HOME = _UxGT("Pozycja zerowa");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Zeruj X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Zeruj Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Zeruj Z");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Autowyrównanie Z");
+ LSTR MSG_DECREASING_ACCURACY = _UxGT("Spadek dokładności!");
+ LSTR MSG_ACCURACY_ACHIEVED = _UxGT("Osiągnięto dokładność");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Pozycja zerowa");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Kliknij by rozp.");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Następny punkt");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Wypoziomowano!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Wys. zanikania");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Ust. poz. zer.");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Poz. zerowa ust.");
+ LSTR MSG_SELECT_ORIGIN = _UxGT("Wybierz punkt zero");
+ LSTR MSG_LAST_VALUE_SP = _UxGT("Poprzednia wartość ");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Rozgrzej ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Rozgrzej ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" Dysza ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" wsz.");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" stół");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Rozgrzej ") PREHEAT_1_LABEL _UxGT(" ustaw.");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Rozgrzej $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Rozgrzej $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Rozgrzej $ Dysza");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Rozgrzej $ Dysza ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Rozgrzej $ wsz.");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Rozgrzej $ stół");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Rozgrzej $ ustaw.");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Rozgrzej własne ust.");
+ LSTR MSG_COOLDOWN = _UxGT("Chłodzenie");
+
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("Częstotliwość");
+ LSTR MSG_LASER_MENU = _UxGT("Sterowanie Lasera");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Sterowanie wrzeciona");
+ LSTR MSG_LASER_POWER = _UxGT("Zasilanie Lasera");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Zasilanie wrzeciona");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Rewers wrzeciona");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Włącz zasilacz");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Wyłącz zasilacz");
+ LSTR MSG_EXTRUDE = _UxGT("Ekstruzja");
+ LSTR MSG_RETRACT = _UxGT("Wycofanie");
+ LSTR MSG_MOVE_AXIS = _UxGT("Ruch osi");
+ LSTR MSG_BED_LEVELING = _UxGT("Poziomowanie stołu");
+ LSTR MSG_LEVEL_BED = _UxGT("Wypoziomuj stół");
+ LSTR MSG_BED_TRAMMING = _UxGT("Narożniki poziomowania");
+ LSTR MSG_NEXT_CORNER = _UxGT("Nastepny narożnik");
+ LSTR MSG_MESH_EDITOR = _UxGT("Edytor siatki");
+ LSTR MSG_EDIT_MESH = _UxGT("Edycja siatki");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Edycja siatki zatrzymana");
+ LSTR MSG_PROBING_POINT = _UxGT("Punkt pomiarowy");
+ LSTR MSG_MESH_X = _UxGT("Indeks X");
+ LSTR MSG_MESH_Y = _UxGT("Indeks Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Wartość Z");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Własne Polecenia");
+ LSTR MSG_M48_TEST = _UxGT("M48 Test sondy");
+ LSTR MSG_M48_POINT = _UxGT("M48 Punky");
+ LSTR MSG_M48_DEVIATION = _UxGT("Odchylenie");
+ LSTR MSG_IDEX_MENU = _UxGT("Tryb IDEX");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Przesunięcie narzędzia");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Parkowanie");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikowanie");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Kopia lustrzana");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Pełne sterowanie");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2ga dysza Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2ga dysza @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Wykonywanie G29");
+ LSTR MSG_UBL_TOOLS = _UxGT("Narzędzia UBL");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Punkt pochylenia");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Ręczne Budowanie Siatki");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Umieść podkładkę i zmierz");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Zmierz");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Usuń & Zmierz Stół");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Przesuwanie do następnego");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Aktywacja UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Dezaktywacja UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Temperatura stołu");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temperatura stołu");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temperatura dyszy");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temperatura dyszy");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Edycja siatki");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edycja własnej siatki");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Dostrajanie siatki");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Koniec edycji siati");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Buduj własna siatkę");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Buduj siatkę");
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Buduj siatkę ($)");
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Buduj siatkę na zimno");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Dostrojenie wysokości siatki");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Wartość wysokości");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Sprawdzenie siatki");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Sprawdzenie siatki ($)");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Sprawdzenie własnej siatki");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 Nagrzewanie stołu");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 Nagrzewanie dyszy");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Napełnianie ręczne...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Napełnij kreśloną długością");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Napełnianie zakończone");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 Przewane");
+ LSTR MSG_G26_LEAVING = _UxGT("Opuszczanie G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Kontynuuj tworzenie siatki");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Poziomowanie siatką");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Poziomowaie 3-punktowe");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Poziomowaie według siatki");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Poziomuj siatkę");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Punkty boczne");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Rodzaj mapy");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Wyslij mapę siatki");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Wyslij do Hosta");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Wyslij do CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Kopia poza drukarką");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Wyslij info UBL");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Stopień wypełnienia");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Ręczne wypełnienie");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Inteligentne wypełnienie");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Wypełnienie siatki");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Unieważnij wszystko");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Unieważnij najbliższy");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Dostrajaj wszystko");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Dostrajaj najbliższy");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Przechowywanie siatki");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Slot Pamięci");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Załaduj siatkę stołu");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Zapisz siatkę stołu");
+ LSTR MSG_MESH_LOADED = _UxGT("Siatka %i załadowana");
+ LSTR MSG_MESH_SAVED = _UxGT("Siatka %i zapisana");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Brak magazynu");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Błąd: Zapis UBL");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Bład: Odczyt UBL");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Przesunięcie Z: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Przesunięcie Z zatrzymane");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Krok po kroku");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Tworzenie zimnej siatki");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligentne wypełnienie");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Sprawdzenie siatki");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Dostrojenie wszystkiego");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Sprawdzenie siatki");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Dostrojenie wszystkiego");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7. Zapis siatki stołu");
+
+ LSTR MSG_LED_CONTROL = _UxGT("Sterowanie LED");
+ LSTR MSG_LEDS = _UxGT("Światła");
+ LSTR MSG_LED_PRESETS = _UxGT("Ustawienia świateł");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Czerwony");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Pomarańczowy");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Zółty");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Zielony");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Niebieski");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Indygo");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Fioletowy");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Biały");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Domyślny");
+ LSTR MSG_LED_CHANNEL_N = _UxGT("Kanał =");
+ LSTR MSG_NEO2_BRIGHTNESS = _UxGT("Jasność");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Własne światła");
+ LSTR MSG_INTENSITY_R = _UxGT("Czerwony");
+ LSTR MSG_INTENSITY_G = _UxGT("Zielony");
+ LSTR MSG_INTENSITY_B = _UxGT("Niebieski");
+ LSTR MSG_INTENSITY_W = _UxGT("Biały");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Jasność");
+
+ LSTR MSG_MOVING = _UxGT("Ruch...");
+ LSTR MSG_FREE_XY = _UxGT("Swobodne XY");
+ LSTR MSG_MOVE_X = _UxGT("Przesuń w X");
+ LSTR MSG_MOVE_Y = _UxGT("Przesuń w Y");
+ LSTR MSG_MOVE_Z = _UxGT("Przesuń w Z");
+ LSTR MSG_MOVE_N = _UxGT("Przesuń w @");
+ LSTR MSG_MOVE_E = _UxGT("Ekstruzja (os E)");
+ LSTR MSG_MOVE_EN = _UxGT("Ekstruzja (os E) *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Dysza za zimna");
+ LSTR MSG_MOVE_N_MM = _UxGT("Przesuń co $ mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Przesuń co .1 mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Przesuń co 1 mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Przesuń co 10 mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Przesuń co 100 mm");
+ LSTR MSG_MOVE_0001IN = _UxGT("Przesuń co 0.001 cala");
+ LSTR MSG_MOVE_001IN = _UxGT("Przesuń co 0.01 cala");
+ LSTR MSG_MOVE_01IN = _UxGT("Przesuń co 0.1 cala");
+ LSTR MSG_SPEED = _UxGT("Predkość");
+ LSTR MSG_BED_Z = _UxGT("Stół Z");
+ LSTR MSG_NOZZLE = _UxGT("Dysza");
+ LSTR MSG_NOZZLE_N = _UxGT("Dysza ~");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Dysza w oczekiwaniu");
+ LSTR MSG_BED = _UxGT("Stół");
+ LSTR MSG_CHAMBER = _UxGT("Obudowa");
+ LSTR MSG_FAN_SPEED = _UxGT("Obroty wentylatora");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Obroty wentylatora ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Obroty dodatkowego wentylatora");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Obroty dodatkowego wentylatora ~");
+ LSTR MSG_CONTROLLER_FAN = _UxGT("Wentylator kontrolera");
+ LSTR MSG_FLOW = _UxGT("Przepływ");
+ LSTR MSG_FLOW_N = _UxGT("Przepływ ~");
+ LSTR MSG_CONTROL = _UxGT("Ustawienia");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Mnożnik");
+ LSTR MSG_AUTOTEMP = _UxGT("Auto. temperatura");
+ LSTR MSG_LCD_ON = _UxGT("Wł.");
+ LSTR MSG_LCD_OFF = _UxGT("Wył.");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("PID Autostrojenie");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID Autostrojenie *");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("Strojenie PID zakończone");
+ LSTR MSG_SELECT = _UxGT("Wybierz");
+ LSTR MSG_SELECT_E = _UxGT("Wybierz *");
+ LSTR MSG_ACC = _UxGT("Przyspieszenie");
+ LSTR MSG_JERK = _UxGT("Zryw");
+ LSTR MSG_VA_JERK = _UxGT("Zryw V") STR_A;
+ LSTR MSG_VB_JERK = _UxGT("Zryw V") STR_B;
+ LSTR MSG_VC_JERK = _UxGT("Zryw V") STR_C;
+ LSTR MSG_VN_JERK = _UxGT("Zryw V@");
+ LSTR MSG_VE_JERK = _UxGT("Zryw Ve");
+ LSTR MSG_MAX_SPEED = _UxGT("Prędkość (V)");
+
+ LSTR MSG_VTRAV_MIN = _UxGT("Vskok min");
+ LSTR MSG_ACCELERATION = _UxGT("Przyspieszenie (A)");
+
+ LSTR MSG_A_RETRACT = _UxGT("A-wycofanie");
+ LSTR MSG_A_TRAVEL = _UxGT("A-przesuń.");
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("Częstotliwość max");
+ LSTR MSG_STEPS_PER_MM = _UxGT("kroki/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" kroki/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" kroki/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" kroki/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ kroki/mm");
+ LSTR MSG_E_STEPS = _UxGT("E kroki/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* kroki/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperatura");
+ LSTR MSG_MOTION = _UxGT("Ruch");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E w mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Śr. fil.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Śr. fil. *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Wysuń mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Wsuń mm");
+ LSTR MSG_CONTRAST = _UxGT("Kontrast LCD");
+ LSTR MSG_STORE_EEPROM = _UxGT("Zapisz w pamięci");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Wczytaj z pamięci");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Ustaw. fabryczne");
+ LSTR MSG_INIT_EEPROM = _UxGT("Initializuj EEPROM");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Uaktualnij kartę");
+ LSTR MSG_RESET_PRINTER = _UxGT("Resetuj drukarkę");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Odswież");
+ LSTR MSG_INFO_SCREEN = _UxGT("Ekran główny");
+ LSTR MSG_PREPARE = _UxGT("Przygotuj");
+ LSTR MSG_TUNE = _UxGT("Strojenie");
+ LSTR MSG_CURRENT = _UxGT("Natężenie");
+ LSTR MSG_VOLTAGE = _UxGT("Napięcie");
+ LSTR MSG_POWER = _UxGT("Moc");
+ LSTR MSG_START_PRINT = _UxGT("Start wydruku");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Następny");
+ LSTR MSG_BUTTON_INIT = _UxGT("Inic.");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Drukuj");
+ LSTR MSG_BUTTON_RESET = _UxGT("Resetuj");
+ LSTR MSG_BUTTON_IGNORE = _UxGT("Ignoruj");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Przerwij");
+ LSTR MSG_BUTTON_DONE = _UxGT("Gotowe");
+ LSTR MSG_BUTTON_BACK = _UxGT("Wstecz");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Kontynuuj");
+ LSTR MSG_BUTTON_SKIP = _UxGT("Pomiń");
+ LSTR MSG_PAUSING = _UxGT("Wstrzymywanie...");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Wstrzymaj druk");
+ LSTR MSG_RESUME_PRINT = _UxGT("Wznowienie");
+ LSTR MSG_STOP_PRINT = _UxGT("Stop");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Drukowanie obiektu");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Anunuj obiekt");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Anunuj obiekt =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Odzyskiwanie po awarii");
+ LSTR MSG_MEDIA_MENU = _UxGT("Karta SD");
+ LSTR MSG_NO_MEDIA = _UxGT("Brak karty");
+ LSTR MSG_DWELL = _UxGT("Uśpij...");
+ LSTR MSG_USERWAIT = _UxGT("Oczekiwanie...");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Druk wstrzymany");
+ LSTR MSG_PRINTING = _UxGT("Drukowanie...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Druk przerwany");
+ LSTR MSG_PRINT_DONE = _UxGT("Druk zakończony");
+ LSTR MSG_NO_MOVE = _UxGT("Brak ruchu");
+ LSTR MSG_KILLED = _UxGT("Ubity. ");
+ LSTR MSG_STOPPED = _UxGT("Zatrzymany. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Wycofaj mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Z Wycof. mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Wycofaj V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Skok Z mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Cof. wycof. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Z Cof. wyc. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Cof. wycof. V");
+ LSTR MSG_AUTORETRACT = _UxGT("Auto. wycofanie");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Długość zmiany");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Długość oczyszczania");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Zmiana narzędzia");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Podniesienie Z");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Prędkość napełniania");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Prędkość wycofania");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Zmień filament");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Zmień filament *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Wsuń Filament");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Wsuń Filament *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Wysuń Filament");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Wysuń Filament *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Wysuń wszystkie");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Inicjal. karty SD");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Zmiana karty SD");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Zwolnienie karty");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Sonda Z za stołem");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Współczynik skrzywienia");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Self-Test");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("UWAGA: Złe ustawienia mogą uszkodzić drukarkę. Kontynuować?");
+ LSTR MSG_HOME_FIRST = _UxGT("Najpierw Home %s%s%s");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Offset Z");
+ LSTR MSG_MOVE_NOZZLE_TO_BED = _UxGT("Przesuń dyszę do stołu");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Łącznie");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Błąd krańcówki");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Rozgrz. nieudane");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Błąd temperatury");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("ZANIK TEMPERATURY");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("ZANIK TEMP. STOŁU");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ZANIK TEMP.KOMORY");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Błąd: MAXTEMP");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Błąd: MINTEMP");
+ LSTR MSG_HALTED = _UxGT("Drukarka zatrzym.");
+ LSTR MSG_PLEASE_RESET = _UxGT("Proszę zresetować");
+ LSTR MSG_SHORT_HOUR = _UxGT("g"); // One character only
+ LSTR MSG_HEATING = _UxGT("Rozgrzewanie...");
+ LSTR MSG_COOLING = _UxGT("Chłodzenie...");
+ LSTR MSG_BED_HEATING = _UxGT("Rozgrzewanie stołu...");
+ LSTR MSG_BED_COOLING = _UxGT("Chłodzenie stołu...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Rozgrzewanie komory...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Chłodzenie komory...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Kalibrowanie Delty");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Kalibruj X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibruj Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibruj Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibruj środek");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Ustawienia delty");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto kalibrowanie");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Ukośne ramię");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Wysokość");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Promień");
+ LSTR MSG_INFO_MENU = _UxGT("O drukarce");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Info drukarki");
+ LSTR MSG_3POINT_LEVELING = _UxGT("Poziomowanie 3-punktowe");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Poziomowanie liniowe");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Poziomowanie biliniowe");
+ LSTR MSG_MESH_LEVELING = _UxGT("Poziomowanie siatką");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Statystyki");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Info płyty");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistory");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Ekstrudery");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Predkość USB");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protokół");
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Zegar pracy: OFF");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Zegar pracy: ON");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Oświetlenie obudowy");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Jasność oświetlenia");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Niepoprawna drukarka");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Wydrukowano");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Ukończono");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Czas druku");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Najdł. druk");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Użyty fil.");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Wydrukowano");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Ukończono");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Razem");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Najdł. druk");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Użyty fil.");
+ #endif
+
+ LSTR MSG_INFO_PSU = _UxGT("Zasilacz");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Siła silnika");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Siła %");
+ LSTR MSG_ERROR_TMC = _UxGT("TMC BŁĄD POŁĄCZENIA");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Zapisz DAC EEPROM");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("ZMIEŃ FILAMENT");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("WYDRUK WSTRZYMANY");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("WSUŃ FILAMENT");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("WYSUŃ FILAMENT");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPCJE WZNOWIENIA:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Oczyść więcej");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Kontynuuj");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Dysza: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Czujnik filamentu");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Dystans do czujnika mm");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Zerowanie nieudane");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Sondowanie nieudane");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("WYBIERZ FILAMENT");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("Uaktualnij firmware MMU!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU wymaga uwagi.");
+ LSTR MSG_MMU2_RESUME = _UxGT("Wznów wydruk");
+ LSTR MSG_MMU2_RESUMING = _UxGT("Wznawianie...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("Wsuń filament");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("Wsuń wszystko");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Wsuń do dyszy");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("Wysuń filament");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Wysuń filament ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Wysuń filament");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Wsuwanie fil. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Wysuwanie fil. ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Wysuwanie fil....");
+ LSTR MSG_MMU2_ALL = _UxGT("Wszystko");
+ LSTR MSG_MMU2_RESET = _UxGT("Resetuj MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("Resetowanie MMU...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Usuń, kliknij");
+
+ LSTR MSG_MIX = _UxGT("Miks");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Komponent =");
+ LSTR MSG_MIXER = _UxGT("Mikser");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Pełny gradient");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Przełacz miks");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Odwrotny gradient");
+
+ LSTR MSG_GAMES = _UxGT("Gry");
+
+
+ LSTR MSG_EDIT_PASSWORD = _UxGT("Zmień hasło");
+ LSTR MSG_LOGIN_REQUIRED = _UxGT("Wymagane zalogowanie");
+ LSTR MSG_PASSWORD_SETTINGS = _UxGT("Ustawienia hasła");
+ LSTR MSG_ENTER_DIGIT = _UxGT("Wprowadź cyfrę");
+ LSTR MSG_CHANGE_PASSWORD = _UxGT("Ustaw/zmień hasło");
+ LSTR MSG_REMOVE_PASSWORD = _UxGT("Usuń hasło");
+ LSTR MSG_PASSWORD_SET = _UxGT("Hasło to ");
+ LSTR MSG_START_OVER = _UxGT("Od nowa");
+ LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Pamiętaj by zapisać!");
+ LSTR MSG_PASSWORD_REMOVED = _UxGT("Hasło usunięte");
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nacisnik przycisk", "by wznowić drukowanie"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkowanie..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Czekam na", "zmianę filamentu", "by wystartować"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Włóż filament", "i naciśnij przycisk", "by kontynuować"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Naciśnij przycisk", "by nagrzać dyszę"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nagrzewanie dyszy", "Proszę czekać..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Czekam na", "wyjęcie filamentu"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Czekam na", "włożenie filamentu"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Czekam na", "oczyszczenie filamentu"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Kliknij by zakończyć", "oczyszczanie filamentu"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Czekam na", "wznowienie wydruku..."));
+ #else
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Kliknij by kontynuować"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkowanie..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Proszę czekać..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Włóż i kliknij"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Kliknij by nagrzać"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Nagrzewanie..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Wysuwanie..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Wsuwanie..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Oczyszczanie..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Kliknij by zakończyć"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Wznawianie..."));
+ #endif
+ LSTR MSG_TMC_DRIVERS = _UxGT("Sterowniki TMC");
+ LSTR MSG_TMC_CURRENT = _UxGT("Prąd sterownika");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Zerowanie bezczujnikowe");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Korekcja");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Wygładzanie");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("Wypoziomuj oś X");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Autokalibracja");
+
+ LSTR MSG_SOUND = _UxGT("Dźwięk");
+
+ LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Kalibracja zakończona");
+ LSTR MSG_CALIBRATION_FAILED = _UxGT("Kalibracja nie powiodła się");
+
+}
+
+#if FAN_COUNT == 1
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED
+#else
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N
+#endif
diff --git a/src/lcd/language/language_pt.h b/src/lcd/language/language_pt.h
new file mode 100644
index 0000000..55d9c1d
--- /dev/null
+++ b/src/lcd/language/language_pt.h
@@ -0,0 +1,172 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Portuguese
+ * UTF-8 for Graphical Display
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+ #define DISPLAY_CHARSET_ISO10646_1
+
+namespace Language_pt {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Portuguese");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" pronta.");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Cartão inserido");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Cartão removido");
+ LSTR MSG_MAIN = _UxGT("Menu principal");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Desactivar motores");
+ LSTR MSG_AUTO_HOME = _UxGT("Ir para origem");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Ir para origem X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Ir para origem Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Ir para origem Z");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Indo para origem");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Click para iniciar");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Próximo ponto");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Pronto !");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Definir desvio");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Offsets aplicados");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL _UxGT(" Bico ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Pre-aq. ") PREHEAT_1_LABEL _UxGT(" Tudo");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Pre-aq. ") PREHEAT_1_LABEL _UxGT(" ") LCD_STR_THERMOMETER _UxGT("Base");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Definições ") PREHEAT_1_LABEL;
+
+ LSTR MSG_PREHEAT_M = _UxGT("Pre-aquecer $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Pre-aquecer $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Pre-aquecer $ Bico");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Pre-aquecer $ Bico ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Pre-aq. $ Tudo");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Pre-aq. $ ") LCD_STR_THERMOMETER _UxGT("Base");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Definições $");
+ #endif
+ LSTR MSG_COOLDOWN = _UxGT("Arrefecer");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Ligar");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Desligar");
+ LSTR MSG_EXTRUDE = _UxGT("Extrudir");
+ LSTR MSG_RETRACT = _UxGT("Retrair");
+ LSTR MSG_MOVE_AXIS = _UxGT("Mover eixo");
+ LSTR MSG_MOVE_X = _UxGT("Mover X");
+ LSTR MSG_MOVE_Y = _UxGT("Mover Y");
+ LSTR MSG_MOVE_Z = _UxGT("Mover Z");
+ LSTR MSG_MOVE_N = _UxGT("Mover @");
+ LSTR MSG_MOVE_E = _UxGT("Mover Extrusor");
+ LSTR MSG_MOVE_EN = _UxGT("Mover Extrusor *");
+ LSTR MSG_MOVE_N_MM = _UxGT("Mover $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Mover 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Mover 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Mover 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Mover 100mm");
+ LSTR MSG_SPEED = _UxGT("Velocidade");
+ LSTR MSG_BED_Z = _UxGT("Base Z");
+ LSTR MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" Bico");
+ LSTR MSG_NOZZLE_N = " " LCD_STR_THERMOMETER _UxGT(" Bico ~");
+ LSTR MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" Base");
+ LSTR MSG_FAN_SPEED = _UxGT("Vel. ventoinha");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Vel. ventoinha ~");
+ LSTR MSG_FLOW = _UxGT("Fluxo");
+ LSTR MSG_FLOW_N = _UxGT("Fluxo ~");
+ LSTR MSG_CONTROL = _UxGT("Controlo");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact");
+ LSTR MSG_A_RETRACT = _UxGT("A-retracção");
+ LSTR MSG_A_TRAVEL = _UxGT("A-movimento");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Passo/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" passo/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" passo/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" passo/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ passo/mm");
+ LSTR MSG_E_STEPS = _UxGT("E passo/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* passo/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperatura");
+ LSTR MSG_MOTION = _UxGT("Movimento");
+ LSTR MSG_FILAMENT = _UxGT("Filamento");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E em mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Fil. Diam.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Fil. Diam. *");
+ LSTR MSG_CONTRAST = _UxGT("Contraste");
+ LSTR MSG_STORE_EEPROM = _UxGT("Guardar na memoria");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Carregar da memoria");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Rest. de emergen.");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT(" Recarregar");
+ LSTR MSG_INFO_SCREEN = _UxGT("Monitorizar");
+ LSTR MSG_PREPARE = _UxGT("Preparar");
+ LSTR MSG_TUNE = _UxGT("Afinar");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pausar impressão");
+ LSTR MSG_RESUME_PRINT = _UxGT("Retomar impressão");
+ LSTR MSG_STOP_PRINT = _UxGT("Parar impressão");
+ LSTR MSG_MEDIA_MENU = _UxGT("Imprimir do SD");
+ LSTR MSG_NO_MEDIA = _UxGT("Sem cartão SD");
+ LSTR MSG_DWELL = _UxGT("Em espera...");
+ LSTR MSG_USERWAIT = _UxGT("Á espera de ordem");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Impressão cancelada");
+ LSTR MSG_NO_MOVE = _UxGT("Sem movimento");
+ LSTR MSG_KILLED = _UxGT("EMERGÊNCIA. ");
+ LSTR MSG_STOPPED = _UxGT("PARADO. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT(" Retrair mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Troca Retrair mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT(" Retrair V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT(" Levantar mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT(" DesRet mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Troca DesRet mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT(" DesRet V");
+ LSTR MSG_AUTORETRACT = _UxGT(" Auto-Retract");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Trocar filamento");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Trocar filamento *");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Inici. cartão SD");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Trocar cartão SD");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Sensor fora/base");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Desvio Z");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Fim de curso");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Aquecimento falhou");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Err: T Máxima");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Err: T Mínima");
+ LSTR MSG_HEATING = _UxGT("Aquecendo...");
+ LSTR MSG_BED_HEATING = _UxGT("Aquecendo base...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Calibração Delta");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro");
+
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Fim de curso");
+
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Impressora Incorreta");
+
+ LSTR MSG_TOP_LEFT = _UxGT("Superior Esquerdo");
+ LSTR MSG_BOTTOM_LEFT = _UxGT("Inferior Esquerdo");
+ LSTR MSG_TOP_RIGHT = _UxGT("Superior Direto");
+ LSTR MSG_BOTTOM_RIGHT = _UxGT("Inferior Direto");
+ LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Calibração Completa");
+ LSTR MSG_CALIBRATION_FAILED = _UxGT("Calibração Falhou");
+}
diff --git a/src/lcd/language/language_pt_br.h b/src/lcd/language/language_pt_br.h
new file mode 100644
index 0000000..1d07b2b
--- /dev/null
+++ b/src/lcd/language/language_pt_br.h
@@ -0,0 +1,486 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Portuguese (Brazil)
+ * UTF-8 for Graphical Display
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+namespace Language_pt_br {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Portuguese (BR)");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" pronto.");
+ LSTR MSG_YES = _UxGT("SIM");
+ LSTR MSG_NO = _UxGT("NÃO");
+ LSTR MSG_BACK = _UxGT("Voltar");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Abortando...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Cartão inserido");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Cartão removido");
+ LSTR MSG_MEDIA_RELEASED = _UxGT("Cartão liberado");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Aguardando cartão");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Erro de leitura");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB removido");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB falhou");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Fins de curso");
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Fins curso");
+ LSTR MSG_MAIN = _UxGT("Menu principal");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Config. Avançada");
+ LSTR MSG_CONFIGURATION = _UxGT("Configuração");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Início automático");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Desabilit. motores");
+ LSTR MSG_DEBUG_MENU = _UxGT("Menu Debug");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Testar Barra Progres");
+ LSTR MSG_AUTO_HOME = _UxGT("Ir a origem XYZ");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Ir na origem X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Ir na origem Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Ir na origem Z");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Auto alinhar Z");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Indo para origem");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Clique para Iniciar");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Próximo Ponto");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Fim nivelação!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Suavizar altura");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Compensar origem");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Alteração aplicada");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Pre-aquecer ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Extrusora ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Extrusora ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Pre-aq.Todo ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Pre-aq.Mesa ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Ajustar ") PREHEAT_1_LABEL;
+
+ LSTR MSG_PREHEAT_M = _UxGT("Pre-aquecer $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Pre-aquecer $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Extrusora $");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Extrusora $ ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Pre-aq.Todo $");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Pre-aq.Mesa $");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Ajustar $");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Customizar Pre-aq.");
+ LSTR MSG_COOLDOWN = _UxGT("Esfriar");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Ligar");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Desligar");
+ LSTR MSG_EXTRUDE = _UxGT("Extrusar");
+ LSTR MSG_RETRACT = _UxGT("Retrair");
+ LSTR MSG_MOVE_AXIS = _UxGT("Mover eixo");
+ LSTR MSG_BED_LEVELING = _UxGT("Nivelação Mesa");
+ LSTR MSG_LEVEL_BED = _UxGT("Nivelar Mesa");
+ LSTR MSG_BED_TRAMMING = _UxGT("Nivelar Cantos");
+ LSTR MSG_NEXT_CORNER = _UxGT("Próximo Canto");
+ LSTR MSG_MESH_EDITOR = _UxGT("Editor de Malha");
+ LSTR MSG_EDIT_MESH = _UxGT("Editar Malha");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Fim da Edição");
+ LSTR MSG_PROBING_POINT = _UxGT("Sondando ponto");
+ LSTR MSG_MESH_X = _UxGT("Índice X");
+ LSTR MSG_MESH_Y = _UxGT("Índice Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Valor Z");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Comando customizado");
+ LSTR MSG_M48_TEST = _UxGT("M48 Teste de sonda");
+ LSTR MSG_M48_POINT = _UxGT("M48 Ponto");
+ LSTR MSG_IDEX_MENU = _UxGT("Modo IDEX");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Estacionar");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicação");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Cópia espelhada");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Controle Total");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2o bico Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2o bico @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Executando G29");
+ LSTR MSG_UBL_TOOLS = _UxGT("Ferramentas UBL");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Nivel. Mesa Unif.");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Fazer malha manual");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Calçar e calibrar");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Medir");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Remover e calibrar");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Movendo para Próximo");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Ativar UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Desativar UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Mesa");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp. Mesa");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Extrusora");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp. Extrusora");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Editar Malha");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Editar Malha Custom");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Ajuste Fino da Malha");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Fim da Edição");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Montar Malha Custom");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Montar ");
+ #if HAS_PREHEAT
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Montar $");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Checar $");
+ #endif
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Montar Malha fria");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Ajustar Altura");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Quant. de Altura");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validar Malha");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validar Malha Custom");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 Aquecendo Mesa");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 Aquecendo Ext.");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 Cancelado");
+ LSTR MSG_G26_LEAVING = _UxGT("G26 Saindo");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Continuar Malha");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Nivelação da Malha");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Nivelação 3 pontos");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Nivelação Grid");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Nivelar Malha");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Cantos");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Tipo de Mapa");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Salvar Mapa da Malha");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Enviar Para Host");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Salvar Malha CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Salvar Backup");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Informação do UBL");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Qtd de Enchimento");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Enchimento Manual");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Enchimento Smart");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Preencher malha");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidar tudo");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidar próximo");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Ajuste Fino de Todos");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ajustar Mais Próximo");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Armazenamento Malha");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Slot de Memória");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Ler Malha");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Salvar Malha");
+ LSTR MSG_MESH_LOADED = _UxGT("Malha %i carregada");
+ LSTR MSG_MESH_SAVED = _UxGT("Malha %i salva");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Sem armazenamento");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Erro ao salvar UBL");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Erro no restauro UBL");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Compensação Z: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Compensação Z parou");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL passo a passo");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Montar Malha fria");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2.Enchimento Smart");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Validar Malha");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ajuste Fino de Todos");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Validar Malha");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ajuste Fino de Todos");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7.Salvar Malha");
+
+ LSTR MSG_LED_CONTROL = _UxGT("Controle do LED");
+ LSTR MSG_LEDS = _UxGT("Luz");
+ LSTR MSG_LED_PRESETS = _UxGT("Configuração da Luz");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Luz Vermelha");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Luz Laranja");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Luz Amarela");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Luz Verde");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Luz Azul");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Luz Indigo");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Luz Violeta");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Luz Branca");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Luz Padrão");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Luz Customizada");
+ LSTR MSG_INTENSITY_R = _UxGT("Intensidade Vermelho");
+ LSTR MSG_INTENSITY_G = _UxGT("Intensidade Verde");
+ LSTR MSG_INTENSITY_B = _UxGT("Intensidade Azul");
+ LSTR MSG_INTENSITY_W = _UxGT("Intensidade Branco");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Brilho");
+
+ LSTR MSG_MOVING = _UxGT("Movendo...");
+ LSTR MSG_FREE_XY = _UxGT("Liberar XY");
+ LSTR MSG_MOVE_X = _UxGT("Mover X");
+ LSTR MSG_MOVE_Y = _UxGT("Mover Y");
+ LSTR MSG_MOVE_Z = _UxGT("Mover Z");
+ LSTR MSG_MOVE_N = _UxGT("Mover @");
+ LSTR MSG_MOVE_E = _UxGT("Mover Extrusor");
+ LSTR MSG_MOVE_EN = _UxGT("Mover Extrusor *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Extrus. mto fria");
+ LSTR MSG_MOVE_N_MM = _UxGT("Mover $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Mover 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Mover 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Mover 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Mover 100mm");
+ LSTR MSG_SPEED = _UxGT("Velocidade");
+ LSTR MSG_BED_Z = _UxGT("Base Z");
+ LSTR MSG_NOZZLE = _UxGT("Bocal");
+ LSTR MSG_NOZZLE_N = _UxGT("Bocal ~");
+ LSTR MSG_BED = _UxGT("Mesa");
+ LSTR MSG_FAN_SPEED = _UxGT("Vel. Ventoinha");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Vel. Ventoinha ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("+Vel. Ventoinha");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("+Vel. Ventoinha ~");
+ LSTR MSG_FLOW = _UxGT("Vazão");
+ LSTR MSG_FLOW_N = _UxGT("Vazão ~");
+ LSTR MSG_CONTROL = _UxGT("Controle");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Máx");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fator");
+ LSTR MSG_AUTOTEMP = _UxGT("Temp. Automática");
+ LSTR MSG_LCD_ON = _UxGT("Ligado");
+ LSTR MSG_LCD_OFF = _UxGT("Desligado");
+ LSTR MSG_SELECT = _UxGT("Selecionar");
+ LSTR MSG_SELECT_E = _UxGT("Selecionar *");
+ LSTR MSG_ACC = _UxGT("Acel.");
+ LSTR MSG_JERK = _UxGT("Arrancada");
+ LSTR MSG_VA_JERK = _UxGT("arrancada V") STR_A;
+ LSTR MSG_VB_JERK = _UxGT("arrancada V") STR_B;
+ LSTR MSG_VC_JERK = _UxGT("arrancada V") STR_C;
+ LSTR MSG_VN_JERK = _UxGT("arrancada V@");
+ LSTR MSG_VE_JERK = _UxGT("arrancada VE");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Desv. Junção");
+ LSTR MSG_MAX_SPEED = _UxGT("Velocidade");
+ LSTR MSG_VTRAV_MIN = _UxGT("VDeslocamento min");
+ LSTR MSG_ACCELERATION = _UxGT("Aceleração");
+ LSTR MSG_A_RETRACT = _UxGT("Retrair A");
+ LSTR MSG_A_TRAVEL = _UxGT("Movimento A");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Passo/mm");
+ LSTR MSG_A_STEPS = _UxGT("Passo ") STR_A _UxGT("/mm");
+ LSTR MSG_B_STEPS = _UxGT("Passo ") STR_B _UxGT("/mm");
+ LSTR MSG_C_STEPS = _UxGT("Passo ") STR_C _UxGT("/mm");
+ LSTR MSG_N_STEPS = _UxGT("Passo @/mm");
+ LSTR MSG_E_STEPS = _UxGT("E/mm");
+ LSTR MSG_EN_STEPS = _UxGT("*/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperatura");
+ LSTR MSG_MOTION = _UxGT("Movimento");
+ LSTR MSG_FILAMENT = _UxGT("Filamento");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("Extrusão em mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Diâmetro Fil.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Diâmetro Fil. *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Descarr. mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Carregar mm");
+ LSTR MSG_ADVANCE_K = _UxGT("Avanço K");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Avanço K *");
+ LSTR MSG_CONTRAST = _UxGT("Contraste");
+ LSTR MSG_STORE_EEPROM = _UxGT("Salvar Configuração");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Ler Configuração");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Restauro seguro");
+ LSTR MSG_INIT_EEPROM = _UxGT("Iniciar EEPROM");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Atualiz. SD");
+ LSTR MSG_RESET_PRINTER = _UxGT("Resetar Impressora");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Atualização");
+ LSTR MSG_INFO_SCREEN = _UxGT("Informações");
+ LSTR MSG_PREPARE = _UxGT("Preparar");
+ LSTR MSG_TUNE = _UxGT("Ajustar");
+ LSTR MSG_START_PRINT = _UxGT("Iniciar Impressão");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Prox.");
+ LSTR MSG_BUTTON_INIT = _UxGT("Iniciar");
+ LSTR MSG_BUTTON_STOP = _UxGT("Parar");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Imprimir");
+ LSTR MSG_BUTTON_RESET = _UxGT("Resetar");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Cancelar");
+ LSTR MSG_BUTTON_DONE = _UxGT("Pronto");
+ LSTR MSG_BUTTON_BACK = _UxGT("Voltar");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Continuar");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pausar impressão");
+ LSTR MSG_RESUME_PRINT = _UxGT("Continuar impressão");
+ LSTR MSG_STOP_PRINT = _UxGT("Parar impressão");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Imprimindo objeto");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Cancelar Objeto");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Cancelar Objeto =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Recuperar Impressão");
+ LSTR MSG_MEDIA_MENU = _UxGT("Imprimir do SD");
+ LSTR MSG_NO_MEDIA = _UxGT("Sem cartão SD");
+ LSTR MSG_DWELL = _UxGT("Dormindo...");
+ LSTR MSG_USERWAIT = _UxGT("Clique para retomar");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Impressão Pausada");
+ LSTR MSG_PRINTING = _UxGT("Imprimindo...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Impressão Abortada");
+ LSTR MSG_NO_MOVE = _UxGT("Sem movimento");
+ LSTR MSG_KILLED = _UxGT("PARADA DE EMERGÊNCIA");
+ LSTR MSG_STOPPED = _UxGT("PAROU. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Retrair mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Retrair Troca mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Retrair V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Saltar mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Des-Retrair mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Des-RetTroca mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Des-Retrair V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Des-RetTroca V");
+ LSTR MSG_AUTORETRACT = _UxGT("Retração Automática");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Distancia Retração");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Distancia Purga");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Mudar Ferramenta");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Levantar Z");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Preparar Veloc.");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Veloc. Retração");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Standby bico");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Trocar Filamento");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Trocar Filamento *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Carregar Filamento");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Carregar Filamento *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Descarreg. Filamento");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Descarreg. Filamento *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Descarregar Todos");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Iniciar SD");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Trocar SD");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Liberar SD");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Sonda fora da mesa");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Fator de Cisalho");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Testar BLTouch");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Reiniciar BLTouch");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Recolher BLTouch");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Estender BLTouch");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Estender Sonda-Z");
+ LSTR MSG_MANUAL_STOW = _UxGT("Recolher Sonda-Z");
+ LSTR MSG_HOME_FIRST = _UxGT("Home %s%s%s Primeiro");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Compensar Sonda");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("Compensar Sonda em X");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Compensar Sonda em Y");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Compensar Sonda em Z");
+ LSTR MSG_BABYSTEP_X = _UxGT("Passinho X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Passinho Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Passinho Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Passinho @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Total");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Abortar Fim de Curso");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Aquecimento falhou");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Erro:Temp Redundante");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("ESCAPE TÉRMICO");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("ESCAPE TÉRMICO MESA");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ESCAPE TÉRMICO CAMARA");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Erro:Temp Máxima");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Erro:Temp Mínima");
+ LSTR MSG_HALTED = _UxGT("IMPRESSORA PAROU");
+ LSTR MSG_PLEASE_RESET = _UxGT("Favor resetar");
+ LSTR MSG_HEATING = _UxGT("Aquecendo...");
+ LSTR MSG_COOLING = _UxGT("Resfriando...");
+ LSTR MSG_BED_HEATING = _UxGT("Aquecendo mesa...");
+ LSTR MSG_BED_COOLING = _UxGT("Esfriando mesa...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Aquecendo Câmara...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Esfriando Câmara...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Calibrar Delta");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Calibrar X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrar Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrar Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrar Centro");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Configuração Delta");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto-Calibração");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Haste Diagonal");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Altura");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Raio");
+ LSTR MSG_INFO_MENU = _UxGT("Sobre");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Impressora");
+ LSTR MSG_3POINT_LEVELING = _UxGT("Nivelamento 3 pontos");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Nivelamento Linear");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Nivelamento Bilinear");
+ LSTR MSG_UBL_LEVELING = _UxGT("Nivelamento UBL");
+ LSTR MSG_MESH_LEVELING = _UxGT("Nivelamento da Malha");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Estatísticas");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Info. da Placa");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistores");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extrusoras");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Taxa de Transmissão");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protocolo");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Luz da Impressora");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Intensidade Brilho");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Impressora Incorreta");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Total de Impressões");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Realizadas");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Tempo de Impressão");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Trabalho Mais longo");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Total de Extrusão");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Qtd de Impressões");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Realizadas");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Tempo de Impressão");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Maior trabalho");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("T. Extrusão");
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Temp Mín");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Temp Máx");
+ LSTR MSG_INFO_PSU = _UxGT("PSU");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Força do Motor");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Escrever EEPROM DAC");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("TROCA DE FILAMENTO");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPRESSÃO PAUSADA");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARREGAR FILAMENTO");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DESCARREG. FILAMENTO");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Config. de Retomada");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purgar mais");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continuar Impressão");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Bocal: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Sensor filamento");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Falha ao ir à origem");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Falha ao sondar");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ESCOLHER FILAMENTO");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+
+ LSTR MSG_MMU2_RESUME = _UxGT("Continuar Impressão");
+ LSTR MSG_MMU2_RESUMING = _UxGT("Continuando...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("Carregar Filamento");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("Carregar Todos");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Carregar para bocal");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("Ejetar Filamento");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Ejetar Filamento ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Liberar Filamento");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Carregando Fil. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejetando Fil. ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Carregando Fil....");
+ LSTR MSG_MMU2_ALL = _UxGT("Todos");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~");
+ LSTR MSG_MMU2_RESET = _UxGT("Resetar MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("Resetando MMU...");
+
+ LSTR MSG_GAMES = _UxGT("Jogos");
+ LSTR MSG_BRICKOUT = _UxGT("Brickout");
+ LSTR MSG_INVADERS = _UxGT("Invaders");
+ LSTR MSG_SNAKE = _UxGT("Sn4k3");
+ LSTR MSG_MAZE = _UxGT("Labirinto");
+
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Aperte o botão para", "continuar impressão"));
+ LSTR MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Estacionando..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Esperando o", "inicio da", "troca de filamento"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Coloque filamento", "pressione o botão", "para continuar..."));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Pressione o botão", "p/ aquecer o bocal"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Aquecendo o bocal", "Aguarde..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Esperando", "remoção de filamento"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Esperando", "filamento"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Espere pela", "purga de filamento"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Clique para finaliz.", "purga de filamento"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Esperando impressão", "continuar"));
+ #else // LCD_HEIGHT < 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Clique p. continuar"));
+ LSTR MSG_PAUSE_PRINT_INIT = _UxGT(MSG_1_LINE("Estacionando..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Aguarde..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insira e Clique"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Clique para Aquecer"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Aquecendo..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Ejetando..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Carregando..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purgando..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Clique p. finalizar"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Continuando..."));
+ #endif
+
+ LSTR MSG_TOP_LEFT = _UxGT("Superior Esquerdo");
+ LSTR MSG_BOTTOM_LEFT = _UxGT("Inferior Esquerdo");
+ LSTR MSG_TOP_RIGHT = _UxGT("Superior Direto");
+ LSTR MSG_BOTTOM_RIGHT = _UxGT("Inferior Direto");
+ LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Calibração Completa");
+ LSTR MSG_CALIBRATION_FAILED = _UxGT("Calibração Falhou");
+}
diff --git a/src/lcd/language/language_ro.h b/src/lcd/language/language_ro.h
new file mode 100644
index 0000000..2cf6fff
--- /dev/null
+++ b/src/lcd/language/language_ro.h
@@ -0,0 +1,617 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+ /**
+ * Romanian
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ *
+ * Translation by cristyanul
+ */
+namespace Language_ro {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Romanian");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Pregatit.");
+ LSTR MSG_YES = _UxGT("DA");
+ LSTR MSG_NO = _UxGT("NU");
+ LSTR MSG_BACK = _UxGT("Inapoi");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Abandon...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Media Introdus");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Media Inlaturat");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Astept Media");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Eroare Citire Media");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Dispozitiv USB Inlaturat");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("Pornire USB Esuata");
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Eroare:Subcall Overflow");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops");
+ LSTR MSG_MAIN = _UxGT("Principal");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Setari Avansate");
+ LSTR MSG_CONFIGURATION = _UxGT("Configurare");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Autostart");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Dezactivare Motoare");
+ LSTR MSG_DEBUG_MENU = _UxGT("Meniu Debug");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test Bara Progres");
+ LSTR MSG_AUTO_HOME = _UxGT("Auto Acasa");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Acasa X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Acasa Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Acasa Z");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Auto Aliniere-Z");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Acasa XYZ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Click pentru a incepe");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Urmatorul Punct");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Nivelare Terminata!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Fade Inaltime");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Seteaza Offseturile Acasa");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Offseturi Aplicate");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Preincalzeste ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Preincalzeste ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Capatul");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Capatul ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Tot");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Patul");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Preincalzeste ") PREHEAT_1_LABEL _UxGT(" Conf");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Preincalzeste $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Preincalzeste $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Preincalzeste $ Capatul");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Preincalzeste $ Capatul ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Preincalzeste $ Tot");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preincalzeste $ Patul");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preincalzeste $ Conf");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Preincalzeste Personalizat");
+ LSTR MSG_COOLDOWN = _UxGT("Racire");
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("Frecventa");
+ LSTR MSG_LASER_MENU = _UxGT("Control Laser");
+ LSTR MSG_LASER_POWER = _UxGT("Puterea Laserului");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Controlul Spindle");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Puterea Spindle");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Spindle Invers");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Porneste");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Opreste");
+ LSTR MSG_EXTRUDE = _UxGT("Extrudeaza");
+ LSTR MSG_RETRACT = _UxGT("Retracteaza");
+ LSTR MSG_MOVE_AXIS = _UxGT("Muta Axa");
+ LSTR MSG_BED_LEVELING = _UxGT("Nivelarea Patului");
+ LSTR MSG_LEVEL_BED = _UxGT("Niveleaza Patul");
+ LSTR MSG_BED_TRAMMING = _UxGT("Niveleaza Colturile");
+ LSTR MSG_NEXT_CORNER = _UxGT("Urmatorul Colt");
+ LSTR MSG_MESH_EDITOR = _UxGT("Editor Mesh");
+ LSTR MSG_EDIT_MESH = _UxGT("Editeaza Mesh");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Editarea Meshului Oprita");
+ LSTR MSG_PROBING_POINT = _UxGT("Punctul de Probare");
+ LSTR MSG_MESH_X = _UxGT("Index X");
+ LSTR MSG_MESH_Y = _UxGT("Index Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Valoare Z");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Comenzi Personalizate");
+ LSTR MSG_M48_TEST = _UxGT("M48 Probe Test");
+ LSTR MSG_M48_POINT = _UxGT("M48 Point");
+ LSTR MSG_M48_DEVIATION = _UxGT("Deviation");
+ LSTR MSG_IDEX_MENU = _UxGT("IDEX Mode");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Tool Offsets");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplication");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Mirrored Copy");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Full Control");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2nd Nozzle Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2nd Nozzle @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Doing G29");
+ LSTR MSG_UBL_TOOLS = _UxGT("UBL Tools");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Tilting Point");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Manually Build Mesh");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Place Shim & Measure");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Measure");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Remove & Measure Bed");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Moving to next");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Activate UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Deactivate UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Bed Temp");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Hotend Temp");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Mesh Edit");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit Custom Mesh");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Fine Tuning Mesh");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Done Editing Mesh");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Build Custom Mesh");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Build Mesh");
+ #if HAS_PREHEAT
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Build Mesh ($)");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Validate Mesh ($)");
+ #endif
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Build Cold Mesh");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Adjust Mesh Height");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Height Amount");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validate Mesh");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validate Custom Mesh");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 Heating Bed");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 Heating Nozzle");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Manual priming...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Fixed Length Prime");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Done Priming");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 Canceled");
+ LSTR MSG_G26_LEAVING = _UxGT("Leaving G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Continue Bed Mesh");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Mesh Leveling");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Point Leveling");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Grid Mesh Leveling");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Level Mesh");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Side Points");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Map Type");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Output Mesh Map");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Output for Host");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Output for CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Off Imprimanta Backup");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Output UBL Info");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Fill-in Amount");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Manual Fill-in");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Smart Fill-in");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Fill-in Mesh");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidate All");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidate Closest");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Fine Tune All");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Fine Tune Closest");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Storage");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Memory Slot");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Load Bed Mesh");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Save Bed Mesh");
+ LSTR MSG_MESH_LOADED = _UxGT("Mesh %i Loaded");
+ LSTR MSG_MESH_SAVED = _UxGT("Mesh %i Saved");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("No Storage");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Err: UBL Save");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Err: UBL Restore");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Stopped");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Step-By-Step UBL");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Build Cold Mesh");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2. Smart Fill-in");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Validate Mesh");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Fine Tune All");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Validate Mesh");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Fine Tune All");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7. Save Bed Mesh");
+
+ LSTR MSG_LED_CONTROL = _UxGT("LED Control");
+ LSTR MSG_LEDS = _UxGT("Lights");
+ LSTR MSG_LED_PRESETS = _UxGT("Light Presets");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Red");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Orange");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Yellow");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Green");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Blue");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Indigo");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Violet");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("White");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Default");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Custom Lights");
+ LSTR MSG_INTENSITY_R = _UxGT("Red Intensity");
+ LSTR MSG_INTENSITY_G = _UxGT("Green Intensity");
+ LSTR MSG_INTENSITY_B = _UxGT("Blue Intensity");
+ LSTR MSG_INTENSITY_W = _UxGT("White Intensity");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Brightness");
+
+ LSTR MSG_MOVING = _UxGT("Moving...");
+ LSTR MSG_FREE_XY = _UxGT("Free XY");
+ LSTR MSG_MOVE_X = _UxGT("Move X");
+ LSTR MSG_MOVE_Y = _UxGT("Move Y");
+ LSTR MSG_MOVE_Z = _UxGT("Move Z");
+ LSTR MSG_MOVE_N = _UxGT("Move @");
+ LSTR MSG_MOVE_E = _UxGT("Extruder");
+ LSTR MSG_MOVE_EN = _UxGT("Extruder *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Capat Prea Rece");
+ LSTR MSG_MOVE_N_MM = _UxGT("Move $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Move 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Move 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Move 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Move 100mm");
+ LSTR MSG_SPEED = _UxGT("Speed");
+ LSTR MSG_BED_Z = _UxGT("Bed Z");
+ LSTR MSG_NOZZLE = _UxGT("Nozzle");
+ LSTR MSG_NOZZLE_N = _UxGT("Nozzle ~");
+ LSTR MSG_NOZZLE_PARKED = _UxGT("Nozzle Parked");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Nozzle Standby");
+ LSTR MSG_BED = _UxGT("Bed");
+ LSTR MSG_CHAMBER = _UxGT("Enclosure");
+ LSTR MSG_FAN_SPEED = _UxGT("Fan Speed");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Fan Speed ~");
+ LSTR MSG_STORED_FAN_N = _UxGT("Stored Fan ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Extra Fan Speed");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra Fan Speed ~");
+ LSTR MSG_CONTROLLER_FAN = _UxGT("Controller Fan");
+ LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Idle Speed");
+ LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Auto Mode");
+ LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("Active Speed");
+ LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("Idle Period");
+ LSTR MSG_FLOW = _UxGT("Flow");
+ LSTR MSG_FLOW_N = _UxGT("Flow ~");
+ LSTR MSG_CONTROL = _UxGT("Control");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact");
+ LSTR MSG_AUTOTEMP = _UxGT("Autotemp");
+ LSTR MSG_LCD_ON = _UxGT("On");
+ LSTR MSG_LCD_OFF = _UxGT("Off");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("PID Autotune");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("PID tuning done");
+ LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autotune failed! Bad extruder.");
+ LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autotune failed! Temperature too high.");
+ LSTR MSG_PID_TIMEOUT = _UxGT("Autotune failed! Timeout.");
+ LSTR MSG_SELECT = _UxGT("Select");
+ LSTR MSG_SELECT_E = _UxGT("Select *");
+ LSTR MSG_ACC = _UxGT("Accel");
+ LSTR MSG_JERK = _UxGT("Jerk");
+ LSTR MSG_VA_JERK = _UxGT("V") STR_A _UxGT("-Jerk");
+ LSTR MSG_VB_JERK = _UxGT("V") STR_B _UxGT("-Jerk");
+ LSTR MSG_VC_JERK = _UxGT("V") STR_C _UxGT("-Jerk");
+ LSTR MSG_VN_JERK = _UxGT("V@-Jerk");
+ LSTR MSG_VE_JERK = _UxGT("Ve-Jerk");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev");
+ LSTR MSG_MAX_SPEED = _UxGT("Max Speed");
+ LSTR MSG_VMAX_A = _UxGT("Max Speed ") STR_A;
+ LSTR MSG_VMAX_B = _UxGT("Max Speed ") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("Max Speed ") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("Max Speed @");
+ LSTR MSG_VMAX_E = _UxGT("Max Speed E");
+ LSTR MSG_VMAX_EN = _UxGT("Max Speed *");
+ LSTR MSG_VMIN = _UxGT("Vmin");
+ LSTR MSG_VTRAV_MIN = _UxGT("VTrav Min");
+ LSTR MSG_ACCELERATION = _UxGT("Acceleration");
+ LSTR MSG_AMAX_A = _UxGT("Amax ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Amax ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Amax ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Amax @");
+ LSTR MSG_AMAX_E = _UxGT("Amax E");
+ LSTR MSG_AMAX_EN = _UxGT("Amax *");
+ LSTR MSG_A_RETRACT = _UxGT("A-Retract");
+ LSTR MSG_A_TRAVEL = _UxGT("A-Travel");
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("Frequency max");
+ LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Feed min");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Steps/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" steps/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" steps/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" steps/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ steps/mm");
+ LSTR MSG_E_STEPS = _UxGT("E steps/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* steps/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperature");
+ LSTR MSG_MOTION = _UxGT("Motion");
+ LSTR MSG_FILAMENT = _UxGT("Filament");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit in mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *");
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Fil. Dia.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Unload mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Load mm");
+ LSTR MSG_ADVANCE_K = _UxGT("Advance K");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *");
+ LSTR MSG_CONTRAST = _UxGT("LCD Contrast");
+ LSTR MSG_STORE_EEPROM = _UxGT("Store Settings");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Load Settings");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Restore Defaults");
+ LSTR MSG_INIT_EEPROM = _UxGT("Initialize EEPROM");
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Error");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Error");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Error");
+ LSTR MSG_SETTINGS_STORED = _UxGT("Settings Stored");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Media Update");
+ LSTR MSG_RESET_PRINTER = _UxGT("Reset Imprimanta");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Refresh");
+ LSTR MSG_INFO_SCREEN = _UxGT("Info Screen");
+ LSTR MSG_PREPARE = _UxGT("Prepare");
+ LSTR MSG_TUNE = _UxGT("Tune");
+ LSTR MSG_POWER_MONITOR = _UxGT("Power monitor");
+ LSTR MSG_CURRENT = _UxGT("Intensitate");
+ LSTR MSG_VOLTAGE = _UxGT("Voltaj");
+ LSTR MSG_POWER = _UxGT("Putere");
+ LSTR MSG_START_PRINT = _UxGT("Start Imprimare");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Urmatorul");
+ LSTR MSG_BUTTON_INIT = _UxGT("Initiere");
+ LSTR MSG_BUTTON_STOP = _UxGT("Stop");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Imprimeaza");
+ LSTR MSG_BUTTON_RESET = _UxGT("Reseteaza");
+ LSTR MSG_BUTTON_IGNORE = _UxGT("Ignora");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Anuleaza");
+ LSTR MSG_BUTTON_DONE = _UxGT("OK");
+ LSTR MSG_BUTTON_BACK = _UxGT("Inapoi");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Proceed");
+ LSTR MSG_PAUSING = _UxGT("Pausing...");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pause Print");
+ LSTR MSG_RESUME_PRINT = _UxGT("Resume Print");
+ LSTR MSG_STOP_PRINT = _UxGT("Stop Print");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Printing Object");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Cancel Object");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Cancel Object =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Outage Recovery");
+ LSTR MSG_MEDIA_MENU = _UxGT("Print from Media");
+ LSTR MSG_NO_MEDIA = _UxGT("No Media");
+ LSTR MSG_DWELL = _UxGT("Sleep...");
+ LSTR MSG_USERWAIT = _UxGT("Click to Resume...");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Print Paused");
+ LSTR MSG_PRINTING = _UxGT("Printing...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Print Aborted");
+ LSTR MSG_PRINT_DONE = _UxGT("Print Done");
+ LSTR MSG_NO_MOVE = _UxGT("No Move.");
+ LSTR MSG_KILLED = _UxGT("KILLED. ");
+ LSTR MSG_STOPPED = _UxGT("STOPPED. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Retract mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Retract V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V");
+ LSTR MSG_AUTORETRACT = _UxGT("Auto-Retract");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Swap Length");
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Swap Extra");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Purge Length");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Tool Inlocuire");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Raise");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Prime Speed");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Retract Speed");
+ LSTR MSG_FILAMENT_PARK_ENABLED = _UxGT("Park Head");
+ LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Recover Speed");
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Fan Speed");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Fan Time");
+ LSTR MSG_TOOL_MIGRATION_ON = _UxGT("Auto Pornit");
+ LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("Auto Oprit");
+ LSTR MSG_TOOL_MIGRATION = _UxGT("Tool Migration");
+ LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-migrare");
+ LSTR MSG_TOOL_MIGRATION_END = _UxGT("Last Extruder");
+ LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrate to *");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Inlocuire Filament");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Inlocuire Filament *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Incarcare Filament");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Incarcare Filament *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Scoatere Filament");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Scoatere Filament *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Scoate Tot");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Atasare Media");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Inlocuire Media");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Eliberare Media");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z Probe Past Bed");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Skew Factor");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Self-Test");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Reset");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Stow");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Deploy");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("SW-Mode");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mode");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mode");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Set BLTouch to 5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Set BLTouch to OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Report Drain");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("DANGER: Bad settings can cause damage! Proceed anyway?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Init TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Test");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Save");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Deploy TouchMI");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Deploy Z-Probe");
+ LSTR MSG_MANUAL_STOW = _UxGT("Stow Z-Probe");
+ LSTR MSG_HOME_FIRST = _UxGT("Home %s%s%s First");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Probe Offsets");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("Probe X Offset");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Probe Y Offset");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Probe Z Offset");
+ LSTR MSG_BABYSTEP_X = _UxGT("Babystep X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Babystep Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Babystep Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Babystep @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Total");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Endstop Abort");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Heating Failed");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: REDUNDANT TEMP");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("BED THERMAL RUNAWAY");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("CHAMBER T. RUNAWAY");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Err: MAXTEMP");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Err: MINTEMP");
+ LSTR MSG_HALTED = _UxGT("PRINTER HALTED");
+ LSTR MSG_PLEASE_RESET = _UxGT("Please Reset");
+ LSTR MSG_HEATING = _UxGT("Heating...");
+ LSTR MSG_COOLING = _UxGT("Cooling...");
+ LSTR MSG_BED_HEATING = _UxGT("Bed Heating...");
+ LSTR MSG_BED_COOLING = _UxGT("Bed Cooling...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Chamber Heating...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Chamber Cooling...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta Calibration");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Calibrate X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrate Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrate Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrate Center");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Delta Settings");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibration");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Diag Rod");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Inaltime");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Radius");
+ LSTR MSG_INFO_MENU = _UxGT("Despre Imprimanta");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Info Imprimanta");
+ LSTR MSG_3POINT_LEVELING = _UxGT("Nivelare in 3 puncte");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Nivelare Lineara");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Nivelare Bilineara");
+ LSTR MSG_UBL_LEVELING = _UxGT("Nivelarea Patului Unificata");
+ LSTR MSG_MESH_LEVELING = _UxGT("Nivelare Mesh");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Status Imprimanta");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Informatii Placa");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistoare");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extrudere");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Baud");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protocol");
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Runaway Watch: OFF");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Runaway Watch: ON");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend Idle Timeout");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Case Light");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Light Brightness");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("INCORRECT PRINTER");
+
+#if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Total Printuri");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Completat");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Timp Imprimare Total");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Longest Job Time");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extrudat");
+#else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Prints");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Completed");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Total");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Longest");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded");
+#endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Temperatura Minima");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Temperatura Maxima");
+ LSTR MSG_INFO_PSU = _UxGT("PSU");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Drive Strength");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Driver %");
+ LSTR MSG_ERROR_TMC = _UxGT("TMC CONNECTION ERROR");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Write");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMENT CHANGE");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("PRINT PAUSED");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("LOAD FILAMENT");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("UNLOAD FILAMENT");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("RESUME OPTIONS:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purge more");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continue");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozzle: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Runout Sensor");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout Dist mm");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Homing Failed");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Probing Failed");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOOSE FILAMENT");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("Update MMU Firmware!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Needs Attention.");
+ LSTR MSG_MMU2_RESUME = _UxGT("MMU Resume");
+ LSTR MSG_MMU2_RESUMING = _UxGT("MMU Resuming...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU Load");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("MMU Load All");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Load to Nozzle");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU Eject");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU Eject ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU Unload");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Loading Fil. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejecting Fil. ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Unloading Fil....");
+ LSTR MSG_MMU2_ALL = _UxGT("All");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filament ~");
+ LSTR MSG_MMU2_RESET = _UxGT("Reset MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("MMU Resetting...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Remove, click");
+
+ LSTR MSG_MIX = _UxGT("Mix");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Component =");
+ LSTR MSG_MIXER = _UxGT("Mixer");
+ LSTR MSG_GRADIENT = _UxGT("Gradient");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Full Gradient");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Toggle Mix");
+ LSTR MSG_CYCLE_MIX = _UxGT("Cycle Mix");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Gradient Mix");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Reverse Gradient");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Active V-tool");
+ LSTR MSG_START_VTOOL = _UxGT("Start V-tool");
+ LSTR MSG_END_VTOOL = _UxGT(" End V-tool");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Reset V-tools");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Commit V-tool Mix");
+ LSTR MSG_VTOOLS_RESET = _UxGT("V-tools Were Reset");
+ LSTR MSG_START_Z = _UxGT("Start Z:");
+ LSTR MSG_END_Z = _UxGT(" End Z:");
+
+ LSTR MSG_GAMES = _UxGT("Jocuri");
+ LSTR MSG_BRICKOUT = _UxGT("Brickout");
+ LSTR MSG_INVADERS = _UxGT("Invaders");
+ LSTR MSG_SNAKE = _UxGT("Sn4k3");
+ LSTR MSG_MAZE = _UxGT("Maze");
+
+ LSTR MSG_BAD_PAGE = _UxGT("Bad page index");
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("Bad page speed");
+
+ //
+ // Filament Inlocuire screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+#if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Apasa Butonul", "pentru a reveni la print"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parcare..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Astept ca", "inlocuirea filamentului", "sa inceapa"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Insert filament", "and press button", "to continue"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Press button", "to heat nozzle"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozzle heating", "Please wait..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Wait for", "filament unload"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Wait for", "filament load"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Wait for", "filament purge"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Click to finish", "filament purge"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Wait for print", "to resume..."));
+#else
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Click to continue"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parcare..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Va rog asteptati..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insert and Click"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Click pentru incalzire"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Incalzire..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Ejectare..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Incarcare..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Curatare..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Click pentru a termina"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Se Reia..."));
+#endif
+ LSTR MSG_TMC_DRIVERS = _UxGT("TMC Drivers");
+ LSTR MSG_TMC_CURRENT = _UxGT("Driver Current");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled");
+ LSTR MSG_SERVICE_RESET = _UxGT("Reset");
+ LSTR MSG_SERVICE_IN = _UxGT(" in:");
+ LSTR MSG_BACKLASH = _UxGT("Backlash");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Corectare");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("Nivelare Axa X");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrare");
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Timeout Incalzitor");
+ LSTR MSG_REHEAT = _UxGT("Reincalzire");
+ LSTR MSG_REHEATING = _UxGT("Reincalzire...");
+}
+
+#if FAN_COUNT == 1
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED
+#else
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N
+#endif
diff --git a/src/lcd/language/language_ru.h b/src/lcd/language/language_ru.h
new file mode 100644
index 0000000..c9b4683
--- /dev/null
+++ b/src/lcd/language/language_ru.h
@@ -0,0 +1,883 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Russian
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+#define DISPLAY_CHARSET_ISO10646_5
+
+namespace Language_ru {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Russian");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Готов.");
+ LSTR MSG_YES = _UxGT("Да");
+ LSTR MSG_NO = _UxGT("Нет");
+ LSTR MSG_BACK = _UxGT("Назад");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Прерывание...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("SD карта вставлена");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("SD карта извлечена");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Вставьте SD карту");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Сбой инициализации SD");
+ #else
+ LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Сбой инициализ. SD");
+ #endif
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Ошибка считывания");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB диск удалён");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("Ошибка USB диска");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переполнение вызова");
+ #else
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переполн. вызова");
+ #endif
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Прогр. эндстопы");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Эндстопы"); // Max length 8 characters
+ LSTR MSG_MAIN = _UxGT("Основное меню");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Другие настройки");
+ LSTR MSG_CONFIGURATION = _UxGT("Конфигурация");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Автостарт");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Выключить двигатели");
+ LSTR MSG_DEBUG_MENU = _UxGT("Меню отладки");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Тест индикатора");
+ LSTR MSG_AUTO_HOME = _UxGT("Парковка XYZ");
+ LSTR MSG_AUTO_HOME_A = _UxGT("Парковка @");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Парковка X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Парковка Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Парковка Z");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Авто Z-выравнивание");
+ LSTR MSG_ITERATION = _UxGT("G34 Итерация: %i");
+ LSTR MSG_DECREASING_ACCURACY = _UxGT("Уменьшение точности!");
+ LSTR MSG_ACCURACY_ACHIEVED = _UxGT("Точность достигнута");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Нулевое положение");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Нажмите чтобы начать");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Следующая точка");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Выравнивание готово!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Высота спада");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Установ. смещения дома");
+ LSTR MSG_HOME_OFFSET_X = _UxGT("Смещение дома X");
+ LSTR MSG_HOME_OFFSET_Y = _UxGT("Смещение дома Y");
+ LSTR MSG_HOME_OFFSET_Z = _UxGT("Смещение дома Z");
+ #else
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Установ.смещ.дома");
+ LSTR MSG_HOME_OFFSET_X = _UxGT("Смещ. дома X");
+ LSTR MSG_HOME_OFFSET_Y = _UxGT("Смещ. дома Y");
+ LSTR MSG_HOME_OFFSET_Z = _UxGT("Смещ. дома Z");
+ #endif
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Смещения применены");
+ LSTR MSG_SELECT_ORIGIN = _UxGT("Выберите ноль");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_LAST_VALUE_SP = _UxGT("Последнее знач. ");
+ #else
+ LSTR MSG_LAST_VALUE_SP = _UxGT("Послед. знач. ");
+ #endif
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Преднагрев ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Нагрев ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Нагрев ") PREHEAT_1_LABEL _UxGT(" сопло");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Нагрев ") PREHEAT_1_LABEL _UxGT(" сопло ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Нагрев ") PREHEAT_1_LABEL _UxGT(" всё");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Нагрев ") PREHEAT_1_LABEL _UxGT(" стол");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Нагрев ") PREHEAT_1_LABEL _UxGT(" правка");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Преднагрев $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Нагрев $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Нагрев $ сопло");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Нагрев $ сопло ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Нагрев $ всё");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Нагрев $ стол");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Нагрев $ правка");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Нагрев Свой");
+ LSTR MSG_COOLDOWN = _UxGT("Охлаждение");
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("Частота");
+ LSTR MSG_LASER_MENU = _UxGT("Управление лазером");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_SPINDLE_MENU = _UxGT("Управление шпинделем");
+ LSTR MSG_LASER_TOGGLE = _UxGT("Переключить лазер");
+ LSTR MSG_SPINDLE_TOGGLE = _UxGT("Переключ.шпиндель");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Мощность шпинделя");
+ LSTR MSG_LASER_POWER = _UxGT("Мощность лазера");
+ LSTR MSG_LASER_PULSE_MS = _UxGT("Тестовый импульс мс");
+ LSTR MSG_LASER_EVAC_TOGGLE = _UxGT("Переключить обдув");
+ LSTR MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Переключить вакуум");
+ #else
+ LSTR MSG_SPINDLE_MENU = _UxGT("Управление шпинд.");
+ LSTR MSG_LASER_TOGGLE = _UxGT("Переключ.лазер");
+ LSTR MSG_SPINDLE_TOGGLE = _UxGT("Переключ.шпинд");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Мощн.шпинделя");
+ LSTR MSG_LASER_POWER = _UxGT("Мощн. лазера");
+ LSTR MSG_LASER_PULSE_MS = _UxGT("Тест. имп. мс");
+ LSTR MSG_LASER_EVAC_TOGGLE = _UxGT("Переключ. обдув");
+ LSTR MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Переключ. вакуум");
+ #endif
+ LSTR MSG_LASER_ASSIST_TOGGLE = _UxGT("Управление обдувом");
+ LSTR MSG_FLOWMETER_FAULT = _UxGT("Ошибка обдува");
+ LSTR MSG_LASER_FIRE_PULSE = _UxGT("Импульс лазера");
+ LSTR MSG_SPINDLE_FORWARD = _UxGT("Шпиндель вперёд");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Инверсия шпинделя");
+
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Включить питание");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Выключить питание");
+ LSTR MSG_EXTRUDE = _UxGT("Экструзия");
+ LSTR MSG_RETRACT = _UxGT("Втягивание");
+ LSTR MSG_MOVE_AXIS = _UxGT("Движение по осям");
+ LSTR MSG_BED_LEVELING = _UxGT("Выравнивание стола");
+ LSTR MSG_LEVEL_BED = _UxGT("Выровнять стол");
+ LSTR MSG_BED_TRAMMING = _UxGT("Выровнять углы");
+ LSTR MSG_NEXT_CORNER = _UxGT("Следующий угол");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Вверх до срабатыв. зонда");
+ LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Углы в норме. Вырав.стола");
+ #else
+ LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Вверх до сраб. зонда");
+ LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Углы в норме. Вырав.");
+ #endif
+ LSTR MSG_BED_TRAMMING_GOOD_POINTS = _UxGT("Хорошие точки: ");
+ LSTR MSG_BED_TRAMMING_LAST_Z = _UxGT("Последняя Z: ");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_MESH_EDITOR = _UxGT("Смещение по Z");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Правка сетки окончена");
+ #else
+ LSTR MSG_MESH_EDITOR = _UxGT("Смещение Z");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Правка окончена");
+ #endif
+ LSTR MSG_EDIT_MESH = _UxGT("Редактировать сетку");
+ LSTR MSG_PROBING_POINT = _UxGT("Точка сетки");
+ LSTR MSG_MESH_X = _UxGT("Индекс X");
+ LSTR MSG_MESH_Y = _UxGT("Индекс Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Значение Z");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Свои команды");
+
+ LSTR MSG_M48_TEST = _UxGT("M48 тест Z-зонда");
+ LSTR MSG_M48_DEVIATION = _UxGT("Отклонение");
+ LSTR MSG_M48_POINT = _UxGT("M48 точка");
+ LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Зонд за пределами");
+
+ LSTR MSG_IDEX_MENU = _UxGT("Меню IDEX");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Размещение сопел");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Авто парковка");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Размножение");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Зеркальная копия");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Полный контроль");
+ LSTR MSG_IDEX_DUPE_GAP = _UxGT("Дублировать X-зазор");
+
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2-е сопло Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2-е сопло @");
+
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Выполняем G29");
+ LSTR MSG_UBL_TOOLS = _UxGT("Инструменты UBL");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Настройка UBL");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Точка разворота");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Ручной ввод сетки");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Разместить шайбу,измерить");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Убрать и замерить стол");
+ #else
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Разм.шайбу, измерить");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Убрать, измер. стол");
+ #endif
+ LSTR MSG_UBL_MESH_WIZARD = _UxGT("Мастер сеток UBL");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Измерение");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Двигаемся дальше");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Активировать UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Деактивировать UBL");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Редактор сеток");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Править свою сетку");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Температура стола");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Температура стола");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Температура сопла");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Температура сопла");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Построить свою сетку");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Правка сетки завершена");
+ #else
+ LSTR MSG_UBL_SET_TEMP_BED = LCD_STR_THERMOMETER _UxGT(" стола, ") LCD_STR_DEGREE "C";
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Своя ") LCD_STR_THERMOMETER _UxGT(" стола,") LCD_STR_DEGREE "C";
+ LSTR MSG_UBL_SET_TEMP_HOTEND = LCD_STR_THERMOMETER _UxGT(" сопла, ") LCD_STR_DEGREE "C";
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Своя ") LCD_STR_THERMOMETER _UxGT(" сопла,") LCD_STR_DEGREE "C";
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Построить свою");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Правка завершена");
+ #endif
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Точная правка сетки");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Построить сетку");
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Построить сетку $");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Построить холодную сетку");
+ #else
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Строить холод.сетку");
+ #endif
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Правка высоты сетки");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Высота");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Проверить сетку");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Проверить сетку $");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Проверить свою сетку");
+ #else
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Провер. сетку $");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Провер. свою сетку");
+ #endif
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 нагрев стола");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 нагрев сопла");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Ручная грунтовка");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Грунт фикс. длины");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Грунтовка сделана");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 завершена");
+ LSTR MSG_G26_LEAVING = _UxGT("Выйти из G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Продолжить сетку");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Выравнивание сетки");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-х точечное выравнивание");
+ #else
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-точечное выравн.");
+ #endif
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Калибровка растера");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Выровнять сетку");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Крайние точки");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Тип карты");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Вывести карту сетки");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Вывести на хост");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Вывести в CSV");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Сохранить сетку снаружи");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Вывод информации UBL");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Кол-во заполнителя");
+ #else
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Сохранить снаружи");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Информация UBL");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Кол-во заполн.");
+ #endif
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Ручное заполнение");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Умное заполнение");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Заполнить сетку");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Аннулировать всё");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Аннулир. ближайшую");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно править всё");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Настр. ближ. точку");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Хранилище сеток");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Слот памяти");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Загрузить сетку");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Сохранить сетку");
+ LSTR MSG_MESH_LOADED = _UxGT("Сетка %i загружена");
+ LSTR MSG_MESH_SAVED = _UxGT("Сетка %i сохранена");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Нет хранилища");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Ошибка: Сохран. UBL");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Ошибка: Восстан.UBL");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Смещение Z: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Смещение Z останов.");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL пошагово");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Строить холодную");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2.Умное заполнение");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Проверить сетку");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Точно настр. всё");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Проверить сетку");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Точно настр. всё");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7.Сохранить сетку");
+
+ LSTR MSG_LED_CONTROL = _UxGT("Настройка подсветки");
+ LSTR MSG_LEDS = _UxGT("Подсветка");
+ LSTR MSG_LED_PRESETS = _UxGT("Предустановки света");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Красный");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Оранжевый");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Жёлтый");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Зелёный");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Синий");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Индиго");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Фиолетовый");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Белый");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Свет по умолчанию");
+ LSTR MSG_LED_CHANNEL_N = _UxGT("Канал =");
+ LSTR MSG_LEDS2 = _UxGT("Свет #2");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_NEO2_PRESETS = _UxGT("Свет #2 предустановки");
+ #else
+ LSTR MSG_NEO2_PRESETS = _UxGT("Свет #2 предустан.");
+ #endif
+ LSTR MSG_NEO2_BRIGHTNESS = _UxGT("Яркость");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Свой цвет подсветки");
+ LSTR MSG_INTENSITY_R = _UxGT("Уровень красного");
+ LSTR MSG_INTENSITY_G = _UxGT("Уровень зелёного");
+ LSTR MSG_INTENSITY_B = _UxGT("Уровень синего");
+ LSTR MSG_INTENSITY_W = _UxGT("Уровень белого");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Яркость");
+
+ LSTR MSG_MOVING = _UxGT("Движемся...");
+ LSTR MSG_FREE_XY = _UxGT("Освободить XY");
+ LSTR MSG_MOVE_X = _UxGT("Движение по X");
+ LSTR MSG_MOVE_Y = _UxGT("Движение по Y");
+ LSTR MSG_MOVE_Z = _UxGT("Движение по Z");
+ LSTR MSG_MOVE_N = _UxGT("Движение по @");
+ LSTR MSG_MOVE_E = _UxGT("Экструдер");
+ LSTR MSG_MOVE_EN = _UxGT("Экструдер *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Сопло не нагрето");
+ LSTR MSG_MOVE_N_MM = _UxGT("Движение %sмм");
+ LSTR MSG_MOVE_01MM = _UxGT("Движение 0.1мм");
+ LSTR MSG_MOVE_1MM = _UxGT("Движение 1мм");
+ LSTR MSG_MOVE_10MM = _UxGT("Движение 10мм");
+ LSTR MSG_MOVE_100MM = _UxGT("Движение 100mm");
+ LSTR MSG_SPEED = _UxGT("Скорость");
+ LSTR MSG_BED_Z = _UxGT("Z стола");
+ LSTR MSG_NOZZLE = _UxGT("Сопло, ") LCD_STR_DEGREE "C";
+ LSTR MSG_NOZZLE_N = _UxGT("Сопло ~");
+ LSTR MSG_NOZZLE_PARKED = _UxGT("Сопло запарковано");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Сопло ожидает");
+ LSTR MSG_BED = _UxGT("Стол, ") LCD_STR_DEGREE "C";
+ LSTR MSG_CHAMBER = _UxGT("Камера,") LCD_STR_DEGREE "C";
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_COOLER = _UxGT("Охлаждение лазера");
+ LSTR MSG_COOLER_TOGGLE = _UxGT("Переключ. охлажд.");
+ LSTR MSG_FLOWMETER_SAFETY = _UxGT("Безопасн. потока");
+ #else
+ LSTR MSG_COOLER = _UxGT("Охлажд. лазера");
+ LSTR MSG_COOLER_TOGGLE = _UxGT("Переключ. охл.");
+ LSTR MSG_FLOWMETER_SAFETY = _UxGT("Безопас.потока");
+ #endif
+ LSTR MSG_LASER = _UxGT("Лазер");
+ LSTR MSG_FAN_SPEED = _UxGT("Кулер");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Кулер ~");
+ LSTR MSG_STORED_FAN_N = _UxGT("Сохранённый кулер ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Дополн. кулер");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Дополн. кулер ~");
+ LSTR MSG_CONTROLLER_FAN = _UxGT("Контроллер кулера");
+ LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Холостые обороты");
+ LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Автовключение");
+ LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("Рабочие обороты");
+ LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("Период простоя");
+ LSTR MSG_FLOW = _UxGT("Поток");
+ LSTR MSG_FLOW_N = _UxGT("Поток ~");
+ LSTR MSG_CONTROL = _UxGT("Настройки");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С мин");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С макс");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Фактор");
+ LSTR MSG_AUTOTEMP = _UxGT("Автотемпер.");
+ LSTR MSG_LCD_ON = _UxGT("Вкл");
+ LSTR MSG_LCD_OFF = _UxGT("Выкл");
+
+ LSTR MSG_PID_AUTOTUNE = _UxGT("Автоподбор PID");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("Автоподбор PID *");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("Подбор PID выполнен");
+ LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Сбой автоподбора! Плохой экструдер.");
+ LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Сбой автоподбора! Температура повышена.");
+ LSTR MSG_PID_TIMEOUT = _UxGT("Сбой автоподбора! Завершение времени.");
+
+ LSTR MSG_SELECT = _UxGT("Выбор");
+ LSTR MSG_SELECT_E = _UxGT("Выбор *");
+ LSTR MSG_ACC = _UxGT("Ускорение");
+ LSTR MSG_JERK = _UxGT("Рывок");
+ LSTR MSG_VA_JERK = _UxGT("V") STR_A _UxGT("-рывок");
+ LSTR MSG_VB_JERK = _UxGT("V") STR_B _UxGT("-рывок");
+ LSTR MSG_VC_JERK = _UxGT("V") STR_C _UxGT("-рывок");
+ LSTR MSG_VN_JERK = _UxGT("V@-рывок");
+ LSTR MSG_VE_JERK = _UxGT("Ve-рывок");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Отклонение узла");
+ #else
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Отклон. узла");
+ #endif
+ LSTR MSG_MAX_SPEED = _UxGT("Скорость, мм/с");
+ LSTR MSG_VMAX_A = _UxGT("Скор.макс ") STR_A;
+ LSTR MSG_VMAX_B = _UxGT("Скор.макс ") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("Скор.макс ") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("Скор.макс @");
+ LSTR MSG_VMAX_E = _UxGT("Скор.макс E");
+ LSTR MSG_VMAX_EN = _UxGT("Скор.макс *");
+ LSTR MSG_VMIN = _UxGT("Скор.мин");
+ LSTR MSG_VTRAV_MIN = _UxGT("Перемещение мин");
+ LSTR MSG_ACCELERATION = _UxGT("Ускорение, мм/с2");
+ LSTR MSG_AMAX_A = _UxGT("Ускор.макс ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Ускор.макс ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Ускор.макс ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Ускор.макс @");
+ LSTR MSG_AMAX_E = _UxGT("Ускор.макс E");
+ LSTR MSG_AMAX_EN = _UxGT("Ускор.макс *");
+ LSTR MSG_A_RETRACT = _UxGT("Ускор.втягив.");
+ LSTR MSG_A_TRAVEL = _UxGT("Ускор.путеш.");
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("Частота макс.");
+ LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Подача мин.");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Шагов/мм");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" шаг/мм");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" шаг/мм");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" шаг/мм");
+ LSTR MSG_N_STEPS = _UxGT("@ шаг/мм");
+ LSTR MSG_E_STEPS = _UxGT("E шаг/мм");
+ LSTR MSG_EN_STEPS = _UxGT("* шаг/мм");
+ LSTR MSG_TEMPERATURE = _UxGT("Температура");
+ LSTR MSG_MOTION = _UxGT("Движение");
+ LSTR MSG_FILAMENT = _UxGT("Филамент");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E в мм") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("E огран.,мм") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("E огран. *");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Диам. филамента");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Диам. филамента *");
+ #else
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Диам. филам.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Диам. филам. *");
+ #endif
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Загрузка, мм");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Выгрузка, мм");
+ LSTR MSG_ADVANCE_K = _UxGT("Kоэф. продвиж.");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Kоэф. продвиж. *");
+ LSTR MSG_CONTRAST = _UxGT("Контраст экрана");
+ LSTR MSG_STORE_EEPROM = _UxGT("Сохранить настройки");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Загрузить настройки");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("На базовые параметры");
+ LSTR MSG_INIT_EEPROM = _UxGT("Инициализация EEPROM");
+ #else
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("На базовые парам.");
+ LSTR MSG_INIT_EEPROM = _UxGT("Инициализ. EEPROM");
+ #endif
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("Сбой EEPROM: CRC");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Сбой EEPROM: индекс");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Сбой EEPROM: версия");
+ LSTR MSG_SETTINGS_STORED = _UxGT("Параметры сохранены");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Обновление прошивки");
+ LSTR MSG_RESET_PRINTER = _UxGT("Сброс принтера");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT(" Обновить");
+ LSTR MSG_INFO_SCREEN = _UxGT("Главный экран");
+ LSTR MSG_PREPARE = _UxGT("Подготовить");
+ LSTR MSG_TUNE = _UxGT("Настроить");
+ LSTR MSG_POWER_MONITOR = _UxGT("Монитор питания");
+ LSTR MSG_CURRENT = _UxGT("Ток");
+ LSTR MSG_VOLTAGE = _UxGT("Напряжение");
+ LSTR MSG_POWER = _UxGT("Мощность");
+ LSTR MSG_START_PRINT = _UxGT("Начало печати");
+
+ LSTR MSG_BUTTON_NEXT = _UxGT("Дальше"); //short text for buttons
+ LSTR MSG_BUTTON_INIT = _UxGT("Иниц-я");
+ LSTR MSG_BUTTON_STOP = _UxGT("Стоп");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Печать");
+ LSTR MSG_BUTTON_RESET = _UxGT("Сброс");
+ LSTR MSG_BUTTON_IGNORE = _UxGT("Игнорир.");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Отмена");
+ LSTR MSG_BUTTON_DONE = _UxGT("Готово");
+ LSTR MSG_BUTTON_BACK = _UxGT("Назад");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Продолжить");
+ LSTR MSG_BUTTON_SKIP = _UxGT("Пропустить");
+
+ LSTR MSG_PAUSE_PRINT = _UxGT("Пауза печати");
+ LSTR MSG_RESUME_PRINT = _UxGT("Продолжить печать");
+ LSTR MSG_HOST_START_PRINT = _UxGT("Старт с хоста");
+ LSTR MSG_STOP_PRINT = _UxGT("Остановить печать");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Печать объекта");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Завершить объект");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Завершить объект =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Восстановение сбоя");
+ LSTR MSG_MEDIA_MENU = _UxGT("Печать с SD карты");
+ LSTR MSG_NO_MEDIA = _UxGT("Нет SD карты");
+ LSTR MSG_DWELL = _UxGT("Сон...");
+ LSTR MSG_USERWAIT = _UxGT("Продолжить...");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Печать на паузе");
+ LSTR MSG_PRINTING = _UxGT("Печать...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Печать отменена");
+ LSTR MSG_PRINT_DONE = _UxGT("Печать завершена");
+ LSTR MSG_NO_MOVE = _UxGT("Нет движения.");
+ LSTR MSG_KILLED = _UxGT("УБИТО. ");
+ LSTR MSG_STOPPED = _UxGT("ОСТАНОВЛЕНО. ");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Втягивание, мм");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Смена втягив., мм");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Возврат смены, мм");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Возврат смены, V");
+ LSTR MSG_AUTORETRACT = _UxGT("Автовтягивание");
+ #else
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Втягив., мм");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Смена втяг.,мм");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Возвр.смены,мм");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Возвр.смены V");
+ LSTR MSG_AUTORETRACT = _UxGT("Автовтягив.");
+ #endif
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Подскок, мм");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Втягивание V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Возврат, мм");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Возврат V");
+
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Поменять длины");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Поменять дополнительно");
+ #else
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Поменять дополнит.");
+ #endif
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Очистить длину");
+
+ LSTR MSG_TOOL_CHANGE = _UxGT("Смена сопел");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Поднятие по Z");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Начальная скор.");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Скорость втягив.");
+ #else
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Началь.скор.");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Скор.втягив.");
+ #endif
+ LSTR MSG_FILAMENT_PARK_ENABLED = _UxGT("Парковать голову");
+ LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Вернуть скорость");
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Обороти кулера");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Время кулера");
+ LSTR MSG_TOOL_MIGRATION_ON = _UxGT("Авто Вкл.");
+ LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("Авто Выкл.");
+ LSTR MSG_TOOL_MIGRATION = _UxGT("Замена инструмента");
+ LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("Авто замена");
+ LSTR MSG_TOOL_MIGRATION_END = _UxGT("Последний экструдер");
+ LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("Замена на *");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Смена филамента");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Смена филамента *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Загрузить филамент");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Загрузить филамент *");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Выгрузить филамент *");
+ #else
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Подать филамент *");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Убрать филамент *");
+ #endif
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Выгрузить всё");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Установить SD карту");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Сменить SD карту");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Освободить SD карту");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z-зонд вне стола");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Фактор наклона");
+ LSTR MSG_BLTOUCH = _UxGT("Z-зонд BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Тестирование BLTouch");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Сброс BLTouch");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Поднять BLTouch");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Опустить BLTouch");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("Режим SW");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("Режим 5V");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("Режим OD");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Режим сохранения");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Установить на 5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Установить на OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Слив отчёта");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("ОПАСНОСТЬ: Неправильные параметры приводят к повреждениям! Продолжить?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("Z-Зонд TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Инициализация");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Тест Z-смещения");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Сохранить");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Установить TouchMI");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Установить зонд");
+ LSTR MSG_MANUAL_STOW = _UxGT("Загрузить зонд");
+ LSTR MSG_HOME_FIRST = _UxGT("Сначала паркуй %s%s%s");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Смещения Z-зонда");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("Смещение X");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Смещение Y");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Смещение Z");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_MOVE_NOZZLE_TO_BED = _UxGT("Двигать сопло к столу");
+ #else
+ LSTR MSG_MOVE_NOZZLE_TO_BED = _UxGT("Двиг. сопло к столу");
+ #endif
+ LSTR MSG_BABYSTEP_X = _UxGT("Микрошаг X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Микрошаг Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Микрошаг Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Микрошаг @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Сумарно");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Сработал концевик");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Разогрев не удался");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Ошибка:Избыточная Т");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("УТЕЧКА ТЕПЛА");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("УТЕЧКА ТЕПЛА СТОЛА");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("УТЕЧКА ТЕПЛА КАМЕРЫ");
+ LSTR MSG_THERMAL_RUNAWAY_COOLER = _UxGT("УТЕЧКА ОХЛАЖДЕНИЯ");
+ LSTR MSG_COOLING_FAILED = _UxGT("ОХЛАДИТЬ НЕ УДАЛОСЬ");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Ошибка: Т макс.");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Ошибка: Т мин.");
+ LSTR MSG_HALTED = _UxGT("ПРИНТЕР ОСТАНОВЛЕН");
+ LSTR MSG_PLEASE_RESET = _UxGT("Сделайте сброс");
+ LSTR MSG_SHORT_DAY = _UxGT("д"); // One character only
+ LSTR MSG_SHORT_HOUR = _UxGT("ч"); // One character only
+ LSTR MSG_SHORT_MINUTE = _UxGT("м"); // One character only
+ LSTR MSG_HEATING = _UxGT("Нагрев...");
+ LSTR MSG_COOLING = _UxGT("Охлаждение...");
+ LSTR MSG_BED_HEATING = _UxGT("Нагрев стола...");
+ LSTR MSG_BED_COOLING = _UxGT("Охлаждение стола...");
+ LSTR MSG_PROBE_HEATING = _UxGT("Нагрев зонда...");
+ LSTR MSG_PROBE_COOLING = _UxGT("Охлаждение зонда...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Нагрев камеры...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Охладжение камеры...");
+ LSTR MSG_LASER_COOLING = _UxGT("Охлаждение лазера...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Калибровка Delta");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Калибровать X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Калибровать Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Калибровать Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калибровать центр");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Настройки Delta");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Авто калибровка");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Стержень диаг.");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Высота");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Радиус");
+ LSTR MSG_INFO_MENU = _UxGT("О принтере");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Данные принтера");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_3POINT_LEVELING = _UxGT("3-точечное выравнивание");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Линейное выравнивание");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Билинейное выравнивание");
+ #else
+ LSTR MSG_3POINT_LEVELING = _UxGT("3-точ. выравнив.");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Линейное выравн.");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Билин. выравнив.");
+ #endif
+ LSTR MSG_UBL_LEVELING = _UxGT("Управление UBL");
+ LSTR MSG_MESH_LEVELING = _UxGT("Выравнивание сетки");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_MESH_DONE = _UxGT("Зондирование выполнено");
+ #else
+ LSTR MSG_MESH_DONE = _UxGT("Зондиров. выполнено");
+ #endif
+
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Статистика принтера");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Данные платы");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Термисторы");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Экструдеры");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Скорость,БОД");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Протокол");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Контроль утечки Т: Выкл");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Контроль утечки Т: Вкл");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Время простоя хотенда");
+ #else
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Контр.утечки Т:Выкл");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Контр.утечки Т:Вкл");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Время прост.хот-а");
+ #endif
+ LSTR MSG_CASE_LIGHT = _UxGT("Подсветка корпуса");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Яркость подсветки");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Неверный принтер");
+
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Счётчик печати");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Общее время печати");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Наидольшее задание");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Длина филамента");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Напечатано");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Общее время");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Наидольшее");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Выдавлено");
+ #endif
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Завершено");
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Мин. ") LCD_STR_THERMOMETER;
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Макс. ") LCD_STR_THERMOMETER;
+ LSTR MSG_INFO_PSU = _UxGT("БП");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Сила привода");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Привод, %");
+ LSTR MSG_ERROR_TMC = _UxGT("СБОЙ СВЯЗИ С TMC");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Запись DAC в EEPROM");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("ЗАМЕНА ФИЛАМЕНТА");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("ПЕЧАТЬ НА ПАУЗЕ");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ЗАГРУЗКА ФИЛАМЕНТА");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("ВЫГРУЗКА ФИЛАМЕНТА");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ОПЦИИ ПРОДОЛЖЕНИЯ:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Выдавить ещё");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Возобновить печать");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Сопла: ");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Датчик оконч. филамента");
+ #else
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Датчик оконч.филам.");
+ #endif
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("До конца, мм");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Ошибка парковки");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Ошибка зондирования");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ВЫБИРЕТЕ ФИЛАМЕНТ");
+ LSTR MSG_MMU2_MENU = _UxGT("Настройки MMU");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("Обновить прошивку MMU!");
+ #else
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("Обнови прошивку MMU");
+ #endif
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU требует внимания");
+ LSTR MSG_MMU2_RESUME = _UxGT("Продолжить печать");
+ LSTR MSG_MMU2_RESUMING = _UxGT("Продолжение...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("Загрузить филамент");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("Загрузить всё");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Загрузить в сопло");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("Извлечь филамент");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Извлечь филамент ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Выгрузить филамент");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Загрузка %i...");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Извлечение филамента...");
+ #else
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Извлеч.филамента...");
+ #endif
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Выгрузка....");
+ LSTR MSG_MMU2_ALL = _UxGT("Всё");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Филамент ~");
+ LSTR MSG_MMU2_RESET = _UxGT("Перезапуск MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("Перезапуск MMU...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Удалите и нажмите");
+
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_MIX = _UxGT("Смешивание");
+ #else
+ LSTR MSG_MIX = _UxGT("Смешив.");
+ #endif
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Компонент =");
+ LSTR MSG_MIXER = _UxGT("Смеситель");
+ LSTR MSG_GRADIENT = _UxGT("Градиент");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Полный градиент");
+ LSTR MSG_CYCLE_MIX = _UxGT("Цикличное смешивание");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Градиент смешивания");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Сменить градиент");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_TOGGLE_MIX = _UxGT("Переключить смешивание");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Активация В-инструм.");
+ LSTR MSG_START_VTOOL = _UxGT("Начало В-инструмента");
+ LSTR MSG_END_VTOOL = _UxGT("Конец В-инструмента");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Псевдоним В-инструмента");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Сброс В-инструментов");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Смешать В-инструменты");
+ LSTR MSG_VTOOLS_RESET = _UxGT("В-инструменты сброшены");
+ #else
+ LSTR MSG_TOGGLE_MIX = _UxGT("Перекл. смешивание");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Актив.В-инструм.");
+ LSTR MSG_START_VTOOL = _UxGT("В-инструм.нач.");
+ LSTR MSG_END_VTOOL = _UxGT("В-инструм.кон.");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Псевдоним В-инстр.");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Сброс В-инструм.");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Смешать В-инструм.");
+ LSTR MSG_VTOOLS_RESET = _UxGT("В-инструм. сброшены");
+ #endif
+ LSTR MSG_START_Z = _UxGT("Начало Z");
+ LSTR MSG_END_Z = _UxGT(" Конец Z");
+
+ LSTR MSG_GAMES = _UxGT("Игры");
+ LSTR MSG_BRICKOUT = _UxGT("Кирпичи");
+ LSTR MSG_INVADERS = _UxGT("Вторжение");
+ LSTR MSG_SNAKE = _UxGT("Змейка");
+ LSTR MSG_MAZE = _UxGT("Лабиринт");
+
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_BAD_PAGE = _UxGT("Плохой индекс страницы");
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("Плохая скорость страницы");
+ #else
+ LSTR MSG_BAD_PAGE = _UxGT("Плохая страница");
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("Плохая скор.стран.");
+ #endif
+
+ LSTR MSG_EDIT_PASSWORD = _UxGT("Редактировать пароль");
+ LSTR MSG_LOGIN_REQUIRED = _UxGT("Нужен логин");
+ LSTR MSG_PASSWORD_SETTINGS = _UxGT("Настройки пароля");
+ LSTR MSG_ENTER_DIGIT = _UxGT("Введите цифру");
+ LSTR MSG_CHANGE_PASSWORD = _UxGT("Смените пароль");
+ LSTR MSG_REMOVE_PASSWORD = _UxGT("Удалить пароль");
+ LSTR MSG_PASSWORD_SET = _UxGT("Пароль это ");
+ LSTR MSG_START_OVER = _UxGT("Старт через");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Запомни для сохранения!");
+ #else
+ LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Запомни, сохрани!");
+ #endif
+ LSTR MSG_PASSWORD_REMOVED = _UxGT("Пароль удалён");
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Парковка..."));
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Нажмите кнопку", "для продолжения", "печати"));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Ожидайте начала", "смены филамента"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Вставьте филамент", "и нажмите кнопку", "для продолжения"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_3_LINE("Нажмите кнопку", "для нагрева", "сопла..."));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Нагрев сопла", "Ждите..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Ожидайте", "выгрузки", "филамента"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Ожидайте", "загрузки", "филамента"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Ожидайте", "экструзии", "филамента"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Нажмите кнопку", "для завершения", "очистки филамента"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Ожидайте", "возобновления", "печати"));
+ #else
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Продолжить печать"));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Ожидайте..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Вставь и нажми"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Нагреть сопло"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Нагрев..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Выгрузка..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Загрузка..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Выдавливание..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Завершить очистку"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Возобновление..."));
+ #endif
+
+ LSTR MSG_TMC_DRIVERS = _UxGT("Драйвера TMC");
+ LSTR MSG_TMC_CURRENT = _UxGT("Ток двигателей");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Гибридный режим");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Режим без эндстопов");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Режим драйвера");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим вкл");
+
+ LSTR MSG_SERVICE_RESET = _UxGT("Сброс");
+ LSTR MSG_SERVICE_IN = _UxGT(" в:");
+ LSTR MSG_BACKLASH = _UxGT("Люфт");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Исправление");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Сглаживание");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("Уровень оси X");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Авто калибровка");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Время нагревателя вышло");
+ #else
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Время нагрев. вышло");
+ #endif
+ LSTR MSG_REHEAT = _UxGT("Возобновить нагрев");
+ LSTR MSG_REHEATING = _UxGT("Нагрев...");
+
+ LSTR MSG_PROBE_WIZARD = _UxGT("Мастер Z-зонда");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Зондиров. контр. точки Z");
+ LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Движение к точке зондиров.");
+ #else
+ LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Зондир.контр.точки Z");
+ LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Движ. к точке зондир.");
+ #endif
+
+ LSTR MSG_SOUND = _UxGT("Звук");
+
+ LSTR MSG_TOP_LEFT = _UxGT("Верхний левый");
+ LSTR MSG_BOTTOM_LEFT = _UxGT("Нижний левый");
+ LSTR MSG_TOP_RIGHT = _UxGT("Верхний правый");
+ LSTR MSG_BOTTOM_RIGHT = _UxGT("Нижний правый");
+ LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Калибровка успешна");
+ LSTR MSG_CALIBRATION_FAILED = _UxGT("Ошибка калибровки");
+
+ LSTR MSG_DRIVER_BACKWARD = _UxGT(" драйвер назад");
+
+ LSTR MSG_SD_CARD = _UxGT("SD Карта");
+ LSTR MSG_USB_DISK = _UxGT("USB Диск");
+}
+
+#if FAN_COUNT == 1
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED
+#else
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N
+#endif
diff --git a/src/lcd/language/language_sk.h b/src/lcd/language/language_sk.h
new file mode 100644
index 0000000..ef1396e
--- /dev/null
+++ b/src/lcd/language/language_sk.h
@@ -0,0 +1,820 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Slovak
+ * UTF-8 for Graphical Display
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ *
+ * Translated by Michal Holeš, Farma MaM
+ * https://www.facebook.com/farmamam
+ *
+ * Substitutions are applied for the following characters when used in menu items titles:
+ *
+ * $ displays an inserted string
+ * = displays '0'....'10' for indexes 0 - 10
+ * ~ displays '1'....'11' for indexes 0 - 10
+ * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL)
+ * @ displays an axis name such as XYZUVW, or E for an extruder
+ */
+#define DISPLAY_CHARSET_ISO10646_SK
+
+namespace Language_sk {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Slovenčina");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" pripravená.");
+ LSTR MSG_YES = _UxGT("ÁNO");
+ LSTR MSG_NO = _UxGT("NIE");
+ LSTR MSG_HIGH = _UxGT("VYSOKÁ");
+ LSTR MSG_LOW = _UxGT("NÍZKA");
+ LSTR MSG_BACK = _UxGT("Naspäť");
+ LSTR MSG_ERROR = _UxGT("Chyba");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Ruším...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Karta vložená");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Karta vybraná");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Čakám na kartu");
+ LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Inicial. SD zlyhala");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Chyba čítania karty");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB zaria. odstrán.");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("Chyba spúšťania USB");
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Preteč. podprogramu");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstopy"); // max 8 znakov
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft. endstopy");
+ LSTR MSG_MAIN = _UxGT("Hlavná ponuka");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Pokročilé nastav.");
+ LSTR MSG_TOOLBAR_SETUP = _UxGT("Panel nástrojov");
+ LSTR MSG_OPTION_DISABLED = _UxGT("Možnosť vypnutá");
+ LSTR MSG_CONFIGURATION = _UxGT("Konfigurácia");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Auto-štart");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Uvolniť motory");
+ LSTR MSG_DEBUG_MENU = _UxGT("Ponuka ladenia");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test uk. priebehu");
+ LSTR MSG_HOMING = _UxGT("Parkovanie");
+ LSTR MSG_AUTO_HOME = _UxGT("Domovská pozícia");
+ LSTR MSG_AUTO_HOME_A = _UxGT("Domov os @");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Domov os X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Domov os Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Domov os Z");
+ LSTR MSG_FILAMENT_SET = _UxGT("Nastav. filamentu");
+ LSTR MSG_FILAMENT_MAN = _UxGT("Správa filamentu");
+ LSTR MSG_MANUAL_LEVELING = _UxGT("Ručné rovnanie");
+ LSTR MSG_LEVBED_FL = _UxGT("Ľavý predný");
+ LSTR MSG_LEVBED_FR = _UxGT("Pravý predný");
+ LSTR MSG_LEVBED_C = _UxGT("Stred");
+ LSTR MSG_LEVBED_BL = _UxGT("Ľavý zadný");
+ LSTR MSG_LEVBED_BR = _UxGT("Pravý zadný");
+ LSTR MSG_MANUAL_MESH = _UxGT("Ručná mriežka");
+ LSTR MSG_AUTO_MESH = _UxGT("Automat. mriežka");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Auto-zarovn. Z");
+ LSTR MSG_ITERATION = _UxGT("Iterácia G34: %i");
+ LSTR MSG_DECREASING_ACCURACY = _UxGT("Klesajúca presnosť!");
+ LSTR MSG_ACCURACY_ACHIEVED = _UxGT("Dosiahnutá presnosť");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Parkovanie XYZ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Kliknutím začnete");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Ďalší bod");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Vyrovnanie hotové!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Výška rovnania");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Nastav. dom. ofsety");
+ LSTR MSG_HOME_OFFSET_X = _UxGT("X Ofset");
+ LSTR MSG_HOME_OFFSET_Y = _UxGT("Y Ofset");
+ LSTR MSG_HOME_OFFSET_Z = _UxGT("Z Ofset");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofsety nastavené");
+ LSTR MSG_TRAMMING_WIZARD = _UxGT("Spriev. vyrovn.");
+ LSTR MSG_SELECT_ORIGIN = _UxGT("Vyberte začiatok");
+ LSTR MSG_LAST_VALUE_SP = _UxGT("Posl. hodnota ");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Zahriať ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Zahriať ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" hotend");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" hotend ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" všetko");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" podlož");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Zahriať ") PREHEAT_1_LABEL _UxGT(" nast.");
+ #ifdef PREHEAT_2_LABEL
+ LSTR MSG_PREHEAT_2 = _UxGT("Zahriať ") PREHEAT_2_LABEL;
+ LSTR MSG_PREHEAT_2_SETTINGS = _UxGT("Zahriať ") PREHEAT_2_LABEL _UxGT(" nast.");
+ #endif
+ #ifdef PREHEAT_3_LABEL
+ LSTR MSG_PREHEAT_3 = _UxGT("Zahriať ") PREHEAT_3_LABEL;
+ LSTR MSG_PREHEAT_3_SETTINGS = _UxGT("Zahriať ") PREHEAT_3_LABEL _UxGT(" nast.");
+ #endif
+ LSTR MSG_PREHEAT_M = _UxGT("Zahriať $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Zahriať $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Zahriať $ hotend");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Zahriať $ hotend ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Zahriať $ všetko");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Zahriať $ podlož");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Zahriať $ nast.");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Vlastná teplota");
+ LSTR MSG_COOLDOWN = _UxGT("Schladiť");
+
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia");
+ LSTR MSG_LASER_MENU = _UxGT("Nastavenie lasera");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Nastavenie vretena");
+ LSTR MSG_LASER_POWER = _UxGT("Výkon lasera");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Výkon vretena");
+ LSTR MSG_LASER_TOGGLE = _UxGT("Prepnúť laser");
+ LSTR MSG_LASER_EVAC_TOGGLE = _UxGT("Prepnúť odsávanie");
+ LSTR MSG_LASER_ASSIST_TOGGLE = _UxGT("Prepnúť ofuk");
+ LSTR MSG_LASER_PULSE_MS = _UxGT("Test. impulz ms");
+ LSTR MSG_LASER_FIRE_PULSE = _UxGT("Vystreliť impulz");
+ LSTR MSG_FLOWMETER_FAULT = _UxGT("Chyba chladenia");
+ LSTR MSG_SPINDLE_TOGGLE = _UxGT("Prepnúť vreteno");
+ LSTR MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Prepnúť odsávanie");
+ LSTR MSG_SPINDLE_FORWARD = _UxGT("Dopredný chod");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Spätný chod");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Zapnúť napájanie");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Vypnúť napájanie");
+ LSTR MSG_EXTRUDE = _UxGT("Vytlačiť (extr.)");
+ LSTR MSG_RETRACT = _UxGT("Vytiahnuť (retr.)");
+ LSTR MSG_MOVE_AXIS = _UxGT("Posunúť osy");
+ LSTR MSG_BED_LEVELING = _UxGT("Vyrovnanie podložky");
+ LSTR MSG_LEVEL_BED = _UxGT("Vyrovnať podložku");
+ LSTR MSG_BED_TRAMMING = _UxGT("Vyrovnať rohy");
+ LSTR MSG_BED_TRAMMING_MANUAL = _UxGT("Ručné vyrovnanie");
+ LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Zdvihnite podl., kým sa nezopne sonda");
+ LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Rohy sú vrámci odchyl. Vyrovnajte podl.");
+ LSTR MSG_BED_TRAMMING_GOOD_POINTS = _UxGT("Dobré body: ");
+ LSTR MSG_BED_TRAMMING_LAST_Z = _UxGT("Posl. Z: ");
+ LSTR MSG_NEXT_CORNER = _UxGT("Ďalší roh");
+ LSTR MSG_MESH_EDITOR = _UxGT("Editor sieťe bodov");
+ LSTR MSG_MESH_VIEWER = _UxGT("Zobraz. sieťe bodov");
+ LSTR MSG_EDIT_MESH = _UxGT("Upraviť sieť bodov");
+ LSTR MSG_MESH_VIEW = _UxGT("Zobraz. sieť bodov");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Koniec úprav siete");
+ LSTR MSG_NO_VALID_MESH = _UxGT("Neplatná sieť bodov");
+ LSTR MSG_ACTIVATE_MESH = _UxGT("Zapnúť vyrovnanie");
+ LSTR MSG_PROBING_POINT = _UxGT("Skúšam bod");
+ LSTR MSG_MESH_X = _UxGT("Index X");
+ LSTR MSG_MESH_Y = _UxGT("Index Y");
+ LSTR MSG_MESH_INSET = _UxGT("Vložiť sieť");
+ LSTR MSG_MESH_MIN_X = _UxGT("Min. X sieťe");
+ LSTR MSG_MESH_MAX_X = _UxGT("Max. X sieťe");
+ LSTR MSG_MESH_MIN_Y = _UxGT("Min. Y sieťe");
+ LSTR MSG_MESH_MAX_Y = _UxGT("Max. Y sieťe");
+ LSTR MSG_MESH_AMAX = _UxGT("Maximál. oblasť");
+ LSTR MSG_MESH_CENTER = _UxGT("Stredová oblasť");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Hodnota Z");
+ LSTR MSG_MESH_CANCEL = _UxGT("Mriežka zrušená");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Vlastné príkazy");
+ LSTR MSG_M48_TEST = _UxGT("M48 Test sondy");
+ LSTR MSG_M48_POINT = _UxGT("M48 Bod");
+ LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda mimo hraníc");
+ LSTR MSG_M48_DEVIATION = _UxGT("Odchýlka");
+ LSTR MSG_IDEX_MENU = _UxGT("IDEX režim");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Ofset nástrojov");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-parkovanie");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikácia");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Zrkadlená kópia");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Plná kontrola");
+ LSTR MSG_IDEX_DUPE_GAP = _UxGT("Duplik. medz.-X");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2. tryska Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2. tryska @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Vykonávam G29");
+ LSTR MSG_UBL_TOOLS = _UxGT("Nástroje UBL");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("UBL rovnanie");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Vyrovnávam bod");
+ LSTR MSG_UBL_TILT_MESH = _UxGT("Nakloniť sieť");
+ LSTR MSG_UBL_TILTING_GRID = _UxGT("Veľkosť nakl. siete");
+ LSTR MSG_UBL_MESH_TILTED = _UxGT("Sieť naklonená");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Manuálna sieť bodov");
+ LSTR MSG_UBL_MESH_WIZARD = _UxGT("Spriev. UBL rovnan.");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Položte a zmerajte");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Zmerajte");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Odstráňte a zmerajte");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Presun na ďalší");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Aktivovať UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Deaktivovať UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Teplota podložky");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Teplota podložky");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Teplota hotendu");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Teplota hotendu");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Úprava siete bodov");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Upraviť vlastnú sieť");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Doladiť sieť bodov");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Koniec úprav siete");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Vlastná sieť");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Vytvoriť sieť");
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Sieť bodov ($)");
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Studená sieť bodov");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Upraviť výšku siete");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Výška");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Skontrolovať sieť");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Kontrola siete ($)");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Kontrola vlast.siete");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 ohrev podlž.");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 ohrev trysky");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Ručné čistenie...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Čistenie pevn. dĺž.");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Čistenie dokončené");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 zrušený");
+ LSTR MSG_G26_LEAVING = _UxGT("Opúšťam G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Pokračovať v sieti");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Sieťové rovnanie");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-bodové rovnanie");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Mriežkové rovnanie");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Vyrovnať podložku");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Postranné body");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Typ siete bodov");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Exportovať sieť");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Export do hosta");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Export do CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Externá záloha");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Info. o výst. UBL");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Hustota mriežky");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Ručné vyplnenie");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Chytré vyplnenie");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Vyplniť mriežku");
+ LSTR MSG_UBL_MESH_FILLED = _UxGT("Doplnené chýb. body");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Zrušiť všetko");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Zrušiť najbližší");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Upraviť všetky");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Upraviť najbližší");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Úložisko sietí");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Pamäťový slot");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Načítať sieť bodov");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Uložiť sieť bodov");
+ LSTR MSG_UBL_INVALID_SLOT = _UxGT("Najskôr zvol. slot siete");
+ LSTR MSG_MESH_LOADED = _UxGT("Sieť %i načítaná");
+ LSTR MSG_MESH_SAVED = _UxGT("Sieť %i uložená");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Nedostatok miesta");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Chyba: Ukladanie UBL");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Chyba: Obnovenie UBL");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-Ofset: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Koniec kompenz. Z");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Postupné UBL");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Studená sieť bodov");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2.Chytré vyplnenie");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Skontrolovať sieť");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Upraviť všetky");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Skontrolovať sieť");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Upraviť všetky");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7.Uložiť sieť bodov");
+
+ LSTR MSG_LED_CONTROL = _UxGT("Nastavenie LED");
+ LSTR MSG_LEDS = _UxGT("Svetlo");
+ LSTR MSG_LED_PRESETS = _UxGT("Predvolby svetla");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Červená");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Oranžová");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Žltá");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Zelená");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Modrá");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Indigo");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Fialová");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Biela");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Obnoviť nastavenie");
+ LSTR MSG_LED_CHANNEL_N = _UxGT("Kanál =");
+ LSTR MSG_LEDS2 = _UxGT("Svetlo #2");
+ LSTR MSG_NEO2_PRESETS = _UxGT("Predvolby svetla #2");
+ LSTR MSG_NEO2_BRIGHTNESS = _UxGT("Jas");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Vlastná farba");
+ LSTR MSG_INTENSITY_R = _UxGT("Inten. červenej");
+ LSTR MSG_INTENSITY_G = _UxGT("Inten. zelenej");
+ LSTR MSG_INTENSITY_B = _UxGT("Inten. modrej");
+ LSTR MSG_INTENSITY_W = _UxGT("Inten. bielej");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Jas");
+
+ LSTR MSG_MOVING = _UxGT("Posúvam...");
+ LSTR MSG_FREE_XY = _UxGT("Uvolniť XY");
+ LSTR MSG_MOVE_X = _UxGT("Posunúť X");
+ LSTR MSG_MOVE_Y = _UxGT("Posunúť Y");
+ LSTR MSG_MOVE_Z = _UxGT("Posunúť Z");
+ LSTR MSG_MOVE_N = _UxGT("Posunúť @");
+ LSTR MSG_MOVE_E = _UxGT("Extrudér");
+ LSTR MSG_MOVE_EN = _UxGT("Extrudér *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Hotend je studený");
+ LSTR MSG_MOVE_N_MM = _UxGT("Posunúť o $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Posunúť o 0,1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Posunúť o 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Posunúť o 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Posunúť o 100mm");
+ LSTR MSG_MOVE_0001IN = _UxGT("Posunúť o 0,001in");
+ LSTR MSG_MOVE_001IN = _UxGT("Posunúť o 0,01in");
+ LSTR MSG_MOVE_01IN = _UxGT("Posunúť o 0,1in");
+ LSTR MSG_MOVE_1IN = _UxGT("Posunúť o 1,0in");
+ LSTR MSG_SPEED = _UxGT("Rýchlosť");
+ LSTR MSG_BED_Z = _UxGT("Výška podl.");
+ LSTR MSG_NOZZLE = _UxGT("Tryska");
+ LSTR MSG_NOZZLE_N = _UxGT("Tryska ~");
+ LSTR MSG_NOZZLE_PARKED = _UxGT("Tryska zaparkovaná");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Záložná tryska");
+ LSTR MSG_BED = _UxGT("Podložka");
+ LSTR MSG_CHAMBER = _UxGT("Komora");
+ LSTR MSG_COOLER = _UxGT("Chladen. lasera");
+ LSTR MSG_COOLER_TOGGLE = _UxGT("Prepnúť chladenie");
+ LSTR MSG_FLOWMETER_SAFETY = _UxGT("Bezpeč. prietok");
+ LSTR MSG_LASER = _UxGT("Laser");
+ LSTR MSG_FAN_SPEED = _UxGT("Rýchlosť vent.");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Rýchlosť vent. ~");
+ LSTR MSG_STORED_FAN_N = _UxGT("Ulož. vent. ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Rýchlosť ex. vent.");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Rýchlosť ex. vent. ~");
+ LSTR MSG_CONTROLLER_FAN = _UxGT("Vent. riad. jedn.");
+ LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Voľno. rýchl.");
+ LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Auto-režim");
+ LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív. rýchl.");
+ LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("Doba nečinnosti");
+ LSTR MSG_FLOW = _UxGT("Prietok");
+ LSTR MSG_FLOW_N = _UxGT("Prietok ~");
+ LSTR MSG_CONTROL = _UxGT("Ovládanie");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fakt");
+ LSTR MSG_AUTOTEMP = _UxGT("Auto-teplota");
+ LSTR MSG_LCD_ON = _UxGT("Zap");
+ LSTR MSG_LCD_OFF = _UxGT("Vyp");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("Kalibrácia PID");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("Kalibrácia PID *");
+ LSTR MSG_PID_CYCLE = _UxGT("Cykly PID");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("Kal. PID dokončená");
+ LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Kal. PID zlyhala!");
+ LSTR MSG_BAD_EXTRUDER_NUM = _UxGT("Zlý extrudér");
+ LSTR MSG_TEMP_TOO_HIGH = _UxGT("Príliš vysoká tepl.");
+ LSTR MSG_TIMEOUT = _UxGT("Čas vypršal.");
+ LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Auto-kal. zlyhala! Zlý extrúder.");
+ LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Auto-kal. zlyhala! Príliš vysoká tepl.");
+ LSTR MSG_PID_TIMEOUT = _UxGT("Auto-kal. zlyhala! Čas vypršal.");
+ LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Test. tepl. straty");
+ LSTR MSG_MPC_AUTOTUNE = _UxGT("Auto-kal. MPC");
+ LSTR MSG_MPC_EDIT = _UxGT("Upraviť * MPC");
+ LSTR MSG_MPC_POWER_E = _UxGT("Výkon *");
+ LSTR MSG_MPC_BLOCK_HEAT_CAPACITY_E = _UxGT("Blokovať C *");
+ LSTR MSG_SENSOR_RESPONSIVENESS_E = _UxGT("Rozliš. senz. *");
+ LSTR MSG_MPC_AMBIENT_XFER_COEFF_E = _UxGT("H okolia *");
+ LSTR MSG_MPC_AMBIENT_XFER_COEFF_FAN_E = _UxGT("H vent. okolia *");
+ LSTR MSG_SELECT = _UxGT("Vybrať");
+ LSTR MSG_SELECT_E = _UxGT("Vybrať *");
+ LSTR MSG_ACC = _UxGT("Zrýchlenie");
+ LSTR MSG_JERK = _UxGT("Skok");
+ LSTR MSG_VA_JERK = _UxGT("V") STR_A _UxGT("-skok");
+ LSTR MSG_VB_JERK = _UxGT("V") STR_B _UxGT("-skok");
+ LSTR MSG_VC_JERK = _UxGT("V") STR_C _UxGT("-skok");
+ LSTR MSG_VN_JERK = _UxGT("V@-skok");
+ LSTR MSG_VE_JERK = _UxGT("Ve-skok");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev");
+ LSTR MSG_MAX_SPEED = _UxGT("Max rýchl. (mm/s)");
+ LSTR MSG_VMAX_A = _UxGT("Max rýchl. ") STR_A;
+ LSTR MSG_VMAX_B = _UxGT("Max rýchl. ") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("Max rýchl. ") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("Max rýchl. @");
+ LSTR MSG_VMAX_E = _UxGT("Max rýchl. E");
+ LSTR MSG_VMAX_EN = _UxGT("Max rýchl. *");
+ LSTR MSG_VMIN = _UxGT("Vmin");
+ LSTR MSG_VTRAV_MIN = _UxGT("VPrej Min");
+ LSTR MSG_ACCELERATION = _UxGT("Akcelerácia");
+ LSTR MSG_AMAX_A = _UxGT("Amax ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Amax ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Amax ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Amax @");
+ LSTR MSG_AMAX_E = _UxGT("Amax E");
+ LSTR MSG_AMAX_EN = _UxGT("Amax *");
+ LSTR MSG_A_RETRACT = _UxGT("A-retrakt");
+ LSTR MSG_A_TRAVEL = _UxGT("A-prejazd");
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("Max. frekvencia");
+ LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Min. posun");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Kroky/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" krokov/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" krokov/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" krokov/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ krokov/mm");
+ LSTR MSG_E_STEPS = _UxGT("E krokov/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* krokov/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Teplota");
+ LSTR MSG_MOTION = _UxGT("Pohyb");
+ LSTR MSG_FILAMENT = _UxGT("Filament");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E v mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit v mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *");
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Priem. fil.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Priem. fil. *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Vysunúť mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Zaviesť mm");
+ LSTR MSG_ADVANCE_K = _UxGT("K pre posun");
+ LSTR MSG_ADVANCE_K_E = _UxGT("K pre posun *");
+ LSTR MSG_CONTRAST = _UxGT("Kontrast LCD");
+ LSTR MSG_BRIGHTNESS = _UxGT("Jas LCD");
+ LSTR MSG_LCD_TIMEOUT_SEC = _UxGT("Čas. limit LCD (s)");
+ LSTR MSG_SCREEN_TIMEOUT = _UxGT("Čas. limit LCD (m)");
+ LSTR MSG_BRIGHTNESS_OFF = _UxGT("Podsviet. vyp.");
+ LSTR MSG_STORE_EEPROM = _UxGT("Uložiť nastavenie");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Načítať nastavenie");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Obnoviť nastavenie");
+ LSTR MSG_INIT_EEPROM = _UxGT("Inicializ. EEPROM");
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("Chyba: EEPROM CRC");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Chyba: EEPROM Index");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Chyba: Verzia EEPROM");
+ LSTR MSG_SETTINGS_STORED = _UxGT("Nastavenie uložené");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Aktualizovať z SD");
+ LSTR MSG_RESET_PRINTER = _UxGT("Reštart. tlačiar.");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Obnoviť");
+ LSTR MSG_INFO_SCREEN = _UxGT("Info. obrazovka");
+ LSTR MSG_INFO_MACHINENAME = _UxGT("Názov stroja");
+ LSTR MSG_INFO_SIZE = _UxGT("Rozmer");
+ LSTR MSG_INFO_FWVERSION = _UxGT("Verzia firmvéru");
+ LSTR MSG_INFO_BUILD = _UxGT("Čas zostavenia");
+ LSTR MSG_PREPARE = _UxGT("Príprava tlače");
+ LSTR MSG_TUNE = _UxGT("Doladenie tlače");
+ LSTR MSG_POWER_MONITOR = _UxGT("Monitor napájania");
+ LSTR MSG_CURRENT = _UxGT("Prúd");
+ LSTR MSG_VOLTAGE = _UxGT("Napätie");
+ LSTR MSG_POWER = _UxGT("Výkon");
+ LSTR MSG_START_PRINT = _UxGT("Spustiť tlač");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Ďalší");
+ LSTR MSG_BUTTON_INIT = _UxGT("Inicial.");
+ LSTR MSG_BUTTON_STOP = _UxGT("Zastaviť");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Tlačiť");
+ LSTR MSG_BUTTON_RESET = _UxGT("Vynulovať");
+ LSTR MSG_BUTTON_IGNORE = _UxGT("Ignorovať");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Zrušiť");
+ LSTR MSG_BUTTON_CONFIRM = _UxGT("Potvrdiť");
+ LSTR MSG_BUTTON_CONTINUE = _UxGT("Pokračovať");
+ LSTR MSG_BUTTON_DONE = _UxGT("Hotovo");
+ LSTR MSG_BUTTON_BACK = _UxGT("Naspäť");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Pokračovať");
+ LSTR MSG_BUTTON_SKIP = _UxGT("Preskočiť");
+ LSTR MSG_BUTTON_INFO = _UxGT("Informácie");
+ LSTR MSG_BUTTON_LEVEL = _UxGT("Vyrovnať");
+ LSTR MSG_BUTTON_PAUSE = _UxGT("Pauza");
+ LSTR MSG_BUTTON_RESUME = _UxGT("Obnoviť");
+ LSTR MSG_BUTTON_ADVANCED = _UxGT("Pokročilé");
+ LSTR MSG_BUTTON_SAVE = _UxGT("Uložiť");
+ LSTR MSG_BUTTON_PURGE = _UxGT("Vytlačiť");
+ LSTR MSG_PAUSING = _UxGT("Pozastavujem...");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pozastaviť tlač");
+ LSTR MSG_ADVANCED_PAUSE = _UxGT("Pokročil. pauza");
+ LSTR MSG_RESUME_PRINT = _UxGT("Obnoviť tlač");
+ LSTR MSG_HOST_START_PRINT = _UxGT("Spustiť z hosta");
+ LSTR MSG_STOP_PRINT = _UxGT("Zastaviť tlač");
+ LSTR MSG_END_LOOPS = _UxGT("Koniec opak. sluč.");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Tlačím objekt");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Zrušiť objekt");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Zrušiť objekt =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Obnova po výp. nap.");
+ LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Pokračovať v úlohe");
+ LSTR MSG_MEDIA_MENU = _UxGT("Tlačiť z SD");
+ LSTR MSG_NO_MEDIA = _UxGT("Žiadna SD karta");
+ LSTR MSG_DWELL = _UxGT("Spím...");
+ LSTR MSG_USERWAIT = _UxGT("Pokrač. kliknutím...");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Tlač pozastavená");
+ LSTR MSG_PRINTING = _UxGT("Tlačím...");
+ LSTR MSG_STOPPING = _UxGT("Zastavujem...");
+ LSTR MSG_REMAINING_TIME = _UxGT("Zostávajúci");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Tlač zrušená");
+ LSTR MSG_PRINT_DONE = _UxGT("Tlač dokončená");
+ LSTR MSG_PRINTER_KILLED = _UxGT("Tlačiareň zastavená!");
+ LSTR MSG_TURN_OFF = _UxGT("Vypnite tlačiareň");
+ LSTR MSG_NO_MOVE = _UxGT("Žiadny pohyb.");
+ LSTR MSG_KILLED = _UxGT("PRERUŠENÉ. ");
+ LSTR MSG_STOPPED = _UxGT("ZASTAVENÉ. ");
+ LSTR MSG_FWRETRACT = _UxGT("Firmv. retrakcia");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Retrakt mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Výmena Re.mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Retraktovať V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Zdvih Z mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V");
+ LSTR MSG_AUTORETRACT = _UxGT("Auto-Retract");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Dĺžka výmeny");
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Vymeniť naviac");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Dĺžka vytlačenia");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Výmena nástroja");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Zdvihnúť Z");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Primárna rýchl.");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Rýchl. retrakcie");
+ LSTR MSG_FILAMENT_PARK_ENABLED = _UxGT("Parkovať hlavu");
+ LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Rýchl. obnovenia");
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Rýchlosť vent.");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Doba fúkania");
+ LSTR MSG_TOOL_MIGRATION_ON = _UxGT("Auto-Zap");
+ LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("Auto-Vyp");
+ LSTR MSG_TOOL_MIGRATION = _UxGT("Výmena nástroja");
+ LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-výmena");
+ LSTR MSG_TOOL_MIGRATION_END = _UxGT("Posl. extruder");
+ LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("Vymeniť za *");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Vymeniť filament");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Vymeniť filament *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Zaviesť filament");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Zaviesť filament *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Vysunúť filament");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Vysunúť filament *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Vysunúť všetko");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Načítať SD kartu");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Vymeniť SD kartu");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Odpojiť SD kartu");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Sonda Z mimo podl.");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Faktor skosenia");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Self-Test");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Reset");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Zasunúť");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Vysunúť");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("Režim SW");
+ LSTR MSG_BLTOUCH_SPEED_MODE = _UxGT("Vysoká rýchl.");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("Režim 5V");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("Režim OD");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Ulož. režim");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Prepnúť do 5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Prepnúť do OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Zobraziť režim");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("POZOR: Zlé nastav. môže spôsobiť poškoden. Pokračovať?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Inicializ. TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Test Z ofsetu");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Uložiť");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Zasunúť TouchMI");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Zasunúť sondu Z");
+ LSTR MSG_MANUAL_STOW = _UxGT("Vysunúť sondu Z");
+ LSTR MSG_HOME_FIRST = _UxGT("Najskôr os %s%s%s domov");
+ LSTR MSG_ZPROBE_SETTINGS = _UxGT("Nastav. sondy");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Ofsety sondy Z");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("X ofset");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Y ofset");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Z ofset");
+ LSTR MSG_ZPROBE_MARGIN = _UxGT("Hranica sondy");
+ LSTR MSG_Z_FEED_RATE = _UxGT("Rýchl. posunu Z");
+ LSTR MSG_ENABLE_HS_MODE = _UxGT("Povoliť rež. HS");
+ LSTR MSG_MOVE_NOZZLE_TO_BED = _UxGT("Pos. trysku k podl.");
+ LSTR MSG_BABYSTEP_X = _UxGT("Babystep X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Babystep Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Babystep Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Babystep @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Celkom");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Zastavenie Endstop");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Chyba ohrevu");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Chyba: REDUND. TEP.");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("TEPLOTNÝ SKOK");
+ LSTR MSG_TEMP_MALFUNCTION = _UxGT("TEPLOTNÁ PORUCHA");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("TEPLOTNÝ SKOK PODL.");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("TEPLOTNÝ SKOK KOMO.");
+ LSTR MSG_THERMAL_RUNAWAY_COOLER = _UxGT("TEPLOTNÝ SKOK CHLAD.");
+ LSTR MSG_COOLING_FAILED = _UxGT("Ochladz. zlyhalo");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Chyba: MAXTEMP");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Chyba: MINTEMP");
+ LSTR MSG_HALTED = _UxGT("TLAČIAREŇ ZASTAVENÁ");
+ LSTR MSG_PLEASE_WAIT = _UxGT("Čakajte prosím...");
+ LSTR MSG_PLEASE_RESET = _UxGT("Reštartuje ju");
+ LSTR MSG_PREHEATING = _UxGT("Zahrievanie...");
+ LSTR MSG_HEATING = _UxGT("Ohrev...");
+ LSTR MSG_COOLING = _UxGT("Ochladzovanie...");
+ LSTR MSG_BED_HEATING = _UxGT("Ohrev podložky...");
+ LSTR MSG_BED_COOLING = _UxGT("Ochladz. podložky...");
+ LSTR MSG_PROBE_HEATING = _UxGT("Ohrev sondy...");
+ LSTR MSG_PROBE_COOLING = _UxGT("Ochladz. sondy...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Ohrev komory...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Ochladz. komory...");
+ LSTR MSG_LASER_COOLING = _UxGT("Ochladz. lasera...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta kalibrácia");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrovať X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrovať Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrovať Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrovať stred");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Delta nastavenia");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto-kalibrácia");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Diag. rameno");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Výška");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Polomer");
+ LSTR MSG_INFO_MENU = _UxGT("O tlačiarni");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Info. o tlačiarni");
+ LSTR MSG_3POINT_LEVELING = _UxGT("3-bodové rovnanie");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Lineárne rovnanie");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Bilineárne rovnanie");
+ LSTR MSG_UBL_LEVELING = _UxGT("UBL rovnanie");
+ LSTR MSG_MESH_LEVELING = _UxGT("Mriežkové rovnanie");
+ LSTR MSG_MESH_DONE = _UxGT("Mriežka dokončená");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Štatistika");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Info. o doske");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistory");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extrudéry");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Rýchlosť");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protokol");
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Tepl. ochrana: VYP");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Tepl. ochrana: ZAP");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Vypr.čas nečinnosti");
+ LSTR MSG_FAN_SPEED_FAULT = _UxGT("Chyba rýchl. vent.");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Osvetlenie");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Jas svetla");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Nesprávna tlačiareň");
+
+ LSTR MSG_COLORS_GET = _UxGT("Zvoliť farbu");
+ LSTR MSG_COLORS_SELECT = _UxGT("Zvoliť farby");
+ LSTR MSG_COLORS_APPLIED = _UxGT("Farby aplikované");
+ LSTR MSG_COLORS_RED = _UxGT("Červená");
+ LSTR MSG_COLORS_GREEN = _UxGT("Zelená");
+ LSTR MSG_COLORS_BLUE = _UxGT("Modrá");
+ LSTR MSG_COLORS_WHITE = _UxGT("Biela");
+ LSTR MSG_UI_LANGUAGE = _UxGT("Jazyk rozhrania");
+ LSTR MSG_SOUND_ENABLE = _UxGT("Povoliť zvuky");
+ LSTR MSG_LOCKSCREEN = _UxGT("Uzamknúť obrazovku");
+ LSTR MSG_LOCKSCREEN_LOCKED = _UxGT("Tlačiareň je uzamknutá,");
+ LSTR MSG_LOCKSCREEN_UNLOCK = _UxGT("potiahnite pre odomknutie.");
+ LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Prosím čakajte do reštartu.");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Nie je vložená karta.");
+ LSTR MSG_PLEASE_PREHEAT = _UxGT("Prosím zahrejte hotend.");
+ LSTR MSG_INFO_PRINT_COUNT_RESET = _UxGT("Vynulovať počítadlo");
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Počet tlačí");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Celkový čas");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Najdlhšia tlač");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Celkom vytlačené");
+ #else
+ LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Žiadna karta");
+ LSTR MSG_PLEASE_PREHEAT = _UxGT("Prosím zahrejte");
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Tlače");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Čas");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Najdlhšia");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Vytlačené");
+ #endif
+
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Dokončené");
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Teplota min");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Teplota max");
+ LSTR MSG_INFO_PSU = _UxGT("Nap. zdroj");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Budenie motorov");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Motor %");
+ LSTR MSG_ERROR_TMC = _UxGT("CHYBA KOMUNIKÁ. TMC");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Uložiť do EEPROM");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("VÝMENA FILAMENTU");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("PAUZA TLAČE");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ZAVEDENIE FILAMENTU");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("VYSUNUTIE FILAMENTU");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("MOŽNOSTI POKRAČ.:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Vytlačiť viacej");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Obnoviť tlač");
+ LSTR MSG_FILAMENT_CHANGE_PURGE_CONTINUE = _UxGT("Vytlač. alebo pokrač.?");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Tryska: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Senzor filamentu");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Vzd. mm fil. senz.");
+ LSTR MSG_RUNOUT_ENABLE = _UxGT("Zapnúť senzor");
+ LSTR MSG_RUNOUT_ACTIVE = _UxGT("Senz. fil. zapn.");
+ LSTR MSG_INVERT_EXTRUDER = _UxGT("Invert. extrudér");
+ LSTR MSG_EXTRUDER_MIN_TEMP = _UxGT("Min. tepl. extrud.");
+ LSTR MSG_FANCHECK = _UxGT("Kontrola rýchl.");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Parkovanie zlyhalo");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Kalibrácia zlyhala");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("VYBERTE FILAMENT");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU2");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("Aktualizujte FW MMU!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU potrebuje zásah.");
+ LSTR MSG_MMU2_RESUME = _UxGT("Obnoviť tlač");
+ LSTR MSG_MMU2_RESUMING = _UxGT("Obnovovanie...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("Zaviesť filament");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("Zaviesť všetky");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Zaviesť po trysku");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("Vysunúť filament");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Vysunúť filament ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Vyňať filament");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Zavádzanie fil. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Vysúvanie fil. ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Vysúvanie fil. ...");
+ LSTR MSG_MMU2_ALL = _UxGT("Všetky");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filament ~");
+ LSTR MSG_MMU2_RESET = _UxGT("Reštartovať MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("Reštart MMU...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Odstráňte, kliknite");
+
+ LSTR MSG_MIX = _UxGT("Mix");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Zložka ~");
+ LSTR MSG_MIXER = _UxGT("Mixér");
+ LSTR MSG_GRADIENT = _UxGT("Gradient");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Plný gradient");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Prepnúť mix");
+ LSTR MSG_CYCLE_MIX = _UxGT("Cyklický mix");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Gradientný mix");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Otočiť gradient");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Aktívny V-tool");
+ LSTR MSG_START_VTOOL = _UxGT("Počiat. V-tool");
+ LSTR MSG_END_VTOOL = _UxGT("Konečn. V-tool");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Vynulovať V-tools");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Uložiť V-tool Mix");
+ LSTR MSG_VTOOLS_RESET = _UxGT("V-tools vynulované");
+ LSTR MSG_START_Z = _UxGT("Počiat.Z:");
+ LSTR MSG_END_Z = _UxGT("Konečn.Z:");
+
+ LSTR MSG_GAMES = _UxGT("Hry");
+ LSTR MSG_BRICKOUT = _UxGT("Brickout");
+ LSTR MSG_INVADERS = _UxGT("Nájazdníci");
+ LSTR MSG_SNAKE = _UxGT("Had");
+ LSTR MSG_MAZE = _UxGT("Bludisko");
+
+ LSTR MSG_BAD_PAGE = _UxGT("Chyb. index stránky");
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("Chyb. rých. stránky");
+
+ LSTR MSG_EDIT_PASSWORD = _UxGT("Zmeniť heslo");
+ LSTR MSG_LOGIN_REQUIRED = _UxGT("Vyžad. sa prihl.");
+ LSTR MSG_PASSWORD_SETTINGS = _UxGT("Nastavenie hesla");
+ LSTR MSG_ENTER_DIGIT = _UxGT("Zvoľte číslo");
+ LSTR MSG_CHANGE_PASSWORD = _UxGT("Zmeniť heslo");
+ LSTR MSG_REMOVE_PASSWORD = _UxGT("Odstrániť heslo");
+ LSTR MSG_PASSWORD_SET = _UxGT("Heslo je ");
+ LSTR MSG_START_OVER = _UxGT("Začať odznova");
+ LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Nezabudnite uložiť!");
+ LSTR MSG_PASSWORD_REMOVED = _UxGT("Heslo odstránené");
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Stlačte tlačidlo", "pre obnovu tlače"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkovanie..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Čakajte prosím", "na spustenie", "výmeny filamentu"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Vložte filament", "a stlačte tlačidlo", "pre pokračovanie"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Stlačte tlačidlo", "pre ohrev trysky"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Ohrev trysky", "Čakajte prosím..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Čakajte prosím", "na vysunutie", "filamentu"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Čakajte prosím", "na zavedenie", "filamentu"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Čakajte prosím", "na vytlačenie", "filamentu"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Stlačte tlačidlo", "pre dokončenie", "vytláčania filam."));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Čakajte prosím na", "obnovenie tlače..."));
+ #else
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Kliknite pre pokr."));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkovanie..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Čakajte prosím..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Vložte a kliknite"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Kliknite pre ohrev"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Ohrev..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Vysúvanie..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Zavádzanie..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Vytlačovanie..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Klik. pre dokonč."));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Pokračovanie..."));
+ #endif
+ LSTR MSG_TMC_DRIVERS = _UxGT("Ovládače TMC");
+ LSTR MSG_TMC_CURRENT = _UxGT("Prúd ovládača");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybridný prah");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Bezsenzor. domov");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Režim krokovania");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop zapnutý");
+ LSTR MSG_SERVICE_RESET = _UxGT("Vynulovať");
+ LSTR MSG_SERVICE_IN = _UxGT("za:");
+ LSTR MSG_BACKLASH = _UxGT("Kompenz. vôle");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Korekcia");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Vyhladzovanie");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("Vyrovnať os X");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Auto-kalibrovať");
+ #if ENABLED(TOUCH_UI_FTDI_EVE)
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Vypršal čas ohrevu, znížená teplota. Stlačte OK pre ohrev a ešte raz pre obnovu.");
+ #else
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Vypršal čas ohrevu");
+ #endif
+ LSTR MSG_REHEAT = _UxGT("Zohriať");
+ LSTR MSG_REHEATING = _UxGT("Zohrievanie...");
+ LSTR MSG_REHEATDONE = _UxGT("Zohrievanie dokonč.");
+
+ LSTR MSG_PROBE_WIZARD = _UxGT("Sprievodca sondy Z");
+ LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Referencia Z");
+ LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Presúvam na pozíciu");
+
+ LSTR MSG_XATC = _UxGT("Sprievodca X-Twist");
+ LSTR MSG_XATC_DONE = _UxGT("Spriev. X-Twist dokonč.!");
+ LSTR MSG_XATC_UPDATE_Z_OFFSET = _UxGT("Aktual. ofset sondy Z na ");
+
+ LSTR MSG_SOUND = _UxGT("Zvuk");
+
+ LSTR MSG_TOP_LEFT = _UxGT("Ľavý horný");
+ LSTR MSG_BOTTOM_LEFT = _UxGT("Ľavý dolný");
+ LSTR MSG_TOP_RIGHT = _UxGT("Pravý horný");
+ LSTR MSG_BOTTOM_RIGHT = _UxGT("Pravý dolný");
+ LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Kalibrácia dokončená");
+ LSTR MSG_CALIBRATION_FAILED = _UxGT("Kalibrácia zlyhala");
+
+ LSTR MSG_DRIVER_BACKWARD = _UxGT(" spätný chod ovl.");
+
+ LSTR MSG_SD_CARD = _UxGT("SD karta");
+ LSTR MSG_USB_DISK = _UxGT("USB disk");
+
+ LSTR MSG_HOST_SHUTDOWN = _UxGT("Vypnúť hosta");
+}
diff --git a/src/lcd/language/language_sv.h b/src/lcd/language/language_sv.h
new file mode 100644
index 0000000..1342cca
--- /dev/null
+++ b/src/lcd/language/language_sv.h
@@ -0,0 +1,674 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License för more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Swedish
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_1
+
+namespace Language_sv {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Swedish");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Redo.");
+ LSTR MSG_YES = _UxGT("JA");
+ LSTR MSG_NO = _UxGT("NEJ");
+ LSTR MSG_BACK = _UxGT("Bakåt");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Avbryter...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Media Instatt");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Media Borttaget");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Väntar på media");
+ LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Media init misslyckades");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Media läsningsfel");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB enhet borttagen");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB start misslyckad");
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Underanrop överskriden");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Slutstop"); // Max length 8 characters
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Mjuk slutstopp");
+ LSTR MSG_MAIN = _UxGT("Huvud");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Advancerade inställningar");
+ LSTR MSG_CONFIGURATION = _UxGT("Konfiguration");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Autostarta Filer");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Inaktivera Stegare");
+ LSTR MSG_DEBUG_MENU = _UxGT("Debug Meny");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Framstegsindikator Test");
+ LSTR MSG_AUTO_HOME = _UxGT("Auto Hem");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Hem X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Hem Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Hem Z");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Justering");
+ LSTR MSG_ITERATION = _UxGT("G34 Iteration: %i");
+ LSTR MSG_DECREASING_ACCURACY = _UxGT("Noggrannhet Minskar!");
+ LSTR MSG_ACCURACY_ACHIEVED = _UxGT("Noggrannhet uppnådd");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Hemning XYZ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Klicka för att börja");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Nästa Punkt");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Nivellering Färdig!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Falna Höjd");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Sätt Hem Offset");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Offset Tillämpad");
+ LSTR MSG_TRAMMING_WIZARD = _UxGT("Justerings Wizard");
+ LSTR MSG_SELECT_ORIGIN = _UxGT("Välj Origo");
+ LSTR MSG_LAST_VALUE_SP = _UxGT("Senaste värde ");
+
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Förvärmning ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Förvärmning ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Förvärmning ") PREHEAT_1_LABEL _UxGT(" Stoppa");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Förvärmning ") PREHEAT_1_LABEL _UxGT(" Stoppa ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Förvärmning ") PREHEAT_1_LABEL _UxGT(" Alla");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Förvärmning ") PREHEAT_1_LABEL _UxGT(" Bädd");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Förvärmning ") PREHEAT_1_LABEL _UxGT(" Konf");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Förvärmning $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Förvärmning $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Förvärmning $ Stoppa");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Förvärmning $ Stoppa ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Förvärmning $ Alla");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Förvärmning $ Bädd");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Förvärmning $ Donf");
+ #endif
+
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Förvärmning Anpassad");
+ LSTR MSG_COOLDOWN = _UxGT("Nedkylning");
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("Frekvens");
+ LSTR MSG_LASER_MENU = _UxGT("Laser kontroll");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Spindel Kontroll");
+ LSTR MSG_LASER_POWER = _UxGT("Laser Styrka");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Spindel Styrka");
+ LSTR MSG_LASER_TOGGLE = _UxGT("Växla Laser");
+ LSTR MSG_LASER_PULSE_MS = _UxGT("Test Puls ms");
+ LSTR MSG_LASER_FIRE_PULSE = _UxGT("Avfyra Puls");
+ LSTR MSG_SPINDLE_TOGGLE = _UxGT("Växla Spindel");
+ LSTR MSG_SPINDLE_FORWARD = _UxGT("Spindel Framåt");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Spindel Bakåt");
+ LSTR MSG_LASER_OFF = _UxGT("Laser Av");
+ LSTR MSG_LASER_ON = _UxGT("Laser På");
+ LSTR MSG_SPINDLE_OFF = _UxGT("Spindel Av");
+ LSTR MSG_SPINDLE_ON = _UxGT("Spindel På");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Sätt på ström");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Stäng av ström");
+ LSTR MSG_EXTRUDE = _UxGT("Extrudera");
+ LSTR MSG_RETRACT = _UxGT("Dra tillbaka");
+ LSTR MSG_MOVE_AXIS = _UxGT("Flytta Axel");
+ LSTR MSG_BED_LEVELING = _UxGT("Bädd Nivellering");
+ LSTR MSG_LEVEL_BED = _UxGT("Nivellera Bädd");
+ LSTR MSG_BED_TRAMMING = _UxGT("Bädd Justering");
+ LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Höj Bädd tills nästa Sond Triggad");
+ LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Alla Hörn inom Tolerans. Nivellering Bädd");
+ LSTR MSG_BED_TRAMMING_GOOD_POINTS = _UxGT("Bra Punkter: ");
+ LSTR MSG_BED_TRAMMING_LAST_Z = _UxGT("Senaste Z: ");
+ LSTR MSG_NEXT_CORNER = _UxGT("Nästa Hörn");
+ LSTR MSG_MESH_EDITOR = _UxGT("Nät Redigerare");
+ LSTR MSG_EDIT_MESH = _UxGT("Redigera Nät");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Nätredigering Stoppad");
+ LSTR MSG_PROBING_POINT = _UxGT("Sonderingspunkt");
+ LSTR MSG_MESH_X = _UxGT("Index X");
+ LSTR MSG_MESH_Y = _UxGT("Index Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Z Värde");
+ LSTR MSG_USER_MENU = _UxGT("Anpassade Kommandon");
+ LSTR MSG_M48_TEST = _UxGT("M48 Sond Test");
+ LSTR MSG_M48_POINT = _UxGT("M48 Punkt");
+ LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Sond utan för gränser");
+ LSTR MSG_M48_DEVIATION = _UxGT("Avvikelse");
+ LSTR MSG_IDEX_MENU = _UxGT("IDEX Läge");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Verktygsoffset");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Parkera");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicering");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Speglad Kopia");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Full Kontroll");
+ LSTR MSG_IDEX_DUPE_GAP = _UxGT("Duplicera X-Avstånd");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2:a Munstycke Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2:a Munstycke @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Utför G29");
+ LSTR MSG_UBL_TOOLS = _UxGT("UBL Verktyg");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Enad Bädd Nivellering (UBL)");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Lutningspunkt");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Manuellt skapa nät");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Placera Shim & Mät");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Mät");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Ta bort & Mät bädd");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Flyttar till nästa");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Aktivera UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Avaktivera UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Bädd Temp");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bädd Temp");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Hetände Temp");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hetände Temp");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Nät Redigera");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Redigera Anpassat Nät");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Finjustera Nät");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Färdig Redigera Nät");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Bygg Anpassat Nät");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Bygg Nät");
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Bygg Nät ($)");
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Bygg Kallt Nät");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Justera Nät Höjd");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Höjd Antal");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Validera Nät");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Validera Nät ($)");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Validera Anpassat Nät");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 Värma Bädd");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 Värma Munstycke");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Manuel grundning...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Fastlängd Grundning");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Färdig Grundning");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 Avbruten");
+ LSTR MSG_G26_LEAVING = _UxGT("Nivellera G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Fortsätt Bädd Nät");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Nät Nivellering");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Punkts Nivellering");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Rutnät Nivellering");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Nivellera Nät");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Sidopunkter");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Kart Typ");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Utmatning Nät Map");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Utmatning för Värd");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Utmatning för CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Utanför skrivare Backup");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Utmatning UBL Info");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Ifyllnad Mängd");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Manuell Ifyllnad");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Smart Ifyllnad");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Ifyllnad Nät");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Ogiltigförklara Alla");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Ogiltigförklara Närmast");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Finjustera Alla");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Finjustera Närmast");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Nät Lagra");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Minnesöppning");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Ladda Bädd Nät");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Spara Bädd Nät");
+ LSTR MSG_MESH_LOADED = _UxGT("Nät %i Ladda");
+ LSTR MSG_MESH_SAVED = _UxGT("Nät %i Sparad");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Ingen Lagring");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Fel: UBL Sparad");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Fel: UBL Återställd");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Stoppad");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Steg-för-Steg UBL");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Bygg Kallt Nät");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2. Smart Ifyllnad");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Validera Nät");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Finjustera Alla");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Validera Nät");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Finjustera Alla");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7. Spara Bädd Nät");
+
+ LSTR MSG_LED_CONTROL = _UxGT("LED Kontroll");
+ LSTR MSG_LEDS = _UxGT("Ljus");
+ LSTR MSG_LED_PRESETS = _UxGT("Ljus Förinställd");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Röd");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Orange");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Gul");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Grön");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Blå");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Indigo");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Violet");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Vitt");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Standard");
+ LSTR MSG_LED_CHANNEL_N = _UxGT("Kanal =");
+ LSTR MSG_LEDS2 = _UxGT("Ljus #2");
+ LSTR MSG_NEO2_PRESETS = _UxGT("Ljus #2 Förinställd");
+ LSTR MSG_NEO2_BRIGHTNESS = _UxGT("Ljusstyrka");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Anpassat Ljus");
+ LSTR MSG_INTENSITY_R = _UxGT("Rör Intensitet");
+ LSTR MSG_INTENSITY_G = _UxGT("Grön Intensitet");
+ LSTR MSG_INTENSITY_B = _UxGT("Blå Intensitet");
+ LSTR MSG_INTENSITY_W = _UxGT("Vit Intensitet");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Brightness");
+
+ LSTR MSG_MOVING = _UxGT("Flyttar...");
+ LSTR MSG_FREE_XY = _UxGT("Fri XY");
+ LSTR MSG_MOVE_X = _UxGT("Flytta X");
+ LSTR MSG_MOVE_Y = _UxGT("Flytta Y");
+ LSTR MSG_MOVE_Z = _UxGT("Flytta Z");
+ LSTR MSG_MOVE_N = _UxGT("Flytta @");
+ LSTR MSG_MOVE_E = _UxGT("Extruder");
+ LSTR MSG_MOVE_EN = _UxGT("Extruder *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Hetände för kall");
+ LSTR MSG_MOVE_N_MM = _UxGT("Flytta $mm");
+ LSTR MSG_MOVE_01MM = _UxGT("Flytta 0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("Flytta 1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("Flytta 10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("Flytta 100mm");
+ LSTR MSG_MOVE_0001IN = _UxGT("Flytta 0.001tum");
+ LSTR MSG_MOVE_001IN = _UxGT("Flytta 0.01tum");
+ LSTR MSG_MOVE_01IN = _UxGT("Flytta 0.1tum");
+ LSTR MSG_SPEED = _UxGT("Hastighet");
+ LSTR MSG_BED_Z = _UxGT("Bädd Z");
+ LSTR MSG_NOZZLE = _UxGT("Munstycke");
+ LSTR MSG_NOZZLE_N = _UxGT("Munstycke ~");
+ LSTR MSG_NOZZLE_PARKED = _UxGT("Munstycke Parkerad");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Munstycke Standby");
+ LSTR MSG_BED = _UxGT("Bädd");
+ LSTR MSG_CHAMBER = _UxGT("Inkapsling");
+ LSTR MSG_FAN_SPEED = _UxGT("Fläkt Hastighet");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Fläkt Hastighet ~");
+ LSTR MSG_STORED_FAN_N = _UxGT("Lagrad Fläkt ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Extra Fläkt Hastighet");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra Fläkt Hastighet ~");
+ LSTR MSG_CONTROLLER_FAN = _UxGT("Kontroller Fläkt");
+ LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Overksam Hastighet");
+ LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Auto läga");
+ LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktive Hastighet");
+ LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("Overksam Period");
+ LSTR MSG_FLOW = _UxGT("Flöde");
+ LSTR MSG_FLOW_N = _UxGT("Flöde ~");
+ LSTR MSG_CONTROL = _UxGT("Kontroll");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fakt");
+ LSTR MSG_AUTOTEMP = _UxGT("Autotemp");
+ LSTR MSG_LCD_ON = _UxGT("På");
+ LSTR MSG_LCD_OFF = _UxGT("Av");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("PID Autojustera");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID Autojustera *");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("PID tuning done");
+ LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Autojustera misslyckad! Dålig extruder.");
+ LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Autojustera misslyckad! Temperatur för hög.");
+ LSTR MSG_PID_TIMEOUT = _UxGT("Autojustera misslyckad! Tidsgräns.");
+ LSTR MSG_SELECT = _UxGT("Välj");
+ LSTR MSG_SELECT_E = _UxGT("Välj *");
+ LSTR MSG_ACC = _UxGT("Accel");
+ LSTR MSG_JERK = _UxGT("Ryck");
+ LSTR MSG_VA_JERK = _UxGT("V") STR_A _UxGT("-Ryck");
+ LSTR MSG_VB_JERK = _UxGT("V") STR_B _UxGT("-Ryck");
+ LSTR MSG_VC_JERK = _UxGT("V") STR_C _UxGT("-Ryck");
+ LSTR MSG_VN_JERK = _UxGT("V@-Ryck");
+ LSTR MSG_VE_JERK = _UxGT("Ve-Ryck");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Knutpunkt Avv");
+ LSTR MSG_MAX_SPEED = _UxGT("Hastighet");
+ LSTR MSG_VMAX_A = _UxGT("Vmax ") STR_A;
+ LSTR MSG_VMAX_B = _UxGT("Vmax ") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("Vmax ") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("Vmax @");
+ LSTR MSG_VMAX_E = _UxGT("Vmax E");
+ LSTR MSG_VMAX_EN = _UxGT("Vmax *");
+ LSTR MSG_VMIN = _UxGT("Vmin");
+ LSTR MSG_VTRAV_MIN = _UxGT("VTrav Min");
+ LSTR MSG_ACCELERATION = _UxGT("Acceleration");
+ LSTR MSG_AMAX_A = _UxGT("Amax ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Amax ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Amax ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Amax @");
+ LSTR MSG_AMAX_E = _UxGT("Amax E");
+ LSTR MSG_AMAX_EN = _UxGT("Amax *");
+ LSTR MSG_A_RETRACT = _UxGT("A-Dra tillbaka");
+ LSTR MSG_A_TRAVEL = _UxGT("A-Färdas");
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("Frekvens max");
+ LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Flöde min");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Steg/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" Steg/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" Steg/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" Steg/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ Steg/mm");
+ LSTR MSG_E_STEPS = _UxGT("E Steg/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* Steg/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Temperatur");
+ LSTR MSG_MOTION = _UxGT("Rörelse");
+ LSTR MSG_FILAMENT = _UxGT("Tråd");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E i mm³");
+ LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("E Gräns i mm³");
+ LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Gräns *");
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Tråd Dia.");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Tråd Dia. *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Lossa mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Ladda mm");
+ LSTR MSG_ADVANCE_K = _UxGT("Advancera K");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Advancera K *");
+ LSTR MSG_CONTRAST = _UxGT("LCD Kontrast");
+ LSTR MSG_STORE_EEPROM = _UxGT("Spara Inställningar");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Ladda Inställningar");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Återställ Standard");
+ LSTR MSG_INIT_EEPROM = _UxGT("Initiera EEPROM");
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Fel");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Fel");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Fel");
+ LSTR MSG_SETTINGS_STORED = _UxGT("Inställningar Lagrad");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Media Uppdatera");
+ LSTR MSG_RESET_PRINTER = _UxGT("Återställ Skrivare");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Uppdatera");
+ LSTR MSG_INFO_SCREEN = _UxGT("Info Skärm");
+ LSTR MSG_PREPARE = _UxGT("Förbered");
+ LSTR MSG_TUNE = _UxGT("Justera");
+ LSTR MSG_POWER_MONITOR = _UxGT("Ström övervakning");
+ LSTR MSG_CURRENT = _UxGT("Ström");
+ LSTR MSG_VOLTAGE = _UxGT("Spänning");
+ LSTR MSG_POWER = _UxGT("Ström");
+ LSTR MSG_START_PRINT = _UxGT("Start Utskrift");
+ LSTR MSG_BUTTON_NEXT = _UxGT("Nästa");
+ LSTR MSG_BUTTON_INIT = _UxGT("Initiera");
+ LSTR MSG_BUTTON_STOP = _UxGT("Stoppa");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Skriv");
+ LSTR MSG_BUTTON_RESET = _UxGT("Återställa");
+ LSTR MSG_BUTTON_IGNORE = _UxGT("Ignorera");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Avbryt");
+ LSTR MSG_BUTTON_DONE = _UxGT("Färdig");
+ LSTR MSG_BUTTON_BACK = _UxGT("Bakåt");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Fortsätt");
+ LSTR MSG_BUTTON_SKIP = _UxGT("Hoppa över");
+ LSTR MSG_PAUSING = _UxGT("Paus..");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Pausera Utskrift");
+ LSTR MSG_RESUME_PRINT = _UxGT("Återuppta Utskrift");
+ LSTR MSG_HOST_START_PRINT = _UxGT("Värd Start");
+ LSTR MSG_STOP_PRINT = _UxGT("Stoppa Utskrift");
+ LSTR MSG_END_LOOPS = _UxGT("Slut Upprepningsloop");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Skriver Objekt");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Avbryt Objekt");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Avbryt Objekt =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Ström Avbrott");
+ LSTR MSG_MEDIA_MENU = _UxGT("Skriv fråm Media");
+ LSTR MSG_NO_MEDIA = _UxGT("Inget Media");
+ LSTR MSG_DWELL = _UxGT("Sov...");
+ LSTR MSG_USERWAIT = _UxGT("Klick för att återuppta...");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Utskrift Pausad");
+ LSTR MSG_PRINTING = _UxGT("Skriver...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Utskrift Avbruten");
+ LSTR MSG_PRINT_DONE = _UxGT("Utskrift Färdig");
+ LSTR MSG_NO_MOVE = _UxGT("Ingen Flytt.");
+ LSTR MSG_KILLED = _UxGT("DÖDAD. ");
+ LSTR MSG_STOPPED = _UxGT("STOPPAD. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Dra tillbaka mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Byt Dra.mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Dra tillbaka V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hoppa mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Åter dra tillbaka. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Byt åter dra t. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Återdrat. V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Byt åter dra. V");
+ LSTR MSG_AUTORETRACT = _UxGT("Auto-Dra-tillbka");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Byt Längd");
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Byt Extra");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Rensa Längd");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Byt verktyg");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Höj");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Grund Hastighet");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Återgå Hastighet");
+ LSTR MSG_FILAMENT_PARK_ENABLED = _UxGT("Parkera Huvud");
+ LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Återgår Hastighet");
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Fläkt Hastighet");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Fläkt Tid");
+ LSTR MSG_TOOL_MIGRATION_ON = _UxGT("Auto PÅ");
+ LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("Auto AV");
+ LSTR MSG_TOOL_MIGRATION = _UxGT("Verktyg Migration");
+ LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-migration");
+ LSTR MSG_TOOL_MIGRATION_END = _UxGT("Senast Extruder");
+ LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrera till *");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Byt Tråd");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Byt Tråd *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Ladda Tråd");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Ladda *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Lossa Tråd");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Lossa *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Lossa All");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Bifoga Media");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Byt Media");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Släpp Media");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z Sond Utanför Bädd");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Skev Faktor");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Själv-Test");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Återställ");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Stuva undan");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Fällut");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("SW-Läge");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("5V-Läge");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("OD-Läge");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Läge-Lägring");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Sätt BLTouch to 5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Sätt BLTouch to OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Reportera Dränering");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("FARA: Dålig inställningar kan orsaka skada! Fortsätt ändå?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Initiera TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Test");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Spara");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Fällut TouchMI");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Fällut Z-Sond");
+ LSTR MSG_MANUAL_STOW = _UxGT("Stuva undan Z-Sond");
+ LSTR MSG_HOME_FIRST = _UxGT("Hem %s%s%s Först");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Sond Offsets");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("Sond X Offset");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Sond Y Offset");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Sond Z Offset");
+ LSTR MSG_MOVE_NOZZLE_TO_BED = _UxGT("Flytta Munstycke till Bädd");
+ LSTR MSG_BABYSTEP_X = _UxGT("Småsteg X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Småsteg Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Småsteg Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Småsteg @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Total");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Slutstopp Avbrott");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Värma Misslyckad");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Fel: REDUNDANT TEMP");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("TERMISK ÖVERDRIFT");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("BÄDD TERMISK ÖVERDRIFT");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMMARE T. ÖVERDRIFT");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Fel: MAXTEMP");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Fel: MINTEMP");
+ LSTR MSG_HALTED = _UxGT("Utskrift stoppad");
+ LSTR MSG_PLEASE_RESET = _UxGT("Snälla Återställ");
+ LSTR MSG_SHORT_HOUR = _UxGT("t"); // One character only
+ LSTR MSG_HEATING = _UxGT("Värmer...");
+ LSTR MSG_COOLING = _UxGT("Kyler...");
+ LSTR MSG_BED_HEATING = _UxGT("Bädd Värmer...");
+ LSTR MSG_BED_COOLING = _UxGT("Bädd Kyler...");
+ LSTR MSG_PROBE_HEATING = _UxGT("Sond Värmer...");
+ LSTR MSG_PROBE_COOLING = _UxGT("Sond Kyler...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Kammare Värmer...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Kammare Kyler...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrering");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrera X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrera Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrera Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrera Center");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Delta Inställningar");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Kalibrering");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Diag Rod");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Höjd");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Radius");
+ LSTR MSG_INFO_MENU = _UxGT("Om Skrivaren");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Skrivare Info");
+ LSTR MSG_3POINT_LEVELING = _UxGT("3-Punkt Nivellering");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Linjär Nivellering");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Bilinjär Nivellering");
+ LSTR MSG_UBL_LEVELING = _UxGT("Enhetlig Bädd Nivellering (UBL)");
+ LSTR MSG_MESH_LEVELING = _UxGT("Nät Nivellering");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Skrivar Stats");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Kort Info");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistor");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Extruderare");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Baud");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protokoll");
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Överdrift Övervakning: AV");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Överdrift Övervakning: PÅ");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hetände Overksam Tidsgräns");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Lådljus");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Ljus ljusstyrka");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("INKORREKT SKRIVARE");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Utskriftsantal");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Färdiga");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Total Utskriftstid");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Längsta Jobbtid");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extruderade Totalt");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Utskrift");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Färdig");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Total");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Längsta");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Extruderad");
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Min Temp");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Max Temp");
+ LSTR MSG_INFO_PSU = _UxGT("PSU");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Driv Styrka");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Driver %");
+ LSTR MSG_ERROR_TMC = _UxGT("TMC KOPPLNINGSFEL");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Skriv");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("TRÅDBYTE");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("UTSKRIFTSPAUSERAD");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("LADDA TRÅD");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("LOSSA TRÅD");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ÅTERGÅ VAÖ:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Rensa mer");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Fortsätt");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Munstycke: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Utskjut Sensor");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Utskjut Dist mm");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Hemning Misslyckad");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Sondering Misslyckad");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("VÄLJ TRÅD");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("Uppdatera MMU Firmware!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Behöver uppmärksamhet.");
+ LSTR MSG_MMU2_RESUME = _UxGT("MMU Återuppta");
+ LSTR MSG_MMU2_RESUMING = _UxGT("MMU Återupptas...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU Ladda");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("MMU Ladda Alla");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Ladda till Munstycke");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU Mata ut");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU Mata ut ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU Lossa");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Ladda Tråd %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Mata ut Tråd ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Lossa Tråd...");
+ LSTR MSG_MMU2_ALL = _UxGT("Alla");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Tråd ~");
+ LSTR MSG_MMU2_RESET = _UxGT("Återställ MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("MMU Återställer...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Ta bort, Klicka");
+
+ LSTR MSG_MIX = _UxGT("Mixa");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Komponent =");
+ LSTR MSG_MIXER = _UxGT("Mixer");
+ LSTR MSG_GRADIENT = _UxGT("Gradient");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Full Gradient");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Växla Mix");
+ LSTR MSG_CYCLE_MIX = _UxGT("Totera Mix");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Gradient Mix");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Omvänd Gradient");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Aktive V-verktyg");
+ LSTR MSG_START_VTOOL = _UxGT("Start V-verktyg");
+ LSTR MSG_END_VTOOL = _UxGT(" Slut V-verktyg");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Alias V-verktyg");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Återställ V-verktyg");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Kommitta V-verktyg Mix");
+ LSTR MSG_VTOOLS_RESET = _UxGT("V-verktyg blev Återställda");
+ LSTR MSG_START_Z = _UxGT("Start Z:");
+ LSTR MSG_END_Z = _UxGT(" Slut Z:");
+
+ LSTR MSG_GAMES = _UxGT("Spel");
+ LSTR MSG_BRICKOUT = _UxGT("Brickout");
+ LSTR MSG_INVADERS = _UxGT("Invaders");
+ LSTR MSG_SNAKE = _UxGT("Sn4k3");
+ LSTR MSG_MAZE = _UxGT("Labyrint");
+
+ LSTR MSG_BAD_PAGE = _UxGT("Dålig sida index");
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("Dålig sida hastighet");
+
+ LSTR MSG_EDIT_PASSWORD = _UxGT("Redigera Lösenord");
+ LSTR MSG_LOGIN_REQUIRED = _UxGT("Login Krävs");
+ LSTR MSG_PASSWORD_SETTINGS = _UxGT("Lösenordsinställningar");
+ LSTR MSG_ENTER_DIGIT = _UxGT("Ange Siffra");
+ LSTR MSG_CHANGE_PASSWORD = _UxGT("Sätt/Redigera Lösenord");
+ LSTR MSG_REMOVE_PASSWORD = _UxGT("Ta bort Lösenord");
+ LSTR MSG_PASSWORD_SET = _UxGT("Lösenord är ");
+ LSTR MSG_START_OVER = _UxGT("Börja om");
+ LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Kom ihåg att Spara!");
+ LSTR MSG_PASSWORD_REMOVED = _UxGT("Lösenord Bort taget");
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Tryck på knappen", "för att fortsätta utskrift"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkera..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Vänta på", "trådbyte", "att börja"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Sätt in tråd", "och tryck på knappen", "för att fortsätta"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Tryck på knappen", "för att värma munstycke"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Munstycke värms", "Var snäll och vänta..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Väntar på", "trådlossning"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Väntar på", "trådladdning"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Väntar på", "tråd utrensning"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Klicka för att slutföra", "tråd utrensning"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Väntar på utskrift", "att återstarta..."));
+ #else
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Klick för att fortsätta"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkera..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Vänta..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Sätt in och klicka"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Klicka för att värma"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Värmer..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Lossar..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Laddar..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Rensar..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Klicka för att slutföra"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Återgår..."));
+ #endif
+ LSTR MSG_TMC_DRIVERS = _UxGT("TMC Drivers");
+ LSTR MSG_TMC_CURRENT = _UxGT("Driver Ström");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Tröskelvärde");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorlös Hemning");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stegningsläge");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Smyghack Aktiverad");
+ LSTR MSG_SERVICE_RESET = _UxGT("Återställ");
+ LSTR MSG_SERVICE_IN = _UxGT(" in:");
+ LSTR MSG_BACKLASH = _UxGT("Backlash");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Korrigering");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Glättning");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("Nivå X Axel");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Auto Kalibrera");
+ #if ENABLED(TOUCH_UI_FTDI_EVE)
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Overksam tidsgräns, temperatur minskning. Tryck ok för att återvärma och igen för att fortsätta.");
+ #else
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Värmare Tidsgräns");
+ #endif
+ LSTR MSG_REHEAT = _UxGT("Återvärm");
+ LSTR MSG_REHEATING = _UxGT("Återvärmning...");
+
+ LSTR MSG_PROBE_WIZARD = _UxGT("Z Sond Wizard");
+ LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Sondering Z Referens");
+ LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Flyttar till Sonderings Pos");
+
+ LSTR MSG_SOUND = _UxGT("Ljud");
+
+ LSTR MSG_TOP_LEFT = _UxGT("Uppe Vänster");
+ LSTR MSG_BOTTOM_LEFT = _UxGT("Nere Vänster");
+ LSTR MSG_TOP_RIGHT = _UxGT("Uppe Höger");
+ LSTR MSG_BOTTOM_RIGHT = _UxGT("Nere Höger");
+ LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Kalibrering Färdig");
+ LSTR MSG_CALIBRATION_FAILED = _UxGT("Kalibrering Misslyckad");
+}
diff --git a/src/lcd/language/language_test.h b/src/lcd/language/language_test.h
new file mode 100644
index 0000000..20b5a7e
--- /dev/null
+++ b/src/lcd/language/language_test.h
@@ -0,0 +1,236 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * TEST
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+// Select ONE of the following Mappers.
+// They decide what to do with a symbol in the area of [0x80:0xFF]. They take a symbol of this language file and make them point
+// into an array with 128 cells, where they'll find the place of the symbol of the font in use.
+//
+// a.)For ASCII coded Language_xx.h files like (en) there are no occurrences of symbols above 0x7F so no mapper is needed.
+// If such a symbol appears it is mapped directly into the font. This is the case for the language files we used until now, with all the STR_XX or
+// "\xxx" symbols. All Symbols are only one byte long.
+// b.) For Unicoded Language_xx.h files (currently ru, de and kana_utf8 ) the non ASCII [0x00-0x7F] symbols are represented by more than one byte.
+// In the case of two bytes the first is pointing to a 'codepage' and the second to a place in the codepage. These codepages contain 64 symbols.
+// So two of them can be mapped. For most of the European languages the necessary symbols are contained in the pages C2 and C3. Cyrillic uses D0
+// and D1.
+// c.) For katakana (one of the Japanese symbol sets) Unicode uses 3 bytes. Here the second byte also points to a codepage and byte 3 to the symbol.
+// I hope the pages E282 and E283 are sufficient to write katakana.
+// Kanji (an other Japanese symbol set) uses far more than two codepages. So currently I don't see a chance to map the Unicodes. Its not
+// impossible to have a close to direct mapping but will need giant conversion tables and fonts (we don't want to have in a embedded system).
+
+
+// Select the better font for full graphic displays.
+//#define DISPLAY_CHARSET_ISO10646_1
+//#define DISPLAY_CHARSET_ISO10646_5
+//#define DISPLAY_CHARSET_ISO10646_GREEK
+//#define DISPLAY_CHARSET_ISO10646_KANA
+
+
+
+// next 5 lines select variants in this file only
+#define DISPLAYTEST
+//#define WEST
+//#define CYRIL
+//#define KANA
+
+
+// TESTSTRINGS
+
+#define STRG_ASCII_2 _UxGT(" !\"#$%&'()*+,-./")
+#define STRG_ASCII_3 _UxGT("0123456789:;<=>?")
+#define STRG_ASCII_4 _UxGT("@ABCDEFGHIJKLMNO")
+#define STRG_ASCII_5 _UxGT("PQRSTUVWXYZ[\\]^_")
+#define STRG_ASCII_6 _UxGT("`abcdefghijklmno")
+#define STRG_ASCII_7 _UxGT("pqrstuvwxyz{|}~")
+
+#define STRG_C2_8 _UxGT("")
+#define STRG_C2_9 _UxGT("")
+#define STRG_C2_a _UxGT(" ¡¢£¤¥¦§¨©ª«¬®¯")
+#define STRG_C2_b _UxGT("°±²³´µ¶·¸¹º»¼½¾¿")
+#define STRG_C3_8 _UxGT("ÈÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ")
+#define STRG_C3_9 _UxGT("ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß")
+#define STRG_C3_a _UxGT("àáâãäåæçèéêëìíîï")
+#define STRG_C3_b _UxGT("ðñòóôõö÷øùúûüýþÿ")
+
+#define STRG_D0_8 _UxGT("ЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏ")
+#define STRG_D0_9 _UxGT("АБВГДЕЖЗИЙКЛМНОП")
+#define STRG_D0_a _UxGT("РСТУФХЦЧШЩЪЫЬЭЮЯ")
+#define STRG_D0_b _UxGT("абвгдежзийклмноп")
+#define STRG_D1_8 _UxGT("рстуфхцчшщъыьэюя")
+#define STRG_D1_9 _UxGT("ѐёђѓєѕіїјљњћќѝўџ")
+#define STRG_D1_a _UxGT("ѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯ")
+#define STRG_D1_b _UxGT("ѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿ")
+
+#define STRG_E382_8 _UxGT("よめもゃやゅゆょよらりるれろゎわ")
+#define STRG_E382_9 _UxGT("ゐゑをんゔゕゖ゙゚゛ ゜ゝゞゟ")
+#define STRG_E382_a _UxGT("゠ァアィイゥウェエォオカガキギク")
+#define STRG_E382_b _UxGT("グケゲコゴサザシジスズセゼソゾタ")
+#define STRG_E383_8 _UxGT("トチヂッツヅテデトドナニヌネノハ")
+#define STRG_E383_9 _UxGT("バパヒビピフブプヘベペホボポマミ")
+#define STRG_E383_a _UxGT("ムメモャヤュユョヨラリルレロヮワ")
+#define STRG_E383_b _UxGT("ヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ")
+
+#define STRG_OKTAL_0 "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017"
+#define STRG_OKTAL_1 "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define STRG_OKTAL_2 "\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057"
+#define STRG_OKTAL_3 "\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077"
+#define STRG_OKTAL_4 "\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117"
+#define STRG_OKTAL_5 "\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137"
+#define STRG_OKTAL_6 "\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157"
+#define STRG_OKTAL_7 "\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177"
+#define STRG_OKTAL_8 "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217"
+#define STRG_OKTAL_9 "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237"
+#define STRG_OKTAL_a "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257"
+#define STRG_OKTAL_b "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277"
+#define STRG_OKTAL_c "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317"
+#define STRG_OKTAL_d "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337"
+#define STRG_OKTAL_e "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357"
+#define STRG_OKTAL_f "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377"
+
+namespace Language_test {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 1;
+
+ #if ENABLED(DISPLAYTEST)
+ LSTR WELCOME_MSG = _UxGT("Language TEST");
+
+ LSTR MSG_INFO_SCREEN = _UxGT("Display test");
+ LSTR MSG_PREPARE = STRG_OKTAL_b;
+ LSTR MSG_CONTROL = STRG_OKTAL_c;
+ #endif
+
+ #if ENABLED(WEST)
+ LSTR WELCOME_MSG = _UxGT("Language TEST");
+
+ LSTR MSG_INFO_SCREEN = _UxGT("\001\002\003\004\005\006\007\010\011");
+ LSTR MSG_PREPARE = _UxGT("UTF8");
+ LSTR MSG_CONTROL = _UxGT("ASCII");
+
+ LSTR MSG_MAIN = _UxGT("..");
+ LSTR MSG_DISABLE_STEPPERS = STRG_C2_8;
+ LSTR MSG_AUTO_HOME = STRG_C2_9;
+ LSTR MSG_SET_HOME_OFFSETS = STRG_C2_a;
+ LSTR MSG_PREHEAT_1 = STRG_C2_b;
+ LSTR MSG_PREHEAT_2 = STRG_C3_8;
+ LSTR MSG_COOLDOWN = STRG_C3_9;
+ LSTR MSG_SWITCH_PS_OFF = STRG_C3_a;
+ LSTR MSG_MOVE_AXIS = STRG_C3_b;
+
+ LSTR MSG_MAIN = STRG_OKTAL_2;
+ LSTR MSG_TEMPERATURE = STRG_OKTAL_3;
+ LSTR MSG_MOTION = STRG_OKTAL_4;
+ LSTR MSG_FILAMENT = STRG_OKTAL_5;
+ LSTR MSG_CONTRAST = STRG_OKTAL_6;
+ LSTR MSG_RESTORE_DEFAULTS = STRG_OKTAL_7;
+
+ LSTR MSG_NOZZLE = STRG_OKTAL_8;
+ LSTR MSG_NOZZLE_N = STRG_OKTAL_8 " ~";
+ LSTR MSG_FAN_SPEED = STRG_OKTAL_9;
+ LSTR MSG_FAN_SPEED_N = STRG_OKTAL_9;
+ LSTR MSG_AUTOTEMP = STRG_OKTAL_a;
+ LSTR MSG_MIN = STRG_OKTAL_b;
+ LSTR MSG_MAX = STRG_OKTAL_c;
+ LSTR MSG_FACTOR = STRG_OKTAL_d;
+ LSTR MSG_PID_P = STRG_OKTAL_e;
+ LSTR MSG_PID_I = STRG_OKTAL_f;
+
+ #endif
+
+ #if ENABLED(CYRIL)
+ LSTR WELCOME_MSG = _UxGT("Language TEST");
+
+ LSTR MSG_INFO_SCREEN = _UxGT("\001\002\003\004\005\006\007\010\011");
+ LSTR MSG_PREPARE = _UxGT("UTF8");
+ LSTR MSG_CONTROL = _UxGT("ASCII");
+
+ LSTR MSG_MAIN = _UxGT("..");
+ LSTR MSG_DISABLE_STEPPERS = STRG_D0_8;
+ LSTR MSG_AUTO_HOME = STRG_D0_9;
+ LSTR MSG_SET_HOME_OFFSETS = STRG_D0_a;
+ LSTR MSG_PREHEAT_1 = STRG_D0_b;
+ LSTR MSG_PREHEAT_2 = STRG_D1_8;
+ LSTR MSG_COOLDOWN = STRG_D1_9;
+ LSTR MSG_SWITCH_PS_OFF = STRG_D1_a;
+ LSTR MSG_MOVE_AXIS = STRG_D1_b;
+
+ LSTR MSG_MAIN = STRG_OKTAL_2;
+ LSTR MSG_TEMPERATURE = STRG_OKTAL_3;
+ LSTR MSG_MOTION = STRG_OKTAL_4;
+ LSTR MSG_FILAMENT = STRG_OKTAL_5;
+ LSTR MSG_CONTRAST = STRG_OKTAL_6;
+ LSTR MSG_RESTORE_DEFAULTS = STRG_OKTAL_7;
+
+ LSTR MSG_NOZZLE = STRG_OKTAL_8;
+ LSTR MSG_NOZZLE_N = STRG_OKTAL_8 " ~";
+ LSTR MSG_FAN_SPEED_N = STRG_OKTAL_9;
+ LSTR MSG_AUTOTEMP = STRG_OKTAL_a;
+ LSTR MSG_MIN = STRG_OKTAL_b;
+ LSTR MSG_MAX = STRG_OKTAL_c;
+ LSTR MSG_FACTOR = STRG_OKTAL_d;
+ LSTR MSG_PID_P = STRG_OKTAL_e;
+ LSTR MSG_PID_I = STRG_OKTAL_f;
+
+ #endif
+
+ #if ENABLED(KANA)
+ LSTR WELCOME_MSG = _UxGT("Language TEST");
+
+ LSTR MSG_INFO_SCREEN = _UxGT("\001\002\003\004\005\006\007\010\011");
+ LSTR MSG_PREPARE = _UxGT("UTF8");
+ LSTR MSG_CONTROL = _UxGT("ASCII");
+
+ LSTR MSG_MAIN = _UxGT("..");
+ LSTR MSG_DISABLE_STEPPERS = STRG_E382_8;
+ LSTR MSG_AUTO_HOME = STRG_E382_9;
+ LSTR MSG_SET_HOME_OFFSETS = STRG_E382_a;
+ LSTR MSG_PREHEAT_1 = STRG_E382_b;
+ LSTR MSG_PREHEAT_2 = STRG_E383_8;
+ LSTR MSG_COOLDOWN = STRG_E383_9;
+ LSTR MSG_SWITCH_PS_OFF = STRG_E383_a;
+ LSTR MSG_MOVE_AXIS = STRG_E383_b;
+
+ LSTR MSG_MAIN = STRG_OKTAL_2;
+ LSTR MSG_TEMPERATURE = STRG_OKTAL_3;
+ LSTR MSG_MOTION = STRG_OKTAL_4;
+ LSTR MSG_FILAMENT = STRG_OKTAL_5;
+ LSTR MSG_CONTRAST = STRG_OKTAL_6;
+ LSTR MSG_RESTORE_DEFAULTS = STRG_OKTAL_7;
+
+ LSTR MSG_NOZZLE = STRG_OKTAL_8;
+ LSTR MSG_NOZZLE_N = STRG_OKTAL_8 " ~";
+ LSTR MSG_FAN_SPEED_N = STRG_OKTAL_9;
+ LSTR MSG_AUTOTEMP = STRG_OKTAL_a;
+ LSTR MSG_MIN = STRG_OKTAL_b;
+ LSTR MSG_MAX = STRG_OKTAL_c;
+ LSTR MSG_FACTOR = STRG_OKTAL_d;
+ LSTR MSG_PID_P = STRG_OKTAL_e;
+ LSTR MSG_PID_I = STRG_OKTAL_f;
+ #endif
+}
diff --git a/src/lcd/language/language_tr.h b/src/lcd/language/language_tr.h
new file mode 100644
index 0000000..cb27663
--- /dev/null
+++ b/src/lcd/language/language_tr.h
@@ -0,0 +1,579 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Turkish
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ *
+ * Bu çeviri dosyasındaki sorunlar ve düzeltmeler için iletişim;
+ * Contact for issues and corrections in this translation file;
+ * Yücel Temel - (info@elektromanyetix.com) - https://elektromanyetix.com/
+ */
+
+#define DISPLAY_CHARSET_ISO10646_TR
+
+namespace Language_tr {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Turkish");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" hazır.");
+ LSTR MSG_YES = _UxGT("EVET");
+ LSTR MSG_NO = _UxGT("HAYIR");
+ LSTR MSG_BACK = _UxGT("Geri");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Durduruluyor...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("SD K. Yerleştirildi.");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("SD Kart Çıkarıldı.");
+ LSTR MSG_MEDIA_WAITING = _UxGT("SD Kart Bekleniyor");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Kart Okuma Hatası");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB Çıkarıldı");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB Başlat. Hatası");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Enstops"); // Max length 8 characters
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Yazılımsal Endstops");
+ LSTR MSG_MAIN = _UxGT("Ana");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Gelişmiş Ayarlar");
+ LSTR MSG_CONFIGURATION = _UxGT("Yapılandırma");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Oto. Başlat");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Motorları Durdur");
+ LSTR MSG_DEBUG_MENU = _UxGT("Hata Ayıklama");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Durum Çubuğu Testi");
+ LSTR MSG_AUTO_HOME = _UxGT("Eksenleri Sıfırla");
+ LSTR MSG_AUTO_HOME_X = _UxGT("X Sıfırla");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Y Sıfırla");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Z Sıfırla");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Oto. Z-Hizalama");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("XYZ Sıfırlanıyor");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Başlatmak için tıkla");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Sonraki Nokta");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Hizalama Tamam!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Kaçınma Yüksekliği");
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Ofset Ayarla");
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Ofset Tamam");
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Ön Isınma ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Ön Isınma ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Nozul ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Tüm");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Tabla");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Ön Isınma ") PREHEAT_1_LABEL _UxGT(" Ayarlar");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Ön Isınma $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Ön Isınma $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Ön Isınma $ Nozul");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Ön Isınma $ Nozul ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Ön Isınma $ Tüm");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Ön Isınma $ Tabla");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Ön Isınma $ Ayarlar");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Özel Ön Isınma");
+ LSTR MSG_COOLDOWN = _UxGT("Soğut/(Durdur)");
+ LSTR MSG_LASER_MENU = _UxGT("Lazer Kontrolü");
+ LSTR MSG_LASER_POWER = _UxGT("Lazer Gücü");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Spindle Kontrolü");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Spindle Gücü");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Spindle Ters Yön");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Gücü Aç");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Gücü Kapat");
+ LSTR MSG_EXTRUDE = _UxGT("Ekstrüzyon");
+ LSTR MSG_RETRACT = _UxGT("Geri Çek");
+ LSTR MSG_MOVE_AXIS = _UxGT("Eksen Hareketleri");
+ LSTR MSG_BED_LEVELING = _UxGT("Tabla Hizalama");
+ LSTR MSG_LEVEL_BED = _UxGT("Tabla Hizası");
+ LSTR MSG_BED_TRAMMING = _UxGT("Hizalama Köşeleri");
+ LSTR MSG_NEXT_CORNER = _UxGT("Sonraki Köşe");
+ LSTR MSG_MESH_EDITOR = _UxGT("Mesh Editörü");
+ LSTR MSG_EDIT_MESH = _UxGT("Mesh Düzenle");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Mesh Düzenleme Durdu");
+ LSTR MSG_PROBING_POINT = _UxGT("Prop Noktası");
+ LSTR MSG_MESH_X = _UxGT("İndeks X");
+ LSTR MSG_MESH_Y = _UxGT("İndeks Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Z Değeri");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Özel Komutlar");
+ LSTR MSG_M48_TEST = _UxGT("M48 Prob Testi");
+ LSTR MSG_M48_POINT = _UxGT("M48 Nokta");
+ LSTR MSG_M48_DEVIATION = _UxGT("Sapma");
+ LSTR MSG_IDEX_MENU = _UxGT("IDEX Modu");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Takım Ofsetleri");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Oto-Park");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Kopyala");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Yansıtılmış kopya");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Tam Kontrol");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2. nozul Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2. nozul @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("G29 Çalışıyor");
+ LSTR MSG_UBL_TOOLS = _UxGT("UBL Araçları");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("UBL Yatak Hizalama");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Eğim Noktası");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Elle Mesh Oluştur");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Altlık & Ölçü Ver");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Ölçü");
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Yataktan Ölçü Kaldır");
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Sonrakine Git");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("UBL'yi Etkinleştir");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL'yi Etkisizleştir");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Yatak Sıcaklığı");
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Yatak Sıcaklığı");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Nozul Sıcaklığı");
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Nozul Sıcaklığı");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Mesh Düzenleme");
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Özel Mesh Düzenleme");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("İnce Ayar Mesh");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Mesh Düzenleme Tamam");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Özel Mesh Oluştur");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Mesh Oluştur");
+ #if HAS_PREHEAT
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Mesh Oluştur ($)");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Doğrulama Mesh ($)");
+ #endif
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Soğuk Mesh Oluştur");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Mesh Yükseklik Ayarı");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Yükseklik miktarı");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Doğrulama Mesh");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Özel Mesh Doğrulama");
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 Isıtma Tablası");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 Isıtma Memesi");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Manuel çalışma...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Birincil Sabit Uzunluk");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Çalışma Tamamlandı");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 İptal edildi");
+ LSTR MSG_G26_LEAVING = _UxGT("Çıkış G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Tabla Mesh Devam et");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Mesh Hizalama");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Nokta Hizalama");
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Kafes Mesh Hizalama");
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Mesh Seviyesi");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Yan Noktalar");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Haritalama Türü");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Mesh Çıkış Haritası");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host için Çıktı");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV için Çıktı");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Yazıcıda Yedek Kpalı");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("UBL Çıkış Bilgisi");
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Dolgu Miktarı");
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Manuel Dolgu");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Akıllı Dogu");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Mesh Dolgu");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Tümünü Geçersiz Kıl");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Yakını Geçersiz Kıl");
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Tümünü İnce Ayarla");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Yakını İnce Ayarla");
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Depolama");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Bellek Yuvası");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Yatak Mesh Yükle");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Yatak Mesh Kayıt Et");
+ LSTR MSG_MESH_LOADED = _UxGT("Mesh %i yüklendi");
+ LSTR MSG_MESH_SAVED = _UxGT("Mesh %i kayıtlandı");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Depolama Yok");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Hata: UBL Kayıt");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Hata: UBL Yenileme");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-Ofset: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Ofset Durduruldu");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Adım Adım UBL");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Soğuk Mesh Oluştur");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2.Akıllı Dogu");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Doğrulama Mesh");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Tümünü İnce Ayarla");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Doğrulama Mesh");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Tümünü İnce Ayarla");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7.Yatak Mesh Kayıt Et");
+
+ LSTR MSG_LED_CONTROL = _UxGT("LED Kontrolü");
+ LSTR MSG_LEDS = _UxGT("LEDler");
+ LSTR MSG_LED_PRESETS = _UxGT("LED Hazır Ayarları");
+ LSTR MSG_SET_LEDS_RED = _UxGT("Kırmızı");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Turuncu");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Sarı");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Yeşil");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Mavi");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Lacivert");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Menekşe");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Beyaz");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Varsayılan");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Özel Işıklar");
+ LSTR MSG_INTENSITY_R = _UxGT("Kırmızı Şiddeti");
+ LSTR MSG_INTENSITY_G = _UxGT("Yeşil Şiddeti");
+ LSTR MSG_INTENSITY_B = _UxGT("Mavi Şiddeti");
+ LSTR MSG_INTENSITY_W = _UxGT("Beyaz Şiddeti");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Parlaklık");
+
+ LSTR MSG_MOVING = _UxGT("Hareket Ediyor..");
+ LSTR MSG_FREE_XY = _UxGT("Durdur XY");
+ LSTR MSG_MOVE_X = _UxGT("X Hareketi");
+ LSTR MSG_MOVE_Y = _UxGT("Y Hareketi");
+ LSTR MSG_MOVE_Z = _UxGT("Z Hareketi");
+ LSTR MSG_MOVE_N = _UxGT("@ Hareketi");
+ LSTR MSG_MOVE_E = _UxGT("Ekstruder");
+ LSTR MSG_MOVE_EN = _UxGT("Ekstruder *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Nozul Çok Soğuk");
+ LSTR MSG_MOVE_N_MM = _UxGT("$mm");
+ LSTR MSG_MOVE_01MM = _UxGT("0.1mm");
+ LSTR MSG_MOVE_1MM = _UxGT("1mm");
+ LSTR MSG_MOVE_10MM = _UxGT("10mm");
+ LSTR MSG_MOVE_100MM = _UxGT("100mm");
+ LSTR MSG_SPEED = _UxGT("Hız");
+ LSTR MSG_BED_Z = _UxGT("Z Mesafesi");
+ LSTR MSG_NOZZLE = _UxGT("Nozul");
+ LSTR MSG_NOZZLE_N = _UxGT("Nozul ~");
+ LSTR MSG_BED = _UxGT("Tabla");
+ LSTR MSG_CHAMBER = _UxGT("Çevirme");
+ LSTR MSG_FAN_SPEED = _UxGT("Fan Hızı");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Fan Hızı ~");
+ LSTR MSG_STORED_FAN_N = _UxGT("Depolanan Fan ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Ekstra Fan Hızı");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Ekstra Fan Hızı ~");
+ LSTR MSG_FLOW = _UxGT("Akış");
+ LSTR MSG_FLOW_N = _UxGT("Akış ~");
+ LSTR MSG_CONTROL = _UxGT("Kontrol");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Çarpan");
+ LSTR MSG_AUTOTEMP = _UxGT("Oto. Sıcaklık");
+ LSTR MSG_LCD_ON = _UxGT("Açık");
+ LSTR MSG_LCD_OFF = _UxGT("Kapalı");
+ LSTR MSG_PID_AUTOTUNE = _UxGT("PID Kalibrasyon");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID Kalibrasyon *");
+ LSTR MSG_SELECT = _UxGT("Seç");
+ LSTR MSG_SELECT_E = _UxGT("Seç *");
+ LSTR MSG_ACC = _UxGT("İvme");
+
+ LSTR MSG_JERK = _UxGT("Sarsım");
+ LSTR MSG_VA_JERK = _UxGT("V") STR_A _UxGT("-Sarsım");
+ LSTR MSG_VB_JERK = _UxGT("V") STR_B _UxGT("-Sarsım");
+ LSTR MSG_VC_JERK = _UxGT("V") STR_C _UxGT("-Sarsım");
+ LSTR MSG_VN_JERK = _UxGT("V@-Sarsım");
+ LSTR MSG_VE_JERK = _UxGT("Ve-Sarsım");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Jonksiyon Sapması");
+ LSTR MSG_MAX_SPEED = _UxGT("Hız Vektörü");
+ LSTR MSG_VMAX_A = _UxGT("HızVektör.max ") STR_A;
+ LSTR MSG_VMAX_B = _UxGT("HızVektör.max ") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("HızVektör.max ") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("HızVektör.max @");
+ LSTR MSG_VMAX_E = _UxGT("HızVektör.max E");
+ LSTR MSG_VMAX_EN = _UxGT("HızVektör.max *");
+ LSTR MSG_VMIN = _UxGT("HızVektör.min");
+ LSTR MSG_VTRAV_MIN = _UxGT("HV.gezinme min");
+ LSTR MSG_ACCELERATION = _UxGT("Ivme");
+ LSTR MSG_AMAX_A = _UxGT("Max. ivme ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Max. ivme ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Max. ivme ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Max. ivme @");
+ LSTR MSG_AMAX_E = _UxGT("Max. ivme E");
+ LSTR MSG_AMAX_EN = _UxGT("Max. ivme *");
+ LSTR MSG_A_RETRACT = _UxGT("Ivme-geri çekme");
+ LSTR MSG_A_TRAVEL = _UxGT("Ivme-gezinme");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Adım/mm");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" adım/mm");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" adım/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" adım/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ adım/mm");
+ LSTR MSG_E_STEPS = _UxGT("E adım/mm");
+ LSTR MSG_EN_STEPS = _UxGT("* adım/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Sıcaklık");
+ LSTR MSG_MOTION = _UxGT("Hareket");
+ LSTR MSG_FILAMENT = _UxGT("Filaman");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("Ekstrüzyon/mm") SUPERSCRIPT_THREE;
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Filaman Çapı");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Filaman Çapı *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Çıkart mm");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Yükle mm");
+ LSTR MSG_ADVANCE_K = _UxGT("K İlerlet");
+ LSTR MSG_ADVANCE_K_E = _UxGT("K İlerlet *");
+ LSTR MSG_CONTRAST = _UxGT("LCD Kontrast");
+ LSTR MSG_STORE_EEPROM = _UxGT("Hafızaya Al");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Hafızadan Yükle");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Fabrika Ayarları");
+ LSTR MSG_INIT_EEPROM = _UxGT("EEPROM'u başlat");
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("Hata: EEPROM CRC");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Hata: EEPROM Indeks");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Hata: EEPROM Versiyonu");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("SD Güncellemesi");
+ LSTR MSG_RESET_PRINTER = _UxGT("Yazıcıyı Resetle");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Yenile");
+ LSTR MSG_INFO_SCREEN = _UxGT("Bilgi Ekranı");
+ LSTR MSG_PREPARE = _UxGT("Hazırlık");
+ LSTR MSG_TUNE = _UxGT("Ayar");
+ LSTR MSG_START_PRINT = _UxGT("Yaz. Başlat");
+ LSTR MSG_BUTTON_NEXT = _UxGT("İleri");
+ LSTR MSG_BUTTON_INIT = _UxGT("İçinde");
+ LSTR MSG_BUTTON_STOP = _UxGT("Durdur");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Yazdır");
+ LSTR MSG_BUTTON_RESET = _UxGT("Resetle");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("İptal");
+ LSTR MSG_BUTTON_DONE = _UxGT("Tamamlandı");
+ LSTR MSG_BUTTON_BACK = _UxGT("Geri");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Devam ediyor");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Duraklat");
+ LSTR MSG_RESUME_PRINT = _UxGT("Sürdür");
+ LSTR MSG_STOP_PRINT = _UxGT("Durdur");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Yazdırma Nesnesi");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Nesneyi İptal Et");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Nesneyi İptal Et =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Kesinti Kurtarma");
+ LSTR MSG_MEDIA_MENU = _UxGT("SD Karttan Yazdır");
+ LSTR MSG_NO_MEDIA = _UxGT("SD Kart Yok!");
+ LSTR MSG_DWELL = _UxGT("Uyku...");
+ LSTR MSG_USERWAIT = _UxGT("Operatör bekleniyor.");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Baskı Duraklatıldı");
+ LSTR MSG_PRINTING = _UxGT("Baskı Yapılıyor...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Baskı Durduruldu!");
+ LSTR MSG_NO_MOVE = _UxGT("İşlem yok.");
+ LSTR MSG_KILLED = _UxGT("Kilitlendi. ");
+ LSTR MSG_STOPPED = _UxGT("Durdu. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Geri Çek mm");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm");
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Geri Çekme V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Atlama mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V");
+ LSTR MSG_AUTORETRACT = _UxGT("Oto. Geri Çekme");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("G.Çekme Boyu");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Tasfiye uzunluğu");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Takım Değişimi");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Yükselt");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Birincil Hız");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Geri Çekme Hızı");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Nozul Beklemede");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Filaman Değiştir");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Filaman Değiştir *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Filaman Yükle");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Filaman Yükle *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Filaman Çıkart");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Filaman Çıkart *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Tümünü Çıkart");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("SD Kart Başlatılıyor");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("SD Kart Değiştir");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("SD Kart Çıkart");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z Prob Açık. Tabla");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Çarpıklık Faktörü");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch K. Test");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Reset");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Kapat");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Aç");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("SW-Modu");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("5V-Modu");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("OD-Modu");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Mode-Store");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("BLTouch 5V Ayarla");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("BLTouch OD Ayarla");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Drenaj Raporu");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("TEHLIKE: Kötü ayarlar hasara neden olabilir! Yine de devam edilsin mi?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Init TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Z Ofset Testi");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Kaydet");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI Aç");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Z-Probe Aç");
+ LSTR MSG_MANUAL_STOW = _UxGT("Z-Probe Kapat");
+ LSTR MSG_HOME_FIRST = _UxGT("Önce %s%s%s Sıfırla");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Prob Ofsetleri");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("X Prob Ofset");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Y Prob Ofset");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Z Prob Ofset");
+ LSTR MSG_BABYSTEP_X = _UxGT("Miniadım X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Miniadım Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Miniadım Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Miniadım @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Toplam");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Endstop iptal");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Isınma başarısız");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Hata: Sıcaklık Aşımı");
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("TERMAL PROBLEM");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("TABLA TERMAL PROBLEM");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ODA TERMAL PROBLEM");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Hata: MAX.SICAKLIK");
+ LSTR MSG_ERR_MINTEMP = _UxGT("Hata: MIN.SICAKLIK");
+ LSTR MSG_HALTED = _UxGT("YAZICI DURDURULDU");
+ LSTR MSG_PLEASE_RESET = _UxGT("Lütfen Resetleyin");
+ LSTR MSG_SHORT_DAY = _UxGT("G"); // One character only
+ LSTR MSG_SHORT_HOUR = _UxGT("S"); // One character only
+ LSTR MSG_SHORT_MINUTE = _UxGT("D"); // One character only
+ LSTR MSG_HEATING = _UxGT("Isınıyor...");
+ LSTR MSG_COOLING = _UxGT("Soğuyor...");
+ LSTR MSG_BED_HEATING = _UxGT("Tabla Isınıyor...");
+ LSTR MSG_BED_COOLING = _UxGT("Tabla Soğuyor...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Oda Isınıyor...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Oda Soğuyor...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrasyonu");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Ayarla X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Ayarla Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Ayarla Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Ayarla Merkez");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Delta Ayarları");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Oto Kalibrasyon");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Çapral Mil");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Yükseklik");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Yarıçap");
+ LSTR MSG_INFO_MENU = _UxGT("Yazıcı Hakkında");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Yazıcı Bilgisi");
+ LSTR MSG_3POINT_LEVELING = _UxGT("3-Nokta Hizalama");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Doğrusal Hizalama");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("İki Yönlü Doğ. Hiza.");
+ LSTR MSG_UBL_LEVELING = _UxGT("Birleşik Tabla Hiza.");
+ LSTR MSG_MESH_LEVELING = _UxGT("Mesh Hizalama");
+ LSTR MSG_INFO_STATS_MENU = _UxGT("İstatistikler");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Kontrolcü Bilgisi");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Termistörler");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Ekstruderler");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("İletişim Hızı");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Protokol");
+ LSTR MSG_CASE_LIGHT = _UxGT("Aydınlatmayı Aç");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Aydınlatma Parlaklğı");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("Yanlış Yazıcı");
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Baskı Sayısı");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Tamamlanan");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Toplam Baskı Süresi");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("En Uzun Baskı Süresi");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Toplam Filaman");
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Baskı");
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Tamamlanan");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Süre");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("En Uzun");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Filaman");
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Min Sıc.");
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Max Sıc.");
+ LSTR MSG_INFO_PSU = _UxGT("Güç Kaynağı");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Sürücü Gücü");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ Sürücü %");
+ LSTR MSG_ERROR_TMC = _UxGT("TMC BAĞLANTI HATASI");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Yaz");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMAN DEGISTIR");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("BASKI DURAKLATILDI");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("FILAMAN YüKLE");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("FILAMAN ÇIKART");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Seçenekler:");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Daha Fazla Tasviye");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Baskıyı sürdür");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozul: ");
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Runout Sensörü");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Aşınma Farkı mm");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Sıfırlama Başarısız");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Probing Başarısız");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("FILAMAN SEÇ");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU Yaz. Güncelle!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Dikkat Gerektirir.");
+ LSTR MSG_MMU2_RESUME = _UxGT("Yaz. Devam Et");
+ LSTR MSG_MMU2_RESUMING = _UxGT("Sürdürülüyor...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("Filaman Yükle");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("Tümünü Yükle");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Nozula Yükle");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("Filaman Çıkart");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Filaman Çıkart ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Filamenti Boşalt");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Fil. Yükleniyor %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Fil Çıkartılıyor. ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Fil. Boşaltılıyor....");
+ LSTR MSG_MMU2_ALL = _UxGT("Tümü");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filaman ~");
+ LSTR MSG_MMU2_RESET = _UxGT("MMU Resetle");
+ LSTR MSG_MMU2_RESETTING = _UxGT("MMU Resetleniyot...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Kaldır, tıkla");
+
+ LSTR MSG_MIX = _UxGT("Karışım");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Bileşen =");
+ LSTR MSG_MIXER = _UxGT("Karıştırıcı");
+ LSTR MSG_GRADIENT = _UxGT("Gradyan");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Tam Gradyan");
+ LSTR MSG_TOGGLE_MIX = _UxGT("Karışım Geçişi");
+ LSTR MSG_CYCLE_MIX = _UxGT("Döngü Karışımı");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Gradyan Karışımı");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Ters Gradyan");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Aktif V-tool");
+ LSTR MSG_START_VTOOL = _UxGT("Başlat V-tool");
+ LSTR MSG_END_VTOOL = _UxGT(" Bitir V-tool");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Reset V-tools");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("V-tool Karışıö Yap");
+ LSTR MSG_VTOOLS_RESET = _UxGT("V-tools Resetlendi");
+ LSTR MSG_START_Z = _UxGT("Başlat Z:");
+ LSTR MSG_END_Z = _UxGT(" Bitir Z:");
+
+ LSTR MSG_GAMES = _UxGT("Oyunlar");
+ LSTR MSG_BRICKOUT = _UxGT("Brickout");
+ LSTR MSG_INVADERS = _UxGT("Invaders");
+ LSTR MSG_SNAKE = _UxGT("Sn4k3");
+ LSTR MSG_MAZE = _UxGT("Maze");
+
+ //
+ // Filament Değişim ekranları 4 satırlı ekranda 3 satıra kadar gösterilir
+ // ...veya 3 satırlı ekranda 2 satıra kadar
+ //
+ #if LCD_HEIGHT >= 4
+
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Baskıya devam etmek", "için Butona bas"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Park Ediliyor..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Filaman değişimi", "için başlama", "bekleniyor"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Filamanı yükle", "ve devam için", "tuşa bas..."));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nozulü Isıtmak için", "Butona Bas."));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozul Isınıyor", "Lütfen Bekleyin..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Filamanın çıkması", "bekleniyor"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Filamanın yüklenmesi", "bekleniyor.."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Filaman Temizlemesi", "için bekle"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Filaman Temizlemesi", "bitirmek için tıkla"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Baskının devam ", "etmesi için bekle"));
+ #else
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Sürdürmek İçin Tıkla"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Park Ediliyor..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Lütfen bekleyiniz..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Yükle ve bas"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Isıtmak için Tıkla"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Isınıyor..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Çıkartılıyor..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Yüklüyor..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Temizleniyor..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Bitirmek için Tıkla"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Sürdürülüyor..."));
+ #endif
+ LSTR MSG_TMC_DRIVERS = _UxGT("TMC Sürücüleri");
+ LSTR MSG_TMC_CURRENT = _UxGT("Sürücü Akımı");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hibrit Eşiği");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensörsüz Sıfırlama");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Adım Modu");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Aktif");
+ LSTR MSG_SERVICE_RESET = _UxGT("Resetle");
+ LSTR MSG_SERVICE_IN = _UxGT(" içinde:");
+ LSTR MSG_BACKLASH = _UxGT("Ters Tepki");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Düzeltme");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Yumuşatma");
+}
+
+#if FAN_COUNT == 1
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED
+#else
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N
+#endif
diff --git a/src/lcd/language/language_uk.h b/src/lcd/language/language_uk.h
new file mode 100644
index 0000000..6170fae
--- /dev/null
+++ b/src/lcd/language/language_uk.h
@@ -0,0 +1,925 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Ukrainian
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+
+#define DISPLAY_CHARSET_ISO10646_5
+
+namespace Language_uk {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Ukrainian");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Готовий.");
+ LSTR MSG_YES = _UxGT("ТАК");
+ LSTR MSG_NO = _UxGT("НІ");
+ LSTR MSG_BACK = _UxGT("Назад");
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Переривання...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("SD-картка вставлена");
+ LSTR MSG_MEDIA_REMOVED = _UxGT("SD-картка видалена");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Вставте SD-картку");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Збій ініціалізації SD");
+ #else
+ LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Збій ініціаліз. SD");
+ #endif
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Помилка зчитування");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB диск видалений");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("Помилка USB диску");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переповнення виклику");
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Програмні кінцевики");
+ #else
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переповн. виклику");
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Прогр.кінцевики");
+ #endif
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Кінцевик"); // Max length 8 characters
+ LSTR MSG_MAIN = _UxGT("Основне меню");
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Інші налаштування");
+ LSTR MSG_CONFIGURATION = _UxGT("Конфігурація");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Автостарт");
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Вимкнути двигуни");
+ LSTR MSG_DEBUG_MENU = _UxGT("Меню Debug");
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Тест лінії прогр.");
+ LSTR MSG_AUTO_HOME = _UxGT("Авто паркування");
+ LSTR MSG_AUTO_HOME_A = _UxGT("Паркування @");
+ LSTR MSG_AUTO_HOME_X = _UxGT("Паркування X");
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Паркування Y");
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Паркування Z");
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Авто Z-вирівнювання");
+ LSTR MSG_ITERATION = _UxGT("G34 Ітерація: %i");
+ LSTR MSG_DECREASING_ACCURACY = _UxGT("Зменьшення точності!");
+ LSTR MSG_ACCURACY_ACHIEVED = _UxGT("Точність досягнута");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Паркування XYZ");
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Почати");
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Наступна точка");
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("Завершено!");
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Висота спаду");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Встанов. зміщення дому");
+ LSTR MSG_HOME_OFFSET_X = _UxGT("Зміщення дому X");
+ LSTR MSG_HOME_OFFSET_Y = _UxGT("Зміщення дому Y");
+ LSTR MSG_HOME_OFFSET_Z = _UxGT("Зміщення дому Z");
+ #else
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Встан. зміщ. дому");
+ LSTR MSG_HOME_OFFSET_X = _UxGT("Зміщ. дому X");
+ LSTR MSG_HOME_OFFSET_Y = _UxGT("Зміщ. дому Y");
+ LSTR MSG_HOME_OFFSET_Z = _UxGT("Зміщ. дому Z");
+ #endif
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Зміщення прийняті");
+ LSTR MSG_SELECT_ORIGIN = _UxGT("Оберіть нуль");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_LAST_VALUE_SP = _UxGT("Останнє значення ");
+ #else
+ LSTR MSG_LAST_VALUE_SP = _UxGT("Останнє знач. ");
+ #endif
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Нагрів ") PREHEAT_1_LABEL;
+ LSTR MSG_PREHEAT_1_H = _UxGT("Нагрів ") PREHEAT_1_LABEL " ~";
+ LSTR MSG_PREHEAT_1_END = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" сопло");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" сопло ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" все");
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" стіл");
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Нагрів ") PREHEAT_1_LABEL _UxGT(" налашт");
+
+ LSTR MSG_PREHEAT_M = _UxGT("Нагрів $");
+ LSTR MSG_PREHEAT_M_H = _UxGT("Нагрів $ ~");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Нагрів $ сопло");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Нагрів $ сопло ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Нагрів $ все");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Нагрів $ стіл");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Нагрів $ налашт");
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Нагрів свого");
+ LSTR MSG_COOLDOWN = _UxGT("Вимкнути нагрів");
+
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("Частота");
+ LSTR MSG_LASER_MENU = _UxGT("Керування лазером");
+ LSTR MSG_SPINDLE_MENU = _UxGT("Керування шпінделем");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_LASER_POWER = _UxGT("Потужність лазера");
+ LSTR MSG_SPINDLE_TOGGLE = _UxGT("Перемкн. шпіндель");
+ LSTR MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Перемкнути вакуум");
+ LSTR MSG_LASER_TOGGLE = _UxGT("Перемкнути лазер");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Потужн. шпінделя");
+ LSTR MSG_LASER_PULSE_MS = _UxGT("Тестовий імпульс мс");
+ LSTR MSG_LASER_EVAC_TOGGLE = _UxGT("Перемкнути обдув");
+ #else
+ LSTR MSG_LASER_POWER = _UxGT("Потужн. лазера");
+ LSTR MSG_SPINDLE_TOGGLE = _UxGT("Перемк. шпінд.");
+ LSTR MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Перемк. вакуум");
+ LSTR MSG_LASER_TOGGLE = _UxGT("Перемкн. лазер");
+ LSTR MSG_SPINDLE_POWER = _UxGT("Потужн. шпінд.");
+ LSTR MSG_LASER_PULSE_MS = _UxGT("Тест. імп., мс");
+ LSTR MSG_LASER_EVAC_TOGGLE = _UxGT("Перемкн. обдув");
+ #endif
+ LSTR MSG_LASER_ASSIST_TOGGLE = _UxGT("Керування обдувом");
+ LSTR MSG_FLOWMETER_FAULT = _UxGT("Помилка обдуву");
+ LSTR MSG_LASER_FIRE_PULSE = _UxGT("Імпульс лазеру");
+ LSTR MSG_SPINDLE_FORWARD = _UxGT("Шпіндель вперед");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("Шпіндель назад");
+
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Увімкнути живлення");
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Вимкнути живлення");
+ LSTR MSG_EXTRUDE = _UxGT("Екструзія");
+ LSTR MSG_RETRACT = _UxGT("Втягування");
+ LSTR MSG_MOVE_AXIS = _UxGT("Рух по осям");
+ LSTR MSG_BED_LEVELING = _UxGT("Вирівнювання столу");
+ LSTR MSG_LEVEL_BED = _UxGT("Вирівняти стіл");
+ LSTR MSG_BED_TRAMMING = _UxGT("Вирівняти кути");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Вгору до спрацюв. зонду");
+ LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Кути в межах. Вирів.столу");
+ #else
+ LSTR MSG_BED_TRAMMING_RAISE = _UxGT("Вгору до спрац.зонду");
+ LSTR MSG_BED_TRAMMING_IN_RANGE = _UxGT("Кути в межах. Вирівн");
+ #endif
+ LSTR MSG_BED_TRAMMING_GOOD_POINTS = _UxGT("Хороші точки: ");
+ LSTR MSG_BED_TRAMMING_LAST_Z = _UxGT("Остання Z: ");
+ LSTR MSG_NEXT_CORNER = _UxGT("Наступний кут");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_MESH_EDITOR = _UxGT("Зміщення по Z");
+ #else
+ LSTR MSG_MESH_EDITOR = _UxGT("Зміщення Z");
+ #endif
+ LSTR MSG_EDIT_MESH = _UxGT("Редагувати сітку");
+ LSTR MSG_EDITING_STOPPED = _UxGT("Редагув. зупинено");
+ LSTR MSG_PROBING_POINT = _UxGT("Точка сітки");
+ LSTR MSG_MESH_X = _UxGT("Індекс X");
+ LSTR MSG_MESH_Y = _UxGT("Індекс Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Значення Z");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Власні команди");
+
+ LSTR MSG_M48_TEST = _UxGT("M48 тест зонду");
+ LSTR MSG_M48_POINT = _UxGT("M48 точка");
+ LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Зонд за межами");
+ LSTR MSG_M48_DEVIATION = _UxGT("Відхилення");
+
+ LSTR MSG_IDEX_MENU = _UxGT("Режим IDEX");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Зміщення сопел");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Авто паркування");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Дуплікація");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Дзеркальна копія");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Повний контроль");
+ LSTR MSG_IDEX_DUPE_GAP = _UxGT("Дублюв. X-проміжок");
+
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("Друге сопло Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("Друге сопло @");
+
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Виконується G29");
+ LSTR MSG_UBL_TOOLS = _UxGT("Інструменти UBL");
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("Налаштування UBL");
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("Точка нахилу");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Ручне введення сітки");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Розмістити шайбу і вимір.");
+ #else
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Ручне введ. сітки");
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Розм. шайбу і вимір.");
+ #endif
+ LSTR MSG_UBL_MESH_WIZARD = _UxGT("Майстер сіток UBL");
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Вимірювання");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Видалити і виміряти стіл");
+ #else
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Видали і вимір. стіл");
+ #endif
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Рух до наступної");
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Активувати UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Деактивувати UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = LCD_STR_THERMOMETER _UxGT(" столу, ") LCD_STR_DEGREE "C";
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Своя ") LCD_STR_THERMOMETER _UxGT(" столу,") LCD_STR_DEGREE "C";
+ LSTR MSG_UBL_SET_TEMP_HOTEND = LCD_STR_THERMOMETER _UxGT(" сопла, ") LCD_STR_DEGREE "C";
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Своя ") LCD_STR_THERMOMETER _UxGT(" сопла,") LCD_STR_DEGREE "C";
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Редагувати свою сітку");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Точне редагування сітки");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Будувати свою сітку");
+ #else
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Редагувати свою");
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Точне редаг. сітки");
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Будувати свою");
+ #endif
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Редагування сітки");
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Сітка побудована");
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Будувати сітку");
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Будувати сітку ($)");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Підтвердити ($)");
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Буд. холодну сітку");
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Встан.висоту сітки");
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Висота");
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Підтвердити сітку");
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Підтвердити свою");
+
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 нагрів столу");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 нагрів сопла");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("Ручне грунтування");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("Фікс. довж. грунт.");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("Грунтув. виконане");
+ LSTR MSG_G26_CANCELED = _UxGT("G26 скасовано");
+ LSTR MSG_G26_LEAVING = _UxGT("Вийти з G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Продовжити сітку");
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Вирівнювання сітки");
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-точкове вирівн.");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Вирівнювання растру");
+ #else
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Вирівнюв. растру");
+ #endif
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Вирівняти сітку");
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Крайні точки");
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Тип мапи сітки");
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Вивести мапу сітки");
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Вивести на хост");
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Вивести в CSV");
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Зберегти зовні");
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Інформація по UBL");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Обсяг заповнюв.");
+ #else
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Обсяг заповн.");
+ #endif
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Ручне заповнення");
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Розумне заповнення");
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Заповнити сітку");
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Анулювати все");
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Анулювати найближчу");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно налаштувати все");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Точно налашт.найближчу");
+ #else
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Точно налашт. все");
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Точно найближчу");
+ #endif
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Збереження сітки");
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Слот пам'яті");
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Завантажити сітку");
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Зберегти сітку");
+ LSTR MSG_MESH_LOADED = _UxGT("Сітка %i завантажена");
+ LSTR MSG_MESH_SAVED = _UxGT("Сітка %i збережена");
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("Немає носія");
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Збій: збереж. UBL");
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Збій: відновл. UBL");
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Зміщення Z: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Зміщення Z зупинено");
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL покроково");
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Збудувати холодну");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2.Розумне заповн-я");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Затвердити сітку");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Точно налашт.все");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Затвердити сітку");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Точно налашт.все");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7.Зберегти сітку");
+
+ LSTR MSG_LED_CONTROL = _UxGT("Керування світлом");
+ LSTR MSG_LEDS = _UxGT("Підсвітка");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_LED_PRESETS = _UxGT("Передустановки світла");
+ #else
+ LSTR MSG_LED_PRESETS = _UxGT("Передустан. світла");
+ #endif
+ LSTR MSG_SET_LEDS_RED = _UxGT("Червоний");
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Помаранчевий");
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Жовтий");
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Зелений");
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Синій");
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Індіго");
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Фіолетовий");
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Білий");
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("За умовчанням");
+ LSTR MSG_LED_CHANNEL_N = _UxGT("Канал =");
+ LSTR MSG_LEDS2 = _UxGT("Світло #2");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_NEO2_PRESETS = _UxGT("Передустановка світла #2");
+ #else
+ LSTR MSG_NEO2_PRESETS = _UxGT("Передуст. світла #2");
+ #endif
+ LSTR MSG_NEO2_BRIGHTNESS = _UxGT("Яскравість");
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Своє світло");
+ LSTR MSG_INTENSITY_R = _UxGT("Рівень червоного");
+ LSTR MSG_INTENSITY_G = _UxGT("Рівень зеленого");
+ LSTR MSG_INTENSITY_B = _UxGT("Рівень синього");
+ LSTR MSG_INTENSITY_W = _UxGT("Рівень білого");
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("Яскравість");
+
+ LSTR MSG_MOVING = _UxGT("Рух...");
+ LSTR MSG_FREE_XY = _UxGT("Звільнити XY");
+ LSTR MSG_MOVE_X = _UxGT("Рух по X");
+ LSTR MSG_MOVE_Y = _UxGT("Рух по Y");
+ LSTR MSG_MOVE_Z = _UxGT("Рух по Z");
+ LSTR MSG_MOVE_N = _UxGT("Рух по @");
+ LSTR MSG_MOVE_E = _UxGT("Екструдер");
+ LSTR MSG_MOVE_EN = _UxGT("Екструдер *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Сопло дуже холодне");
+ LSTR MSG_MOVE_N_MM = _UxGT("Рух %sмм");
+ LSTR MSG_MOVE_01MM = _UxGT("Рух 0.1мм");
+ LSTR MSG_MOVE_1MM = _UxGT("Рух 1мм");
+ LSTR MSG_MOVE_10MM = _UxGT("Рух 10мм");
+ LSTR MSG_MOVE_100MM = _UxGT("Рух 100mm");
+ LSTR MSG_SPEED = _UxGT("Швидкість");
+ LSTR MSG_BED_Z = _UxGT("Z Столу");
+ LSTR MSG_NOZZLE = _UxGT("Сопло, ") LCD_STR_DEGREE "C";
+ LSTR MSG_NOZZLE_N = _UxGT("Сопло ~");
+ LSTR MSG_NOZZLE_PARKED = _UxGT("Сопло запарковане");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("Сопло очікує");
+ LSTR MSG_BED = _UxGT("Стіл, ") LCD_STR_DEGREE "C";
+ LSTR MSG_CHAMBER = _UxGT("Камера,") LCD_STR_DEGREE "C";
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_COOLER = _UxGT("Охолодження лазеру");
+ LSTR MSG_COOLER_TOGGLE = _UxGT("Перемк. охолодж.");
+ #else
+ LSTR MSG_COOLER = _UxGT("Охолодж. лазеру");
+ LSTR MSG_COOLER_TOGGLE = _UxGT("Перемк.охолод");
+ #endif
+ LSTR MSG_FLOWMETER_SAFETY = _UxGT("Безпека потоку");
+ LSTR MSG_LASER = _UxGT("Лазер");
+ LSTR MSG_FAN_SPEED = _UxGT("Швидк. вент.");
+ LSTR MSG_FAN_SPEED_N = _UxGT("Швидк. вент. ~");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_STORED_FAN_N = _UxGT("Збереж.швидк.вент. ~");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Дод. швидк. вент. ~");
+ #else
+ LSTR MSG_STORED_FAN_N = _UxGT("Збереж. вент. ~");
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Додат.вент. ~");
+ #endif
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Дод. швидк. вент.");
+ LSTR MSG_CONTROLLER_FAN = _UxGT("Вент. контролера");
+ LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Холості оберти");
+ LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Авто-режим");
+ LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("Робочі оберти");
+ LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("Період простою");
+ LSTR MSG_FLOW = _UxGT("Потік");
+ LSTR MSG_FLOW_N = _UxGT("Потік ~");
+ LSTR MSG_CONTROL = _UxGT("Налаштування");
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С мін");
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER ", " LCD_STR_DEGREE _UxGT("С макс");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Фактор");
+ LSTR MSG_AUTOTEMP = _UxGT("Автотемпер.");
+ LSTR MSG_LCD_ON = _UxGT("Увім");
+ LSTR MSG_LCD_OFF = _UxGT("Вимк");
+
+ LSTR MSG_PID_AUTOTUNE = _UxGT("Автопідбір PID");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("Автопідбір PID *");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("Підбір PID виконано");
+ LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Збій автопідбору! Поганий екструдер.");
+ LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("Збій автопідбору! Температура завищена.");
+ LSTR MSG_PID_TIMEOUT = _UxGT("Збій автопідбору! Вичерпан час.");
+
+ LSTR MSG_SELECT = _UxGT("Вибрати");
+ LSTR MSG_SELECT_E = _UxGT("Вибрати *");
+ LSTR MSG_ACC = _UxGT("Прискорорення");
+ LSTR MSG_JERK = _UxGT("Ривок");
+ LSTR MSG_VA_JERK = _UxGT("V") STR_A _UxGT("-ривок");
+ LSTR MSG_VB_JERK = _UxGT("V") STR_B _UxGT("-ривок");
+ LSTR MSG_VC_JERK = _UxGT("V") STR_C _UxGT("-ривок");
+ LSTR MSG_VN_JERK = _UxGT("V@-ривок");
+ LSTR MSG_VE_JERK = _UxGT("Ve-ривок");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Відхилення вузла");
+ #else
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Відхил.вузла");
+ #endif
+ LSTR MSG_MAX_SPEED = _UxGT("Швидкість, мм/с");
+ LSTR MSG_VMAX_A = _UxGT("Швидк.макс ") STR_A;
+ LSTR MSG_VMAX_B = _UxGT("Швидк.макс ") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("Швидк.макс ") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("Швидк.макс @");
+ LSTR MSG_VMAX_E = _UxGT("Швидк.макс E");
+ LSTR MSG_VMAX_EN = _UxGT("Швидк.макс *");
+ LSTR MSG_VMIN = _UxGT("Швидк. мін");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_VTRAV_MIN = _UxGT("Переміщення мін");
+ #else
+ LSTR MSG_VTRAV_MIN = _UxGT("Переміщ. мін");
+ #endif
+ LSTR MSG_ACCELERATION = _UxGT("Прискорення, мм/с2");
+ LSTR MSG_AMAX_A = _UxGT("Приск.макс ") STR_A;
+ LSTR MSG_AMAX_B = _UxGT("Приск.макс ") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Приск.макс ") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Приск.макс @");
+ LSTR MSG_AMAX_E = _UxGT("Приск.макс E");
+ LSTR MSG_AMAX_EN = _UxGT("Приск.макс *");
+ LSTR MSG_A_RETRACT = _UxGT("Приск.втягув.");
+ LSTR MSG_A_TRAVEL = _UxGT("Приск.переміщ.");
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("Частота макс.");
+ LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Подача мін.");
+ LSTR MSG_STEPS_PER_MM = _UxGT("Кроків на мм");
+ LSTR MSG_A_STEPS = STR_A _UxGT(" кроків/мм");
+ LSTR MSG_B_STEPS = STR_B _UxGT(" кроків/мм");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" кроків/мм");
+ LSTR MSG_N_STEPS = _UxGT("@ кроків/мм");
+ LSTR MSG_E_STEPS = _UxGT("E кроків/мм");
+ LSTR MSG_EN_STEPS = _UxGT("* кроків/мм");
+ LSTR MSG_TEMPERATURE = _UxGT("Температура");
+ LSTR MSG_MOTION = _UxGT("Рух");
+ LSTR MSG_FILAMENT = _UxGT("Пруток");
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E, мм") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("E обмеж.,мм") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("E обмеж. *");
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Діам. прутка");
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Діам. прутка *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Вивантаж., мм");
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Завантаж., мм");
+ LSTR MSG_ADVANCE_K = _UxGT("Kоеф. просув.");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Kоеф. просув. *");
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_CONTRAST = _UxGT("Контраст екрану");
+ LSTR MSG_BRIGHTNESS = _UxGT("Яскравість LCD");
+ #else
+ LSTR MSG_CONTRAST = _UxGT("Контраст");
+ LSTR MSG_BRIGHTNESS = _UxGT("Яскравість");
+ #endif
+ LSTR MSG_LCD_TIMEOUT_SEC = _UxGT("LCD Таймаут, с");
+ LSTR MSG_BRIGHTNESS_OFF = _UxGT("Підсвітка вимк.");
+ LSTR MSG_STORE_EEPROM = _UxGT("Зберегти в EEPROM");
+ LSTR MSG_LOAD_EEPROM = _UxGT("Зчитати з EEPROM");
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("На базові параметри");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_INIT_EEPROM = _UxGT("Ініціалізація EEPROM");
+ #else
+ LSTR MSG_INIT_EEPROM = _UxGT("Ініціаліз. EEPROM");
+ #endif
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("Збій EEPROM: CRC");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Збій EEPROM: індекс");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Збій EEPROM: версія");
+ LSTR MSG_SETTINGS_STORED = _UxGT("Параметри збережені");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Оновити SD-картку");
+ LSTR MSG_RESET_PRINTER = _UxGT("Зкинути принтер");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT(" Поновити");
+ LSTR MSG_INFO_SCREEN = _UxGT("Головний екран");
+ LSTR MSG_PREPARE = _UxGT("Підготувати");
+ LSTR MSG_TUNE = _UxGT("Підлаштування");
+ LSTR MSG_POWER_MONITOR = _UxGT("Монітор живлення");
+ LSTR MSG_CURRENT = _UxGT("Струм");
+ LSTR MSG_VOLTAGE = _UxGT("Напруга");
+ LSTR MSG_POWER = _UxGT("Потужність");
+ LSTR MSG_START_PRINT = _UxGT("Почати друк");
+
+ LSTR MSG_BUTTON_NEXT = _UxGT("Далі"); //short text for buttons
+ LSTR MSG_BUTTON_INIT = _UxGT("Ініц-я");
+ LSTR MSG_BUTTON_STOP = _UxGT("Зупинка");
+ LSTR MSG_BUTTON_PRINT = _UxGT("Друк");
+ LSTR MSG_BUTTON_RESET = _UxGT("Зкинути");
+ LSTR MSG_BUTTON_IGNORE = _UxGT("Ігнорув.");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("Відміна");
+ LSTR MSG_BUTTON_CONFIRM = _UxGT("Підтвер.");
+ LSTR MSG_BUTTON_CONTINUE = _UxGT("Продовж.");
+ LSTR MSG_BUTTON_DONE = _UxGT("Готово");
+ LSTR MSG_BUTTON_BACK = _UxGT("Назад");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("Продовж.");
+ LSTR MSG_BUTTON_SKIP = _UxGT("Пропуск");
+ LSTR MSG_BUTTON_INFO = _UxGT("Інфо");
+ LSTR MSG_BUTTON_LEVEL = _UxGT("Рівень");
+ LSTR MSG_BUTTON_PAUSE = _UxGT("Пауза");
+ LSTR MSG_BUTTON_RESUME = _UxGT("Звіт");
+ LSTR MSG_BUTTON_SAVE = _UxGT("Зберегти");
+
+ LSTR MSG_PAUSING = _UxGT("Призупинення...");
+ LSTR MSG_PAUSE_PRINT = _UxGT("Призупинити друк");
+ LSTR MSG_RESUME_PRINT = _UxGT("Відновити друк");
+ LSTR MSG_HOST_START_PRINT = _UxGT("Старт з хосту");
+ LSTR MSG_STOP_PRINT = _UxGT("Скасувати друк");
+ LSTR MSG_END_LOOPS = _UxGT("End Repeat Loops"); // needs translation
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Друк об'єкта");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Завершити об'єкт");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Завершити об'єкт =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Віднов. після збою");
+ LSTR MSG_MEDIA_MENU = _UxGT("Друкувати з SD");
+ LSTR MSG_NO_MEDIA = _UxGT("SD-картки немає");
+ LSTR MSG_DWELL = _UxGT("Сон...");
+ LSTR MSG_USERWAIT = _UxGT("Продовжити...");
+ LSTR MSG_PRINT_PAUSED = _UxGT("Друк призупинено");
+ LSTR MSG_PRINTING = _UxGT("Друк...");
+ LSTR MSG_STOPPING = _UxGT("Зупинка...");
+ LSTR MSG_REMAINING_TIME = _UxGT("Залишилось");
+ LSTR MSG_PRINT_ABORTED = _UxGT("Друк скасовано");
+ LSTR MSG_PRINT_DONE = _UxGT("Друк завершено");
+ LSTR MSG_NO_MOVE = _UxGT("Немає руху.");
+ LSTR MSG_KILLED = _UxGT("ПЕРЕРВАНО. ");
+ LSTR MSG_STOPPED = _UxGT("ЗУПИНЕНО. ");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Втягування, мм");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Зміна втягув.,мм");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Повернення, мм");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Поверн.зміни, мм");
+ LSTR MSG_AUTORETRACT = _UxGT("Автовтягування");
+ #else
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Втягув., мм");
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Зміна втяг.мм");
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Поверн., мм");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Повер.зміни,мм");
+ LSTR MSG_AUTORETRACT = _UxGT("Автовтягув.");
+ #endif
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Втягування V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Підскок, мм");
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Повернення V");
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Поверн.зміни V");
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Змінити довжини");
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("Змінити додатково");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("Очистити довжину");
+ LSTR MSG_TOOL_CHANGE = _UxGT("Зміна сопла");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Підняти по Z");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Початк.швидкість");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Швидкість втягув.");
+ #else
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Початк.швидк.");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Швидк.втягув.");
+ #endif
+ LSTR MSG_FILAMENT_PARK_ENABLED = _UxGT("Паркувати голову");
+ LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Відновити швидкість");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Оберти вентилятора");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Час вентилятора");
+ #else
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Оберти вент.");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Час вент.");
+ #endif
+ LSTR MSG_TOOL_MIGRATION_ON = _UxGT("Авто Увімк.");
+ LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("Авто Вимкн.");
+ LSTR MSG_TOOL_MIGRATION = _UxGT("Заміна інструменту");
+ LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("Авто заміна");
+ LSTR MSG_TOOL_MIGRATION_END = _UxGT("Останній екструдер");
+ LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("Заміна на *");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Заміна прутка");
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Заміна прутка *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("Подати пруток");
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Подати пруток *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Видалити пруток");
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Видалити пруток *");
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Видалити все");
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Вставити SD-картку");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Заміна SD-картки");
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Видаліть SD-картку");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z-Зонд поза столом");
+ LSTR MSG_SKEW_FACTOR = _UxGT("Фактор нахилу");
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch");
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Само-тест");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Зкинути зонд");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Підняти зонд");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Опустити зонд");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("Режим SW");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("Режим 5V");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("Режим OD");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("Режим збереження");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Встановити BLT на 5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Встановити BLT на OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("Звітувати злив");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("НЕБЕЗПЕКА: Неправильні параметри приводять до пошкоджень! Продовжити?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("Z-Зонд TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("Ініц. TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Тест Z-зміщення");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("Зберегти");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Установити TouchMI");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Установити Z-зонд");
+ LSTR MSG_MANUAL_STOW = _UxGT("Завантажити Z-зонд");
+ LSTR MSG_HOME_FIRST = _UxGT("Спочатку дім %s%s%s");
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("Зміщення зонду");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("Зміщення по X");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("Зміщення по Y");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Зміщення по Z");
+ LSTR MSG_MOVE_NOZZLE_TO_BED = _UxGT("Рухати сопло до столу");
+ LSTR MSG_BABYSTEP_X = _UxGT("Мікрокрок X");
+ LSTR MSG_BABYSTEP_Y = _UxGT("Мікрокрок Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Мікрокрок Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Мікрокрок @");
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("Сумарно");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Кінцевик спрацював");
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Збій нагріву");
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("ЗАВИЩЕНА Т") LCD_STR_DEGREE;
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("ВИТІК ТЕПЛА");
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("ВИТІК ТЕПЛА СТОЛУ");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ВИТІК ТЕПЛА КАМЕРИ");
+ LSTR MSG_THERMAL_RUNAWAY_COOLER = _UxGT("ВИТІК ОХОЛОДЖЕННЯ");
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_COOLING_FAILED = _UxGT("ОХОЛОДЖЕННЯ НЕ ВДАЛОСЬ");
+ #else
+ LSTR MSG_COOLING_FAILED = _UxGT("ОХОЛОДЖ. НЕ ВДАЛОСЬ");
+ #endif
+ LSTR MSG_ERR_MAXTEMP = _UxGT("МАКСИМАЛЬНА Т") LCD_STR_DEGREE;
+ LSTR MSG_ERR_MINTEMP = _UxGT("МІНІМАЛЬНА Т") LCD_STR_DEGREE;
+ LSTR MSG_HALTED = _UxGT("ПРИНТЕР ЗУПИНЕНО");
+ LSTR MSG_PLEASE_RESET = _UxGT("Перезавантажте");
+ LSTR MSG_SHORT_DAY = _UxGT("д"); // One character only
+ LSTR MSG_SHORT_HOUR = _UxGT("г"); // One character only
+ LSTR MSG_SHORT_MINUTE = _UxGT("х"); // One character only
+ LSTR MSG_HEATING = _UxGT("Нагрівання...");
+ LSTR MSG_COOLING = _UxGT("Охолодження...");
+ LSTR MSG_BED_HEATING = _UxGT("Нагрів столу...");
+ LSTR MSG_PROBE_HEATING = _UxGT("Нагрів зонду...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("Нагрів камери...");
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_BED_COOLING = _UxGT("Охолодження столу...");
+ LSTR MSG_PROBE_COOLING = _UxGT("Охолодження зонду...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Охолодження камери...");
+ LSTR MSG_LASER_COOLING = _UxGT("Охолодження лазеру...");
+ #else
+ LSTR MSG_BED_COOLING = _UxGT("Охолодж. столу...");
+ LSTR MSG_PROBE_COOLING = _UxGT("Охолодж. зонду...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("Охолодж. камери...");
+ LSTR MSG_LASER_COOLING = _UxGT("Охолодж. лазеру...");
+ #endif
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Калібрування Delta");
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Калібрувати X");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Калібрувати Y");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Калібрувати Z");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Калібр. центр");
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Параметри Delta");
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Автокалібрування");
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Діагональ стрижня");
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Висота");
+ LSTR MSG_DELTA_RADIUS = _UxGT("Радіус");
+
+ LSTR MSG_INFO_MENU = _UxGT("Про принтер");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Дані принтера");
+
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_3POINT_LEVELING = _UxGT("3-точкове вирівнювання");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Лінійне вирівнювання");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Білінійне вирівнювання");
+ #else
+ LSTR MSG_3POINT_LEVELING = _UxGT("3-точкове вирівн.");
+ LSTR MSG_LINEAR_LEVELING = _UxGT("Лінійне вирівн.");
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("Білінійне вирівн.");
+ #endif
+ LSTR MSG_UBL_LEVELING = _UxGT("UBL");
+ LSTR MSG_MESH_LEVELING = _UxGT("Вирівнювання сітки");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_MESH_DONE = _UxGT("Зондування сітки виконано");
+ #else
+ LSTR MSG_MESH_DONE = _UxGT("Зондування виконано");
+ #endif
+
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Статистика принтера");
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Про плату");
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Термістори");
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Екструдери");
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Бод");
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Протокол");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Контроль витіку ") LCD_STR_THERMOMETER _UxGT(" Вимк");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Контроль витіку ") LCD_STR_THERMOMETER _UxGT(" Увімк");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Час простою хотенду");
+ #else
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("Контр.витіку ") LCD_STR_THERMOMETER _UxGT(" Вимк");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("Контр.витіку ") LCD_STR_THERMOMETER _UxGT(" Увімк");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Час прост. хот-у");
+ #endif
+
+ LSTR MSG_CASE_LIGHT = _UxGT("Підсвітка");
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Яскравість світла");
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("НЕ ТОЙ ПРИНТЕР");
+
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Завершено");
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Екструдовано");
+ LSTR MSG_PLEASE_PREHEAT = _UxGT("Нагрійте хотенд");
+ LSTR MSG_COLORS_GET = _UxGT("Отримати колір");
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Носій не вставлений");
+ LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Перезавантаження...");
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Кількість друків");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Час друку");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Найдовший час");
+ LSTR MSG_COLORS_SELECT = _UxGT("Обрати кольори");
+ LSTR MSG_COLORS_APPLIED = _UxGT("Кольори застосовані");
+ #else
+ LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Немає носія");
+ LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Перезавантаж...");
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Друків");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Загалом");
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Найдовше");
+ LSTR MSG_COLORS_SELECT = _UxGT("Кольори");
+ LSTR MSG_COLORS_APPLIED = _UxGT("Кольори застос.");
+ #endif
+ LSTR MSG_COLORS_RED = _UxGT("Червоний");
+ LSTR MSG_COLORS_GREEN = _UxGT("Зелений");
+ LSTR MSG_COLORS_BLUE = _UxGT("Синій");
+ LSTR MSG_COLORS_WHITE = _UxGT("Білий");
+ LSTR MSG_UI_LANGUAGE = _UxGT("Мова");
+ LSTR MSG_SOUND_ENABLE = _UxGT("Дозволити звук");
+ LSTR MSG_LOCKSCREEN = _UxGT("Блокувати екран");
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Мін. ") LCD_STR_THERMOMETER;
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Макс. ") LCD_STR_THERMOMETER;
+ LSTR MSG_INFO_PSU = _UxGT("Блок жив-ня");
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Сила мотору");
+ LSTR MSG_DAC_PERCENT_N = _UxGT("Драйвер @, %");
+ LSTR MSG_ERROR_TMC = _UxGT("ЗБІЙ ЗВ'ЯЗКУ З TMC");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Запис ЦАП у EEPROM");
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("ЗАМІНА ПРУТКА");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("ЗУПИНКА ДРУКУ");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ЗАВАНТАЖИТИ ПРУТОК");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("ВИВАНТАЖИТИ ПРУТОК");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ПАРАМЕТРИ ПРОДОВЖЕННЯ:");
+ #else
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ПАРАМ.ПРОДОВЖЕННЯ:");
+ #endif
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Видавити ще");
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Відновити друк");
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Сопло: ");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Датчик закінчення прутка");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Відстань закінч.,мм");
+ #else
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("Датчик закінч.прутка");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("До закінч.,мм");
+ #endif
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Помилка паркування");
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("Помилка зондування");
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ОБЕРІТЬ ПРУТОК");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("Онови прошивку MMU!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU потребує уваги");
+ LSTR MSG_MMU2_RESUME = _UxGT("MMU Продовжити");
+ LSTR MSG_MMU2_RESUMING = _UxGT("MMU Продовження...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU Завантажити");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("MMU Завантажити все");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Завантажити в сопло");
+ #else
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU Завант. в сопло");
+ #endif
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU Звільнити");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU Звільнити ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU Вивантажити");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Завантаж. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Викидання прутка...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Вивантаження...");
+ LSTR MSG_MMU2_ALL = _UxGT("Все");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("Пруток ~");
+ LSTR MSG_MMU2_RESET = _UxGT("Перезапуск MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("MMU Перезапуск...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Видаліть, натисніть");
+
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_MIX = _UxGT("Змішування");
+ #else
+ LSTR MSG_MIX = _UxGT("Змішув.");
+ #endif
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("Компонент =");
+ LSTR MSG_MIXER = _UxGT("Змішувач");
+ LSTR MSG_GRADIENT = _UxGT("Градієнт");
+ LSTR MSG_FULL_GRADIENT = _UxGT("Повний градієнт");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_TOGGLE_MIX = _UxGT("Переключити змішування");
+ #else
+ LSTR MSG_TOGGLE_MIX = _UxGT("Переключ.змішування");
+ #endif
+ LSTR MSG_CYCLE_MIX = _UxGT("Циклічне змішування");
+ LSTR MSG_GRADIENT_MIX = _UxGT("Градієнт змішування");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("Змінити градієнт");
+
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Активація В-інструменту");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Псевдонім В-інструменту");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Зкидання В-інструментів");
+ #else
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("Актив. В-інструм.");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("Псевдонім В-інструм");
+ LSTR MSG_RESET_VTOOLS = _UxGT("Зкидання В-інструм.");
+ #endif
+ LSTR MSG_START_VTOOL = _UxGT("Початок В-інструменту");
+ LSTR MSG_END_VTOOL = _UxGT("Кінець В-інструменту");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("Змішати В-інструменти");
+ LSTR MSG_VTOOLS_RESET = _UxGT("В-інструменти зкинуті");
+ LSTR MSG_START_Z = _UxGT("Початок Z:");
+ LSTR MSG_END_Z = _UxGT(" Кінець Z:");
+
+ LSTR MSG_GAMES = _UxGT("Ігри");
+ LSTR MSG_BRICKOUT = _UxGT("Цеглини");
+ LSTR MSG_INVADERS = _UxGT("Вторгнення");
+ LSTR MSG_SNAKE = _UxGT("Zм!йк@");
+ LSTR MSG_MAZE = _UxGT("Лабіринт");
+
+ LSTR MSG_BAD_PAGE = _UxGT("Погана сторінка");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("Погана швидкість стор.");
+ #else
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("Погана швидк. стор.");
+ #endif
+
+ LSTR MSG_EDIT_PASSWORD = _UxGT("Редагувати пароль");
+ LSTR MSG_LOGIN_REQUIRED = _UxGT("Потрібен логін");
+ LSTR MSG_PASSWORD_SETTINGS = _UxGT("Параметри паролю");
+ LSTR MSG_ENTER_DIGIT = _UxGT("Введіть цифру");
+ LSTR MSG_CHANGE_PASSWORD = _UxGT("Змінити пароль");
+ LSTR MSG_REMOVE_PASSWORD = _UxGT("Видалити пароль");
+ LSTR MSG_PASSWORD_SET = _UxGT("Пароль: ");
+ LSTR MSG_START_OVER = _UxGT("Старт через");
+ LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Не забудь зберегти!");
+ LSTR MSG_PASSWORD_REMOVED = _UxGT("Пароль видалений");
+
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Паркування..."));
+ #if LCD_HEIGHT >= 4
+ // Up to 3 lines allowed
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Натисніть кнопку", "для продовження", "друку"));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Зачекайте", "на початок", "заміни прутка"));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Вставте пруток", "та натисніть", "для продовження"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Натисніть кнопку", "для нагріву сопла"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Сопло нагрівається", "зачекайте..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Зачекайте", "на вивід прутка"));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Зачекайте", "на ввід прутка"));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Дочекайтесь", "очищення прутка"));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Натисніть кнопку", "для завершення", "очищення прутка"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Зачекайте", "на відновлення", "друку"));
+ #else
+ // Up to 2 lines allowed
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Продовжити друк"));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Зачекайте..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Вставте і натисніть"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Нагріти сопло"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Нагрів сопла..."));
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Вивід прутка..."));
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Ввід прутка..."));
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Очищення прутка..."));
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Завершити очищення"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Поновлення друку..."));
+ #endif
+
+ LSTR MSG_TMC_DRIVERS = _UxGT("Драйвери TMC");
+ LSTR MSG_TMC_CURRENT = _UxGT("Струм драйвера");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Гібридний поріг");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Дім без кінцевиків");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Режим мікрокроку");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим увімк.");
+ LSTR MSG_SERVICE_RESET = _UxGT("Зкидання");
+ LSTR MSG_SERVICE_IN = _UxGT(" в:");
+ LSTR MSG_BACKLASH = _UxGT("Люфт");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("Виправлення");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Зглажування");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("Рівень вісі X");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("Авто калібрування");
+
+ #if ENABLED(TOUCH_UI_FTDI_EVE)
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Час простою збіг, температура впала. Натисніть ОК, щоби знову нагріти та продовжити");
+ #else
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("Час нагрівача збіг");
+ #endif
+ LSTR MSG_REHEAT = _UxGT("Поновити нагрів");
+ LSTR MSG_REHEATING = _UxGT("Нагрівання...");
+
+ LSTR MSG_PROBE_WIZARD = _UxGT("Майстер Z-зонда");
+ #if LCD_WIDTH > 21 || HAS_DWIN_E3V2
+ LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Зондув. контрольної точки Z");
+ LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Рух до точки зондування");
+ #else
+ LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Зондув.контр.точки Z");
+ LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Рух до точки зондув.");
+ #endif
+
+ LSTR MSG_SOUND = _UxGT("Звук");
+
+ LSTR MSG_TOP_LEFT = _UxGT("Верхній лівий");
+ LSTR MSG_BOTTOM_LEFT = _UxGT("Нижній лівий");
+ LSTR MSG_TOP_RIGHT = _UxGT("Верхній правий");
+ LSTR MSG_BOTTOM_RIGHT = _UxGT("Нижній правий");
+ LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Калібрування успішне");
+ LSTR MSG_CALIBRATION_FAILED = _UxGT("Збій калібрування");
+
+ LSTR MSG_DRIVER_BACKWARD = _UxGT(" драйвер назад");
+
+ LSTR MSG_SD_CARD = _UxGT("SD Картка");
+ LSTR MSG_USB_DISK = _UxGT("USB Диск");
+}
+
+#if FAN_COUNT == 1
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED
+#else
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N
+#endif
diff --git a/src/lcd/language/language_vi.h b/src/lcd/language/language_vi.h
new file mode 100644
index 0000000..27c6ee1
--- /dev/null
+++ b/src/lcd/language/language_vi.h
@@ -0,0 +1,441 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Vietnamese
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+namespace Language_vi {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 2;
+ LSTR LANGUAGE = _UxGT("Vietnamese");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Sẵn sàng."); // Ready
+ LSTR MSG_BACK = _UxGT("Trở lại"); // Back
+ LSTR MSG_MEDIA_ABORTING = _UxGT("Đang hủy bỏ...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("Phương tiện được cắm vào"); // Media inserted
+ LSTR MSG_MEDIA_REMOVED = _UxGT("Phương tiện được rút ra");
+ LSTR MSG_MEDIA_WAITING = _UxGT("Chờ đợi phương tiện");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("Lỗi đọc phương tiện");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB được rút ra");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB khởi thất bại");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("Công tắc"); // Endstops - công tắc hành trình
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Công tắc mềm"); // soft Endstops
+ LSTR MSG_MAIN = _UxGT("Chính"); // Main
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("Thiết lập cấp cao"); // Advanced Settings
+ LSTR MSG_CONFIGURATION = _UxGT("Cấu hình"); // Configuration
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("Khởi chạy tự động"); // Autostart
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("Tắt động cơ bước"); // Disable steppers
+ LSTR MSG_DEBUG_MENU = _UxGT("Menu gỡ lỗi"); // Debug Menu
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Kiểm tra tiến độ"); // Progress bar test
+ LSTR MSG_AUTO_HOME = _UxGT("Về nhà tự động"); // Auto home
+ LSTR MSG_AUTO_HOME_X = _UxGT("Về nhà X"); // home X
+ LSTR MSG_AUTO_HOME_Y = _UxGT("Về nhà Y"); // home Y
+ LSTR MSG_AUTO_HOME_Z = _UxGT("Về nhà Z"); // home Z
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("Chỉnh canh Z tự động");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("Đang về nhà XYZ"); // Homing XYZ
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Nhấn để bắt đầu"); // Click to Begin
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("Điểm tiếp theo"); // Next Point
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("San lấp được hoàn thành"); // Leveling Done!
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("Chiều cao mờ dần"); // Fade Height
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("Đặt bù đắp nhà"); // Set home offsets
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Bù đắp được áp dụng"); // Offsets applied
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước"); // Preheat
+ LSTR MSG_PREHEAT_1_H = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước ~"); // Preheat
+ LSTR MSG_PREHEAT_1_END = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu");
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu ~");
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Tất cả"); // all
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Bàn"); // bed -- using vietnamese term for 'table' instead
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Cấu hình"); // conf
+
+ LSTR MSG_PREHEAT_M = _UxGT("Làm nóng $ trước"); // Preheat
+ LSTR MSG_PREHEAT_M_H = _UxGT("Làm nóng $ trước ~"); // Preheat
+ LSTR MSG_PREHEAT_M_END = _UxGT("Làm nóng $ Đầu");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Làm nóng $ Đầu ~");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Làm nóng $ Tất cả"); // all
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Làm nóng $ Bàn"); // bed -- using vietnamese term for 'table' instead
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Làm nóng $ Cấu hình"); // conf
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("Sự nóng trước tự chọn"); // Preheat Custom
+ LSTR MSG_COOLDOWN = _UxGT("Nguội xuống"); // Cooldown
+ LSTR MSG_SWITCH_PS_ON = _UxGT("Bật nguồn"); // Switch power on
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("Tắt nguồn"); // Switch power off
+ LSTR MSG_EXTRUDE = _UxGT("Ép đùn"); // Extrude
+ LSTR MSG_RETRACT = _UxGT("Rút lại"); // Retract
+ LSTR MSG_MOVE_AXIS = _UxGT("Di chuyển trục"); // Move axis
+ LSTR MSG_BED_LEVELING = _UxGT("San Lấp Bàn"); // Bed Leveling
+ LSTR MSG_LEVEL_BED = _UxGT("Làm bằng mặt bàn"); // Level bed
+ LSTR MSG_BED_TRAMMING = _UxGT("Làm bằng góc bàn"); // Level corners
+ LSTR MSG_NEXT_CORNER = _UxGT("Góc tiếp theo"); // Next corner
+ LSTR MSG_EDITING_STOPPED = _UxGT("Chỉnh lưới đã dừng"); // Mesh Editing Stopped
+ LSTR MSG_MESH_X = _UxGT("Mục lục X"); // Index X
+ LSTR MSG_MESH_Y = _UxGT("Mục lục Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Giá trị Z"); // Z Value
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("Các lệnh tự chọn"); // Custom Commands
+ LSTR MSG_UBL_DOING_G29 = _UxGT("Đang chạy G29"); // Doing G29
+ LSTR MSG_UBL_TOOLS = _UxGT("Công cụ UBL"); // UBL tools
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("San Lấp Bàn Thống Nhất (UBL)"); // Unified Bed Leveling
+ LSTR MSG_IDEX_MENU = _UxGT("chế độ IDEX"); // IDEX Mode
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Đậu tự động"); // Auto-Park
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Sự gấp đôi"); // Duplication
+ LSTR MSG_IDEX_MODE_SCALED_COPY = _UxGT("Bản sao thu nhỏ");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Toàn quyền điều khiển"); // Full control
+ LSTR MSG_IDEX_X_OFFSET = _UxGT("Đầu phun X nhì"); // 2nd nozzle X
+ LSTR MSG_IDEX_Y_OFFSET = _UxGT("Đầu phun Y nhì");
+ LSTR MSG_IDEX_Z_OFFSET = _UxGT("Đầu phun Z nhì");
+ LSTR MSG_IDEX_SAVE_OFFSETS = _UxGT("Lưu bù đắp"); // Save offsets
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("Tự xây dựng lưới"); // Manually Build Mesh
+ LSTR MSG_UBL_BC_INSERT = _UxGT("Đặt chêm và đo"); // Place shim & measure
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("Đo"); // Measure
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("Tháo và đo bàn"); // Remove & measure bed
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Chuyển sang tiếp theo"); // moving to next
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Bật UBL");
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Tắt UBL");
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Nhiệt độ bàn"); // Bed Temp
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("Nhiệt độ đầu phun"); // Hotend Temp
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("Chỉnh sửa lưới"); // Mesh Edit
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Chỉnh sửa lưới tự chọn"); // Edit Custom Mesh
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("Chỉnh lưới chính xác"); // Fine tuning mesh
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("Chỉnh sửa xong lưới"); // Done Editing Mesh
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Xây dựng lưới tự chọn"); // Build Custom Mesh
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("Xây dựng lưới"); // Build Mesh
+ #if HAS_PREHEAT
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("Xây dựng lưới ($)");
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("Thẩm tra lưới ($)");
+ #endif
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("Xây dựng lưới lạnh"); // Build cold mesh
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Điều chỉnh chiều cao lưới"); // Adjust Mesh Height
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Số lượng chiều cao"); // Height Amount
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Thẩm tra lưới"); // Validate Mesh
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Thẩm tra lưới tự chọn"); // validate custom mesh
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Tiếp tục xây lưới bàn"); // Continue Bed Mesh
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("Đang san lấp lưới"); // Mesh Leveling
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Đang san lấp 3-điểm"); // 3-Point Leveling
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("Đang san lấp lưới phẳng"); // Grid (planar) Mesh Leveling
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("Làm bằng lưới"); // Level Mesh
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("Điểm bên cạnh"); // Side Points
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("Loại bản đồ"); // Map Type
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("Đầu ra bản đồ lưới"); // Output Mesh Map
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Đầu ra cho máy chủ"); // Output for Host
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Đầu ra cho CSV"); // Output for CSV
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Hỗ trợ lưới"); // Off Printer Backup | backup mesh
+ LSTR MSG_UBL_INFO_UBL = _UxGT("Đầu ra thông tin UBL"); // Output UBL Info
+ LSTR MSG_EDIT_MESH = _UxGT("Chỉnh sửa lưới"); // Edit mesh
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("Số lượng lấp đầy"); // Fill-in Amount
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("Tự lấp đầy"); // Manual Fill-in
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("Lấp đầy thông minh"); // Smart Fill-in
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("Lưới lấp đầy"); // Fill-in Mesh
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("Bác bỏ tất cả"); // Invalidate All
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Bác bỏ gần nhất"); // Invalidate Closest
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("Chỉnh chính xác tất cả"); // Fine Tune ALl
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Chỉnh chính xác gần nhất"); // Fine Tune Closest
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("Lưu trữ lưới"); // Mesh Storage
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("Khe nhớ"); // Memory Slot
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("Tải lưới bàn"); // Load Bed Mesh
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("Lưu lưới bàn"); // Save Bed Mesh
+ LSTR MSG_MESH_LOADED = _UxGT("%i lưới được nạp"); // Mesh %i loaded
+ LSTR MSG_MESH_SAVED = _UxGT("%i lưới đã lưu");
+ LSTR MSG_NO_STORAGE = _UxGT("Không lưu trữ"); // No Storage
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("Điều sai: Lưu UBL"); // Err: UBL Save
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("Điều Sai: Khôi Phục UBL"); // Err: UBL Restore
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Đầu Dò-Z Đã Ngừng"); // Z-Offset Stopped
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Bước-Từng-Bước UBL"); // Step-By-Step UBL
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Xây dựng lưới lạnh");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2.Lấp đầy thông minh");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Thẩm tra lưới");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Chỉnh chính xác tất cả");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Thẩm tra lưới");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Chỉnh chính xác tất cả");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7.Lưu lưới bàn");
+
+ LSTR MSG_LED_CONTROL = _UxGT("Điều khiển LED"); // LED Control
+ LSTR MSG_LEDS = _UxGT("Đèn"); // Lights
+ LSTR MSG_LED_PRESETS = _UxGT("Đèn định sẵn"); // Light Presets
+ LSTR MSG_SET_LEDS_RED = _UxGT("Đỏ"); // Red
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("Cam"); // Orange
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("Vàng"); // Yellow
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("Xanh Lá"); // Green
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("Xanh"); // Blue
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("Xanh Đậm"); // Indigo
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("Tím"); // Violet
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("Trắng"); // White
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("Mặc định"); // Default
+ LSTR MSG_CUSTOM_LEDS = _UxGT("Đèn Tự Chọn"); // Custom Lights
+ LSTR MSG_INTENSITY_R = _UxGT("Cường Độ Đỏ"); // Red Intensity
+ LSTR MSG_INTENSITY_G = _UxGT("Cường Độ Xanh Lá"); // Green Intensity
+ LSTR MSG_INTENSITY_B = _UxGT("Cường Độ Xanh"); // Blue Intensity
+ LSTR MSG_INTENSITY_W = _UxGT("Cường Độ Trắng"); // White Intensity
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("độ sáng"); // Brightness
+
+ LSTR MSG_MOVING = _UxGT("Di chuyển..."); // Moving
+ LSTR MSG_FREE_XY = _UxGT("Giải phóng XY"); // Free XY
+ LSTR MSG_MOVE_X = _UxGT("Di chuyển X"); // Move X
+ LSTR MSG_MOVE_Y = _UxGT("Di chuyển Y");
+ LSTR MSG_MOVE_Z = _UxGT("Di chuyển Z");
+ LSTR MSG_MOVE_N = _UxGT("Di chuyển @");
+ LSTR MSG_MOVE_E = _UxGT("Máy đùn"); // Extruder
+ LSTR MSG_MOVE_EN = _UxGT("Máy đùn *");
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("Đầu nóng quá lạnh"); // Hotend too cold
+ LSTR MSG_MOVE_01MM = _UxGT("Di chuyển 0.1mm"); // Move 0.1mm
+ LSTR MSG_MOVE_1MM = _UxGT("Di chuyển 1mm"); // Move 1mm
+ LSTR MSG_MOVE_10MM = _UxGT("Di chuyển 10mm"); // Move 10mm
+ LSTR MSG_MOVE_100MM = _UxGT("Di chuyển 100mm"); // Move 100mm
+ LSTR MSG_SPEED = _UxGT("Tốc độ"); // Speed
+ LSTR MSG_BED_Z = _UxGT("Z Bàn");
+ LSTR MSG_NOZZLE = _UxGT("Đầu phun"); // Nozzle
+ LSTR MSG_NOZZLE_N = _UxGT("Đầu phun ~");
+ LSTR MSG_BED = _UxGT("Bàn"); // bed
+ LSTR MSG_FAN_SPEED = _UxGT("Tốc độ quạt"); // fan speed
+ LSTR MSG_FAN_SPEED_N = _UxGT("Tốc độ quạt ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Tốc độ quạt phụ"); // Extra fan speed
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Tốc độ quạt phụ ~");
+ LSTR MSG_FLOW = _UxGT("Lưu Lượng");
+ LSTR MSG_FLOW_N = _UxGT("Lưu Lượng ~");
+ LSTR MSG_CONTROL = _UxGT("Điều khiển"); // Control
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Đa"); // min
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Thiểu");
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Hệ Số"); // factor
+ LSTR MSG_AUTOTEMP = _UxGT("Nhiệt độ tự động"); // Autotemp
+ LSTR MSG_LCD_ON = _UxGT("Bật"); // on
+ LSTR MSG_LCD_OFF = _UxGT("Tắt"); // off
+ LSTR MSG_SELECT = _UxGT("Lựa"); // Select
+ LSTR MSG_SELECT_E = _UxGT("Lựa *");
+ LSTR MSG_ACC = _UxGT("Tăng Tốc");
+ LSTR MSG_JERK = _UxGT("Giật");
+ LSTR MSG_VA_JERK = _UxGT("Giật-V") STR_A;
+ LSTR MSG_VB_JERK = _UxGT("Giật-V") STR_B;
+ LSTR MSG_VC_JERK = _UxGT("Giật-V") STR_C;
+ LSTR MSG_VN_JERK = _UxGT("Giật-V@");
+ LSTR MSG_VE_JERK = _UxGT("Giật-Ve");
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("Độ Lệch Chỗ Giao"); // Junction Dev
+ LSTR MSG_MAX_SPEED = _UxGT("Vận tốc"); // velocity
+ LSTR MSG_VMAX_A = _UxGT("Vđa") STR_A; // Vmax
+ LSTR MSG_VMAX_B = _UxGT("Vđa") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("Vđa") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("Vđa@");
+ LSTR MSG_VMAX_E = _UxGT("VđaE");
+ LSTR MSG_VMAX_EN = _UxGT("Vđa *");
+ LSTR MSG_VMIN = _UxGT("Vthiểu"); // Vmin
+ LSTR MSG_VTRAV_MIN = _UxGT("Vchuyển thiểu"); // VTrav min
+ LSTR MSG_ACCELERATION = _UxGT("Sự tăng tốc"); // Acceleration
+ LSTR MSG_AMAX_A = _UxGT("Tăng tốc ca") STR_A; // Amax
+ LSTR MSG_AMAX_B = _UxGT("Tăng tốc ca") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("Tăng tốc ca") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("Tăng tốc ca@");
+ LSTR MSG_AMAX_E = _UxGT("Tăng tốc caE");
+ LSTR MSG_AMAX_EN = _UxGT("Tăng tốc ca *");
+ LSTR MSG_A_RETRACT = _UxGT("TT-Rút"); // A-retract
+ LSTR MSG_A_TRAVEL = _UxGT("TT-Chuyển"); // A-travel
+ LSTR MSG_STEPS_PER_MM = _UxGT("Bước/mm"); // Steps
+ LSTR MSG_A_STEPS = _UxGT("Bước") STR_A _UxGT("/mm"); // Steps/mm
+ LSTR MSG_B_STEPS = _UxGT("Bước") STR_B _UxGT("/mm");
+ LSTR MSG_C_STEPS = _UxGT("Bước") STR_C _UxGT("/mm");
+ LSTR MSG_N_STEPS = _UxGT("Bước@/mm");
+ LSTR MSG_E_STEPS = _UxGT("BướcE/mm");
+ LSTR MSG_EN_STEPS = _UxGT("Bước */mm");
+ LSTR MSG_TEMPERATURE = _UxGT("Nhiệt độ"); // Temperature
+ LSTR MSG_MOTION = _UxGT("Chuyển động"); // Motion
+ LSTR MSG_FILAMENT = _UxGT("Vật liệu in"); // dây nhựa
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E bằng mm") SUPERSCRIPT_THREE; // E in mm
+ LSTR MSG_FILAMENT_DIAM = _UxGT("Đường kính nhựa"); // Fil. Dai.
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("Đường kính nhựa *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("Dỡ mm"); // unload mm
+ LSTR MSG_FILAMENT_LOAD = _UxGT("Nạp mm");
+ LSTR MSG_ADVANCE_K = _UxGT("K Cấp Cao"); // Advance K
+ LSTR MSG_ADVANCE_K_E = _UxGT("K Cấp Cao *"); // Advance K
+ LSTR MSG_CONTRAST = _UxGT("Độ tương phản LCD"); // LCD contrast
+ LSTR MSG_STORE_EEPROM = _UxGT("Lưu các thiết lập"); // Store settings
+ LSTR MSG_LOAD_EEPROM = _UxGT("Tải các cài đặt"); // Load settings
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("Khôi phục phòng hư"); // Restore Defaults
+ LSTR MSG_INIT_EEPROM = _UxGT("Khởi Tạo EEPROM"); // Initialize EEPROM
+ LSTR MSG_MEDIA_UPDATE = _UxGT("Cập Nhật phương tiện"); // Update media
+ LSTR MSG_RESET_PRINTER = _UxGT("Bặt Lại Máy In");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Cập Nhật"); // Refresh
+ LSTR MSG_INFO_SCREEN = _UxGT("Màn Hình Thông Tin"); // Info screen
+ LSTR MSG_PREPARE = _UxGT("Chuẩn bị"); // Prepare
+ LSTR MSG_TUNE = _UxGT("Điều Chỉnh"); // Tune
+ LSTR MSG_PAUSE_PRINT = _UxGT("Tạm dừng in"); // Pause print
+ LSTR MSG_RESUME_PRINT = _UxGT("Tiếp tục in"); // Resume print
+ LSTR MSG_STOP_PRINT = _UxGT("Ngừng in"); // Stop print
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("Phục Hồi Mất Điện"); // Outage Recovery
+ LSTR MSG_MEDIA_MENU = _UxGT("In từ phương tiện"); // Print from media
+ LSTR MSG_NO_MEDIA = _UxGT("Không có phương tiện"); // No media
+ LSTR MSG_DWELL = _UxGT("Ngủ..."); // Sleep
+ LSTR MSG_USERWAIT = _UxGT("Nhấn để tiếp tục..."); // Click to resume (same as 'continue')
+ LSTR MSG_PRINT_PAUSED = _UxGT("In tạm dừng"); // print paused
+ LSTR MSG_PRINTING = _UxGT("Đang in..."); // printing
+ LSTR MSG_PRINT_ABORTED = _UxGT("In đã hủy bỏ"); // Print aborted
+ LSTR MSG_NO_MOVE = _UxGT("Không di chuyển."); // No move.
+ LSTR MSG_KILLED = _UxGT("ĐÃ CHẾT. ");
+ LSTR MSG_STOPPED = _UxGT("ĐÃ NGỪNG. ");
+ LSTR MSG_CONTROL_RETRACT = _UxGT("Rút mm"); // Retract mm
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Rút Trao.mm"); // Swap Re.mm
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("Rút V");
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Nhảy mm"); // hop
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("BỏRút mm"); // Unretr. mm
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("BỏRút T mm"); // S Unretr. mm
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("BỏRút V"); // UnRet V
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("BỏRút T V"); // S UnRet V
+ LSTR MSG_AUTORETRACT = _UxGT("RútTựĐộng"); // Auto-Retract
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Khoảng Cách Rút"); // Retract Distance
+ LSTR MSG_TOOL_CHANGE = _UxGT("Thay Đổi Công Cụ"); // Tool Change
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Đưa Lên Z"); // Z Raise
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Tốc Độ Tuôn Ra"); // Prime Speed
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Tốc Độ Rút Lại"); // Retract Speed
+ LSTR MSG_FILAMENTCHANGE = _UxGT("Thay dây nhựa"); // change filament
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("Thay dây nhựa *"); // change filament
+ LSTR MSG_FILAMENTLOAD = _UxGT("Nạp dây nhựa"); // load filament
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("Nạp dây nhựa *"); // load filament
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("Dỡ dây nhựa"); // unload filament
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Dỡ dây nhựa *"); // unload filament
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Dỡ tất cả"); // Unload All
+ LSTR MSG_ATTACH_MEDIA = _UxGT("Khởi tạo phương tiện"); // Attach media
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Thay phương tiện"); // Change midea
+ LSTR MSG_RELEASE_MEDIA = _UxGT("Phát hành phương tiện");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Đầu Dò Z qua bàn"); // Z Probe past bed
+ LSTR MSG_SKEW_FACTOR = _UxGT("Hệ số nghiêng"); // Skew Factor
+ LSTR MSG_BLTOUCH = _UxGT("BLTOUCH"); // BLTouch
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Tự kiểm tra BLTOUCH "); // BLTouch Self-Test
+ LSTR MSG_BLTOUCH_RESET = _UxGT("Bặt lại BLTouch"); // Reset BLTouch
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Đem BLTouch"); // Deploy BLTouch
+ LSTR MSG_BLTOUCH_STOW = _UxGT("Cất BLTouch"); // Stow BLTouch
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("Đem Đầu Dò-Z"); // Deploy Z-Probe
+ LSTR MSG_MANUAL_STOW = _UxGT("Cất Đầu Dò-Z"); // Stow Z-Probe
+ LSTR MSG_HOME_FIRST = _UxGT("Về nhà %s%s%s Trước");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Đầu Dò Bù Đắp Z"); // Probe Z Offset
+ LSTR MSG_BABYSTEP_X = _UxGT("Nhít X"); // Babystep X
+ LSTR MSG_BABYSTEP_Y = _UxGT("Nhít Y");
+ LSTR MSG_BABYSTEP_Z = _UxGT("Nhít Z");
+ LSTR MSG_BABYSTEP_N = _UxGT("Nhít @");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("Hủy bỏ công tắc"); // Endstop abort
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("Sưởi đầu phun không thành công"); // Heating failed
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Điều sai: nhiệt độ dư"); // Err: REDUNDANT TEMP
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("Vấn đề nhiệt"); // THERMAL RUNAWAY | problem
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("Vấn đề nhiệt bàn"); // BED THERMAL RUNAWAY
+ LSTR MSG_ERR_MAXTEMP = _UxGT("Điều sai: nhiệt độ tối đa"); // Err: MAXTEMP
+ LSTR MSG_ERR_MINTEMP = _UxGT("Điều sai: nhiệt độ tối thiểu"); // Err: MINTEMP
+ LSTR MSG_HALTED = _UxGT("MÁY IN ĐÃ DỪNG LẠI"); // PRINTER HALTED
+ LSTR MSG_PLEASE_RESET = _UxGT("Xin bặt lại"); // Please reset
+ LSTR MSG_SHORT_DAY = _UxGT("n"); // d - ngày - One character only
+ LSTR MSG_SHORT_HOUR = _UxGT("g"); // h - giờ - One character only
+ LSTR MSG_SHORT_MINUTE = _UxGT("p"); // m - phút - One character only
+ LSTR MSG_HEATING = _UxGT("Đang sưởi nóng..."); // heating
+ LSTR MSG_COOLING = _UxGT("Đang làm nguội..."); // cooling
+ LSTR MSG_BED_HEATING = _UxGT("Đang sưởi nong bàn..."); // bed heating
+ LSTR MSG_BED_COOLING = _UxGT("Đang làm nguội bàn..."); // bed cooling
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("Cân Chỉnh Delta"); // Delta calibration
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Chỉnh X lại");
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Chỉnh Y lại");
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Chỉnh Z lại");
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Chỉnh Z Center"); // Calibrate Center
+ LSTR MSG_DELTA_SETTINGS = _UxGT("Cài Đặt Delta"); // Delta Settings
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Cân Chỉnh Tự Động"); // Auto Calibration
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("Gậy Chéo"); // Diag Rod
+ LSTR MSG_DELTA_HEIGHT = _UxGT("Chiều Cao"); // Height
+ LSTR MSG_DELTA_RADIUS = _UxGT("Bán Kính"); // Radius
+ LSTR MSG_INFO_MENU = _UxGT("Về Máy In");
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("Thông Tin Máy In"); // Printer Info
+ LSTR MSG_3POINT_LEVELING = _UxGT("San lấp 3-Điểm"); // 3-Point Leveling
+ LSTR MSG_LINEAR_LEVELING = _UxGT("San Lấp Tuyến Tính"); // Linear Leveling
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("San Lấp Song Tuyến"); // Bilinear Leveling
+ LSTR MSG_UBL_LEVELING = _UxGT("San Lấp Bàn Thống Nhất"); // Unified Bed Leveling
+ LSTR MSG_MESH_LEVELING = _UxGT("Lưới San Lấp"); // Mesh Leveling
+ LSTR MSG_INFO_STATS_MENU = _UxGT("Thống Kê Máy In"); // Printer Stats
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("Thông Tin Bo Mạch"); // Board Info
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Điện Trở Nhiệt"); // Thermistors
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("Máy đùn"); // Extruders
+ LSTR MSG_INFO_BAUDRATE = _UxGT("Baud"); // Baud
+ LSTR MSG_INFO_PROTOCOL = _UxGT("Giao Thức"); // Protocol
+ LSTR MSG_CASE_LIGHT = _UxGT("Đèn Khuông"); // Case light
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Độ Sáng"); // Light Brightness
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("Số In"); // Print Count
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Đã hoàn thành");
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Tổng số thời gian in"); // Total print time
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Thời gian việc lâu nhất"); // Longest job time
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Tổng số đùn"); // Extruded total
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("In"); // prints
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Đã hoàn thành"); // Completed
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("Tổng số"); // total
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Dài nhất"); // Longest
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Đã ép đùn");
+ #endif
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("Nhiệt độ tối thiểu"); // Min Temp
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("Nhiệt độ tối đa"); // Max temp
+ LSTR MSG_INFO_PSU = _UxGT("Bộ nguồn"); // PSU
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("Sức mạnh ổ đĩa"); // Drive Strength
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ % trình điều khiển");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Ghi DAC EEPROM"); // DAC EEPROM Write
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("In tạm dừng"); // PRINT PAUSED
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("Nạp dây nhựa");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("Dỡ dây nhựa"); // unload filament
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Tùy chọn hồi phục:"); // RESUME OPTIONS
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Xả thêm"); // Purge more
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Tiếp tục"); // continue
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Đầu Phun: "); // Nozzle
+ LSTR MSG_RUNOUT_SENSOR_ENABLE = _UxGT("Cảm Biến Hết"); // Runout Sensor
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("Sự nhà không thành công"); // Homing failed
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT(" không thành công"); // Probing failed
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nhấn nút", "để tiếp tục in")); // Press button to resume print
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Chờ cho sự", "thay đổi dây nhựa", "bắt đầu")); // wait for filament change to start
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Đút dây nhựa vào", "và nhấn nút", "để tiếp tục")); // insert filament and press button to continue //
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nhấn nút", "để làm nóng đầu phun")); // Press button to heat nozzle
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Đầu phun đang nóng lên", "Xin chờ...")); // Nozzle heating Please wait
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Chờ tro", "dây nhựa ra")); // Wait for filament unload
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Chờ tro", "dây nhựa vào")); // Wait for filament load
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Chờ tro", "xả dây nhựa")); // wait for filament purge
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Nhấn nút để kết thúc", "xả dây nhựa")); // Click to finish dây nhựa purge
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Chờ tro in", "tiếp tục...")); // Wait for print to resume
+ #else // LCD_HEIGHT < 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Nhấn nút để tiếp tục")); // Click to continue
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Xin chờ..."));
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Chèn và nhấn")); // Insert and Click
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Nhấn để sưởi")); // Click to heat
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Đang sưởi nóng")); // Heating
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Đang dỡ ra...")); // Ejecting
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Đang nạp...")); // Loading
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Đang xả...")); // Purging
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Nhấn nút để kết thúc")); // Click to finish
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Đang tiếp tục...")); // Resuming
+ #endif // LCD_HEIGHT < 4
+
+ LSTR MSG_TMC_DRIVERS = _UxGT("Trình điều khiển TMC"); // TMC drivers
+ LSTR MSG_TMC_CURRENT = _UxGT("Dòng điện trình điều khiển"); // Driver current
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("Ngưỡng Hỗn Hợp"); // Hybrid threshold
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("Vô cảm biến"); // Sensorless homing
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("Chế độ từng bước"); // Stepping mode
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("CắtTàngHình được kích hoạt"); // StealthChop enabled
+}
diff --git a/src/lcd/language/language_zh_CN.h b/src/lcd/language/language_zh_CN.h
new file mode 100644
index 0000000..4c5a94e
--- /dev/null
+++ b/src/lcd/language/language_zh_CN.h
@@ -0,0 +1,620 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Simplified Chinese
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+namespace Language_zh_CN {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 3;
+ LSTR LANGUAGE = _UxGT("Simplified Chinese");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT("已就绪."); // " ready."
+ LSTR MSG_MARLIN = _UxGT("马林");
+ LSTR MSG_YES = _UxGT("是");
+ LSTR MSG_NO = _UxGT("否");
+ LSTR MSG_BACK = _UxGT("返回"); // ”Back“
+ LSTR MSG_MEDIA_ABORTING = _UxGT("放弃中...");
+ LSTR MSG_MEDIA_INSERTED = _UxGT("存储卡已插入"); // "Card inserted"
+ LSTR MSG_MEDIA_REMOVED = _UxGT("存储卡被拔出"); // "Card removed"
+ LSTR MSG_MEDIA_WAITING = _UxGT("等待存储器");
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("存储器读取错误");
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB设备已弹出");
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB启动错误");
+ LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("子响应溢出");
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("挡块"); // "Endstops" // Max length 8 characters
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("软挡块");
+ LSTR MSG_MAIN = _UxGT("主菜单"); // "Main"
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("高级设置");
+ LSTR MSG_CONFIGURATION = _UxGT("配置");
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("自动开始"); // "Autostart"
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("关闭步进电机"); // "Disable steppers"
+ LSTR MSG_DEBUG_MENU = _UxGT("调试菜单"); // "Debug Menu"
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("进度条测试"); // "Progress Bar Test"
+ LSTR MSG_HOMING = _UxGT("回原点");
+ LSTR MSG_AUTO_HOME = _UxGT("自动回原点"); // "Auto home"
+ LSTR MSG_AUTO_HOME_X = _UxGT("回X原位"); // "Home X"
+ LSTR MSG_AUTO_HOME_Y = _UxGT("回Y原位"); // "Home Y"
+ LSTR MSG_AUTO_HOME_Z = _UxGT("回Z原位"); // "Home Z"
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("自动Z对齐");
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("平台调平XYZ归原位"); // "Homing XYZ"
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("单击开始热床调平"); // "Click to Begin"
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("下个热床调平点"); // "Next Point"
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("完成热床调平"); // "Leveling Done!"
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("淡出高度"); // "Fade Height"
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("设置原点偏移"); // "Set home offsets"
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("偏移已启用"); // "Offsets applied"
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("预热 ") PREHEAT_1_LABEL; // "Preheat PREHEAT_2_LABEL"
+ LSTR MSG_PREHEAT_1_H = _UxGT("预热 ") PREHEAT_1_LABEL " ~"; // "Preheat PREHEAT_2_LABEL"
+ LSTR MSG_PREHEAT_1_END = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴"); //MSG_PREHEAT_1 " "
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴 ~"); //MSG_PREHEAT_1 " "
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All"
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 热床"); //MSG_PREHEAT_1 " Bed"
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 设置"); //MSG_PREHEAT_1 " conf"
+
+ LSTR MSG_PREHEAT_M = _UxGT("预热 $"); // "Preheat PREHEAT_2_LABEL"
+ LSTR MSG_PREHEAT_M_H = _UxGT("预热 $ ~"); // "Preheat PREHEAT_2_LABEL"
+ LSTR MSG_PREHEAT_M_END = _UxGT("预热 $ 喷嘴"); //MSG_PREHEAT_1 " "
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("预热 $ 喷嘴 ~"); //MSG_PREHEAT_1 " "
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("预热 $ 全部"); //MSG_PREHEAT_1 " All"
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("预热 $ 热床"); //MSG_PREHEAT_1 " Bed"
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("预热 $ 设置"); //MSG_PREHEAT_1 " conf"
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("预热自定义");
+ LSTR MSG_COOLDOWN = _UxGT("降温"); // "Cooldown"
+ LSTR MSG_CUTTER_FREQUENCY = _UxGT("切割频率");
+ LSTR MSG_LASER_MENU = _UxGT("激光控制");
+ LSTR MSG_LASER_POWER = _UxGT("激光电源");
+ LSTR MSG_SPINDLE_MENU = _UxGT("主轴控制");
+ LSTR MSG_SPINDLE_POWER = _UxGT("主轴电源");
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("主轴反转");
+ LSTR MSG_SWITCH_PS_ON = _UxGT("开启电源"); // "Switch power on"
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("关闭电源"); // "Switch power off"
+ LSTR MSG_EXTRUDE = _UxGT("挤出"); // "Extrude"
+ LSTR MSG_RETRACT = _UxGT("回抽"); // "Retract"
+ LSTR MSG_MOVE_AXIS = _UxGT("移动轴"); // "Move axis"
+ LSTR MSG_BED_LEVELING = _UxGT("调平热床"); // "Bed leveling"
+ LSTR MSG_LEVEL_BED = _UxGT("调平热床"); // "Level bed"
+ LSTR MSG_BED_TRAMMING = _UxGT("调平边角"); // "Bed Tramming"
+ LSTR MSG_NEXT_CORNER = _UxGT("下个边角"); // "Next corner"
+ LSTR MSG_MESH_EDITOR = _UxGT("网格编辑器");
+ LSTR MSG_EDIT_MESH = _UxGT("编辑网格"); // "Edit Mesh"
+ LSTR MSG_EDITING_STOPPED = _UxGT("网格编辑已停止"); // "Mesh Editing Stopped"
+ LSTR MSG_PROBING_POINT = _UxGT("探测点");
+ LSTR MSG_MESH_X = _UxGT("索引X");
+ LSTR MSG_MESH_Y = _UxGT("索引Y");
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Z 值");
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("定制命令"); // "Custom Commands"
+ LSTR MSG_M48_TEST = _UxGT("M48探测");
+ LSTR MSG_M48_POINT = _UxGT("M48点");
+ LSTR MSG_M48_DEVIATION = _UxGT("M48偏差");
+ LSTR MSG_IDEX_MENU = _UxGT("IDEX模式");
+ LSTR MSG_OFFSETS_MENU = _UxGT("工具偏移量");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("自动停靠");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("复制");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("镜像复制");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("完全控制");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("第二喷头是Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("第二喷头是@");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("执行G29"); // "Doing G29"
+ LSTR MSG_UBL_TOOLS = _UxGT("UBL工具"); // "UBL Tools"
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("统一热床调平(UBL)"); // "Unified Bed Leveling"
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("倾斜點");
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("手工创设网格"); // "Manually Build Mesh"
+ LSTR MSG_UBL_BC_INSERT = _UxGT("放置垫片并测量"); // "Place shim & measure"
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("测量"); // "Measure"
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("移除并测量热床"); // "Remove & measure bed"
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("移动到下一个"); // "Moving to next"
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("激活UBL"); // "Activate UBL"
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("关闭UBL"); // "Deactivate UBL"
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("热床温度"); // "Bed Temp"
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("热床温度");
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("热端温度"); // "Hotend Temp"
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("热端温度");
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("网格编辑"); // "Mesh Edit"
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("编辑客户网格"); // "Edit Custom Mesh"
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("细调网格"); // "Fine Tuning Mesh"
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("完成编辑网格"); // "Done Editing Mesh"
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("创设客户网格"); // "Build Custom Mesh"
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("创设网格"); // "Build Mesh"
+ #if HAS_PREHEAT
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("创设 $ 网格"); // "Build PREHEAT_1_LABEL Mesh"
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("批准 $ 网格"); // "Validate PREHEAT_1_LABEL Mesh"
+ #endif
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("创设冷网格"); // "Build Cold Mesh"
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("调整网格高度"); // "Adjust Mesh Height"
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("高度合计"); // "Height Amount"
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("批准网格"); // "Validate Mesh"
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("批准客户网格"); // "Validate Custom Mesh"
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26加热热床");
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26加热喷嘴");
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("手动填装中...");
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("固定距离填装");
+ LSTR MSG_G26_PRIME_DONE = _UxGT("填装完成");
+ LSTR MSG_G26_CANCELED = _UxGT("G26已取消");
+ LSTR MSG_G26_LEAVING = _UxGT("离开G26");
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("继续热床网格"); // "Continue Bed Mesh"
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("网格调平"); // "Mesh Leveling"
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("三点调平"); // "3-Point Leveling"
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("格子网格调平"); // "Grid Mesh Leveling"
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("调平网格"); // "Level Mesh"
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("边点"); // "Side Points"
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("图类型"); // "Map Type"
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("输出网格图"); // "Output Mesh Map"
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("输出到主机"); // "Output for Host"
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("输出到CSV"); // "Output for CSV"
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("输出到备份"); // "Off Printer Backup"
+ LSTR MSG_UBL_INFO_UBL = _UxGT("输出UBL信息"); // "Output UBL Info"
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("填充合计"); // "Fill-in Amount"
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("手工填充"); // "Manual Fill-in"
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("聪明填充"); // "Smart Fill-in"
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("填充网格"); // "Fill-in Mesh"
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("作废所有的"); // "Invalidate All"
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("作废最近的"); // "Invalidate Closest"
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("细调所有的"); // "Fine Tune All"
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("细调最近的"); // "Fine Tune Closest"
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("网格存储"); // "Mesh Storage"
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("存储槽"); // "Memory Slot"
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("装载热床网格"); // "Load Bed Mesh"
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("保存热床网格"); // "Save Bed Mesh"
+ LSTR MSG_MESH_LOADED = _UxGT("网格 %i 已装载"); // "Mesh %i loaded"
+ LSTR MSG_MESH_SAVED = _UxGT("网格 %i 已保存"); // "Mesh %i saved"
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("没有存储"); // "No storage"
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("错误: UBL保存"); // "Err: UBL Save"
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("错误: UBL还原"); // "Err: UBL Restore"
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Z偏移量: ");
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z偏移已停止"); // "Z-Offset Stopped"
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("一步步UBL"); // "Step-By-Step UBL"
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. 创设冷网格");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2. 聪明填充");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. 批准网格");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. 细调所有的");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. 批准网格");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. 细调所有的");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7. 保存热床网格");
+
+ LSTR MSG_LED_CONTROL = _UxGT("LED控制"); // "LED Control")
+ LSTR MSG_LEDS = _UxGT("灯"); // "Lights")
+ LSTR MSG_LED_PRESETS = _UxGT("灯预置"); // "Light Presets")
+ LSTR MSG_SET_LEDS_RED = _UxGT("红"); // "Red")
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("橙"); // "Orange")
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("黄"); // "Yellow")
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("绿"); // "Green")
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("蓝"); // "Blue")
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("青"); // "Indigo")
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("紫"); // "Violet")
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("白"); // "White")
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("缺省"); // "Default")
+ LSTR MSG_CUSTOM_LEDS = _UxGT("定制灯"); // "Custom Lights")
+ LSTR MSG_INTENSITY_R = _UxGT("红饱和度"); // "Red Intensity")
+ LSTR MSG_INTENSITY_G = _UxGT("绿饱和度"); // "Green Intensity")
+ LSTR MSG_INTENSITY_B = _UxGT("蓝饱和度"); // "Blue Intensity")
+ LSTR MSG_INTENSITY_W = _UxGT("白饱和度"); // "White Intensity")
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("亮度"); // "Brightness")
+
+ LSTR MSG_MOVING = _UxGT("移动..."); // "Moving...")
+ LSTR MSG_FREE_XY = _UxGT("释放 XY"); // "Free XY")
+ LSTR MSG_MOVE_X = _UxGT("移动X"); // "Move X"
+ LSTR MSG_MOVE_Y = _UxGT("移动Y"); // "Move Y"
+ LSTR MSG_MOVE_Z = _UxGT("移动Z"); // "Move Z"
+ LSTR MSG_MOVE_N = _UxGT("移动@"); // "Move @"
+ LSTR MSG_MOVE_E = _UxGT("挤出机"); // "Extruder"
+ LSTR MSG_MOVE_EN = _UxGT("挤出机 *"); // "Extruder"
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("热端太冷");
+ LSTR MSG_MOVE_N_MM = _UxGT("移动 $ mm"); // "Move 0.025mm"
+ LSTR MSG_MOVE_01MM = _UxGT("移动 0.1 mm"); // "Move 0.1mm"
+ LSTR MSG_MOVE_1MM = _UxGT("移动 1 mm"); // "Move 1mm"
+ LSTR MSG_MOVE_10MM = _UxGT("移动 10 mm"); // "Move 10mm"
+ LSTR MSG_MOVE_100MM = _UxGT("移动 100 mm"); // "Move 100mm"
+ LSTR MSG_SPEED = _UxGT("速率"); // "Speed"
+ LSTR MSG_BED_Z = _UxGT("热床Z"); // "Bed Z"
+ LSTR MSG_NOZZLE = _UxGT("喷嘴"); // "Nozzle" 噴嘴
+ LSTR MSG_NOZZLE_N = _UxGT("喷嘴 ~"); // "Nozzle" 噴嘴
+ LSTR MSG_NOZZLE_PARKED = _UxGT("喷嘴已停靠");
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("喷嘴待命中");
+ LSTR MSG_BED = _UxGT("热床"); // "Bed"
+ LSTR MSG_CHAMBER = _UxGT("机箱壳");
+ LSTR MSG_FAN_SPEED = _UxGT("风扇速率"); // "Fan speed"
+ LSTR MSG_FAN_SPEED_N = _UxGT("风扇速率 ~"); // "Fan speed"
+ LSTR MSG_STORED_FAN_N = _UxGT("存储的风扇 ~");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("额外风扇速率"); // "Extra fan speed"
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("额外风扇速率 ~"); // "Extra fan speed"
+ LSTR MSG_CONTROLLER_FAN = _UxGT("控制器风扇");
+ LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("空闲速度");
+ LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("自动模式");
+ LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("工作速度");
+ LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("空闲周期");
+ LSTR MSG_FLOW = _UxGT("挤出速率"); // "Flow"
+ LSTR MSG_FLOW_N = _UxGT("挤出速率 ~"); // "Flow"
+ LSTR MSG_CONTROL = _UxGT("控制"); // "Control"
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" 最小"); // " " LCD_STR_THERMOMETER " Min"
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" 最大"); // " " LCD_STR_THERMOMETER " Max"
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" 因数"); // " " LCD_STR_THERMOMETER " Fact"
+ LSTR MSG_AUTOTEMP = _UxGT("自动控温"); // "Autotemp"
+ LSTR MSG_LCD_ON = _UxGT("开"); // "On"
+ LSTR MSG_LCD_OFF = _UxGT("关"); // "Off"
+ LSTR MSG_PID_AUTOTUNE = _UxGT("自动PID");
+ LSTR MSG_PID_AUTOTUNE_E = _UxGT("自动PID *");
+ LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("PID调整完成");
+ LSTR MSG_PID_BAD_EXTRUDER_NUM = _UxGT("自动调失败! 坏的挤出机");
+ LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("自动调失败! 温度太高");
+ LSTR MSG_PID_TIMEOUT = _UxGT("自动调失败! 超时");
+ LSTR MSG_SELECT = _UxGT("选择"); // "Select"
+ LSTR MSG_SELECT_E = _UxGT("选择 *");
+ LSTR MSG_ACC = _UxGT("加速度"); // "Accel" acceleration
+ LSTR MSG_JERK = _UxGT("抖动速率"); // "Jerk"
+ LSTR MSG_VA_JERK = _UxGT("轴抖动速率") STR_A; // "Va-jerk"
+ LSTR MSG_VB_JERK = _UxGT("轴抖动速率") STR_B; // "Vb-jerk"
+ LSTR MSG_VC_JERK = _UxGT("轴抖动速率") STR_C; // "Vc-jerk"
+ LSTR MSG_VN_JERK = _UxGT("轴抖动速率@"); // "V@-jerk"
+ LSTR MSG_VE_JERK = _UxGT("挤出机抖动速率"); // "Ve-jerk"
+ LSTR MSG_JUNCTION_DEVIATION = _UxGT("接点差");
+ LSTR MSG_MAX_SPEED = _UxGT("速度"); // "Velocity"
+ LSTR MSG_VMAX_A = _UxGT("最大进料速率") STR_A; // "Vmax " max_feedrate_mm_s
+ LSTR MSG_VMAX_B = _UxGT("最大进料速率") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("最大进料速率") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("最大进料速率@");
+ LSTR MSG_VMAX_E = _UxGT("最大进料速率E");
+ LSTR MSG_VMAX_EN = _UxGT("最大进料速率 *");
+ LSTR MSG_VMIN = _UxGT("最小进料速率"); // "Vmin" min_feedrate_mm_s
+ LSTR MSG_VTRAV_MIN = _UxGT("最小移动速率"); // "VTrav min" min_travel_feedrate_mm_s, (target) speed of the move
+ LSTR MSG_ACCELERATION = _UxGT("加速度"); // "Acceleration"
+ LSTR MSG_AMAX_A = _UxGT("最大打印加速度") STR_A; // "Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves
+ LSTR MSG_AMAX_B = _UxGT("最大打印加速度") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("最大打印加速度") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("最大打印加速度@");
+ LSTR MSG_AMAX_E = _UxGT("最大打印加速度E");
+ LSTR MSG_AMAX_EN = _UxGT("最大打印加速度 *");
+ LSTR MSG_A_RETRACT = _UxGT("收进加速度"); // "A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts
+ LSTR MSG_A_TRAVEL = _UxGT("非打印移动加速度"); // "A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves
+ LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("频率最大");
+ LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("进给速度");
+ LSTR MSG_STEPS_PER_MM = _UxGT("轴步数/mm"); // "Steps/mm" axis_steps_per_mm, axis steps-per-unit G92
+ LSTR MSG_A_STEPS = STR_A _UxGT(" 步数/mm"); // "Asteps/mm"
+ LSTR MSG_B_STEPS = STR_B _UxGT(" 步数/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" 步数/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ 步数/mm");
+ LSTR MSG_E_STEPS = _UxGT("E 步数/mm"); // "Esteps/mm"
+ LSTR MSG_EN_STEPS = _UxGT("* 步数/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("温度"); // "Temperature"
+ LSTR MSG_MOTION = _UxGT("运动"); // "Motion"
+ LSTR MSG_FILAMENT = _UxGT("料丝"); // "Filament" menu_advanced_filament
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E 在 mm") SUPERSCRIPT_THREE; // "E in mm3" volumetric_enabled
+ LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("E 限制 在 mm") SUPERSCRIPT_THREE;
+ LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("E 限制 *");
+ LSTR MSG_FILAMENT_DIAM = _UxGT("丝料直径"); // "Fil. Dia."
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("丝料直径 *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("卸载 mm"); // "Unload mm"
+ LSTR MSG_FILAMENT_LOAD = _UxGT("装载 mm"); // "Load mm"
+ LSTR MSG_ADVANCE_K = _UxGT("Advance K");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *");
+ LSTR MSG_CONTRAST = _UxGT("LCD对比度"); // "LCD contrast"
+ LSTR MSG_STORE_EEPROM = _UxGT("保存设置"); // "Store memory"
+ LSTR MSG_LOAD_EEPROM = _UxGT("装载设置"); // "Load memory"
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("恢复安全值"); // "Restore Defaults"
+ LSTR MSG_INIT_EEPROM = _UxGT("初始化设置"); // "Initialize EEPROM"
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC 错误");
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index 错误");
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version 错误");
+ LSTR MSG_SETTINGS_STORED = _UxGT("设置已保存");
+ LSTR MSG_MEDIA_UPDATE = _UxGT("存储器更新");
+ LSTR MSG_RESET_PRINTER = _UxGT("复位打印机");
+ LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("刷新");
+ LSTR MSG_INFO_SCREEN = _UxGT("信息屏"); // "Info screen"
+ LSTR MSG_PREPARE = _UxGT("准备"); // "Prepare"
+ LSTR MSG_TUNE = _UxGT("调整"); // "Tune"
+ LSTR MSG_POWER_MONITOR = _UxGT("电源监控");
+ LSTR MSG_CURRENT = _UxGT("电流");
+ LSTR MSG_VOLTAGE = _UxGT("电压");
+ LSTR MSG_POWER = _UxGT("功率");
+ LSTR MSG_START_PRINT = _UxGT("开始打印");
+ LSTR MSG_BUTTON_NEXT = _UxGT("下一个");
+ LSTR MSG_BUTTON_INIT = _UxGT("初始");
+ LSTR MSG_BUTTON_STOP = _UxGT("停止");
+ LSTR MSG_BUTTON_PRINT = _UxGT("打印");
+ LSTR MSG_BUTTON_RESET = _UxGT("复位");
+ LSTR MSG_BUTTON_IGNORE = _UxGT("忽略");
+ LSTR MSG_BUTTON_CANCEL = _UxGT("取消");
+ LSTR MSG_BUTTON_DONE = _UxGT("完成");
+ LSTR MSG_BUTTON_BACK = _UxGT("返回");
+ LSTR MSG_BUTTON_PROCEED = _UxGT("继续");
+ LSTR MSG_PAUSING = _UxGT("暂停中...");
+ LSTR MSG_PAUSE_PRINT = _UxGT("暂停打印"); // "Pause print"
+ LSTR MSG_RESUME_PRINT = _UxGT("恢复打印"); // "Resume print"
+ LSTR MSG_STOP_PRINT = _UxGT("停止打印"); // "Stop print"
+ LSTR MSG_PRINTING_OBJECT = _UxGT("打印物体");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("取消物体");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("取消物体 =");
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("中断恢复");
+ LSTR MSG_MEDIA_MENU = _UxGT("从存储卡上打印"); // "Print from SD"
+ LSTR MSG_NO_MEDIA = _UxGT("无存储卡"); // "No SD card"
+ LSTR MSG_DWELL = _UxGT("休眠中 ..."); // "Sleep..."
+ LSTR MSG_USERWAIT = _UxGT("点击继续 ..."); // "Click to resume..."
+ LSTR MSG_PRINT_PAUSED = _UxGT("暫停打印"); // "Print paused"
+ LSTR MSG_PRINTING = _UxGT("打印中...");
+ LSTR MSG_PRINT_ABORTED = _UxGT("已取消打印"); // "Print aborted"
+ LSTR MSG_PRINT_DONE = _UxGT("打印已完成");
+ LSTR MSG_NO_MOVE = _UxGT("无移动"); // "No move."
+ LSTR MSG_KILLED = _UxGT("已杀掉"); // "KILLED. "
+ LSTR MSG_STOPPED = _UxGT("已停止"); // "STOPPED. "
+ LSTR MSG_CONTROL_RETRACT = _UxGT("回抽长度mm"); // "Retract mm" retract_length, retract length (positive mm)
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("换手回抽长度mm"); // "Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("回抽速率mm/s"); // "Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s)
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); // "Hop mm" retract_zraise, retract Z-lift
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("回抽恢复长度mm"); // "UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering)
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("换手回抽恢复长度mm"); // "S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change)
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回抽恢复后进料速率mm/s"); // "Unretract V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s)
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V"
+ LSTR MSG_AUTORETRACT = _UxGT("自动抽回"); // "Auto-Retract" autoretract_enabled,
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("交换长度");
+ LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("额外的交换");
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("清洗长度");
+ LSTR MSG_TOOL_CHANGE = _UxGT("换工具");
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z抬起");
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("进给速度");
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("回抽速度");
+ LSTR MSG_FILAMENT_PARK_ENABLED = _UxGT("停靠头");
+ LSTR MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("恢复速度");
+ LSTR MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("风扇速度");
+ LSTR MSG_SINGLENOZZLE_FAN_TIME = _UxGT("风扇时间");
+ LSTR MSG_TOOL_MIGRATION_ON = _UxGT("自动开");
+ LSTR MSG_TOOL_MIGRATION_OFF = _UxGT("自动关");
+ LSTR MSG_TOOL_MIGRATION = _UxGT("工具迁移");
+ LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("自动迁移");
+ LSTR MSG_TOOL_MIGRATION_END = _UxGT("上一个挤出机");
+ LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("迁移至 *");
+ LSTR MSG_FILAMENTCHANGE = _UxGT("更换丝料"); // "Change filament"
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("更换丝料 *"); // "Change filament"
+ LSTR MSG_FILAMENTLOAD = _UxGT("装载丝料"); // "Load filament"
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("装载丝料 *"); // "Load filament"
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("卸载丝料"); // "Unload filament"
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("卸载丝料 *"); // "Unload filament"
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("卸载全部"); // "Unload All"
+ LSTR MSG_ATTACH_MEDIA = _UxGT("初始化存储卡"); // "Init. SD card"
+ LSTR MSG_CHANGE_MEDIA = _UxGT("更换存储卡"); // "Change SD card"
+ LSTR MSG_RELEASE_MEDIA = _UxGT("释放存储卡");
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z探针在热床之外"); // "Z probe out. bed" Z probe is not within the physical limits
+ LSTR MSG_SKEW_FACTOR = _UxGT("偏斜因数"); // "Skew Factor"
+ LSTR MSG_BLTOUCH = _UxGT("BLTouch"); // "BLTouch"
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("自检");
+ LSTR MSG_BLTOUCH_RESET = _UxGT("重置");
+ LSTR MSG_BLTOUCH_STOW = _UxGT("装载");
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("部署");
+ LSTR MSG_BLTOUCH_SW_MODE = _UxGT("SW模式");
+ LSTR MSG_BLTOUCH_5V_MODE = _UxGT("5V模式");
+ LSTR MSG_BLTOUCH_OD_MODE = _UxGT("OD模式");
+ LSTR MSG_BLTOUCH_MODE_STORE = _UxGT("模式保存");
+ LSTR MSG_BLTOUCH_MODE_STORE_5V = _UxGT("设置BLTouch为5V");
+ LSTR MSG_BLTOUCH_MODE_STORE_OD = _UxGT("设置BLTouch为OD");
+ LSTR MSG_BLTOUCH_MODE_ECHO = _UxGT("报告开漏");
+ LSTR MSG_BLTOUCH_MODE_CHANGE = _UxGT("危险: 错误的设置将引起损坏! 是否继续?");
+ LSTR MSG_TOUCHMI_PROBE = _UxGT("TouchMI");
+ LSTR MSG_TOUCHMI_INIT = _UxGT("初始化TouchMI");
+ LSTR MSG_TOUCHMI_ZTEST = _UxGT("Z偏移量测试");
+ LSTR MSG_TOUCHMI_SAVE = _UxGT("保存");
+ LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("部署TouchMI");
+ LSTR MSG_MANUAL_DEPLOY = _UxGT("部署Z探针");
+ LSTR MSG_MANUAL_STOW = _UxGT("收好Z探针");
+ LSTR MSG_HOME_FIRST = _UxGT("归位 %s%s%s 先"); // "Home ... first"
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("探针偏移量");
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("探针X偏移");
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("探针Y偏移");
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("探针Z偏移"); // "Z Offset"
+ LSTR MSG_BABYSTEP_X = _UxGT("微量调整X轴"); // "Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts
+ LSTR MSG_BABYSTEP_Y = _UxGT("微量调整Y轴"); // "Babystep Y"
+ LSTR MSG_BABYSTEP_Z = _UxGT("微量调整Z轴"); // "Babystep Z"
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("总计");
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("挡块终止"); // "Endstop abort"
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("加热失败"); // "Heating failed"
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("错误:冗余温度"); // "Err: REDUNDANT TEMP"
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("温控失控"); // "THERMAL RUNAWAY"
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("热床热量失控");
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("机箱热量失控");
+ LSTR MSG_ERR_MAXTEMP = _UxGT("错误:最高温度"); // "Err: MAXTEMP"
+ LSTR MSG_ERR_MINTEMP = _UxGT("错误:最低温度"); // "Err: MINTEMP"
+ LSTR MSG_HALTED = _UxGT("打印停机"); // "PRINTER HALTED"
+ LSTR MSG_PLEASE_RESET = _UxGT("请重置"); // "Please reset"
+ LSTR MSG_SHORT_DAY = _UxGT("天"); // "d" // One character only
+ LSTR MSG_SHORT_HOUR = _UxGT("时"); // "h" // One character only
+ LSTR MSG_SHORT_MINUTE = _UxGT("分"); // "m" // One character only
+ LSTR MSG_HEATING = _UxGT("加热中 ..."); // "Heating..."
+ LSTR MSG_COOLING = _UxGT("冷却中 ...");
+ LSTR MSG_BED_HEATING = _UxGT("加热热床中 ..."); // "Bed Heating..."
+ LSTR MSG_BED_COOLING = _UxGT("热床冷却中 ...");
+ LSTR MSG_CHAMBER_HEATING = _UxGT("机箱加热中 ...");
+ LSTR MSG_CHAMBER_COOLING = _UxGT("机箱冷却中 ...");
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("⊿校准"); // "Delta Calibration"
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("⊿校准X"); // "Calibrate X"
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("⊿校准Y"); // "Calibrate Y"
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("⊿校准Z"); // "Calibrate Z"
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("⊿校准中心"); // "Calibrate Center"
+ LSTR MSG_DELTA_SETTINGS = _UxGT("⊿设置"); // "Delta Settings"
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("⊿自动校准"); // "Auto Calibration"
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("⊿斜柱"); // "Diag Rod"
+ LSTR MSG_DELTA_HEIGHT = _UxGT("⊿高度"); // "Height"
+ LSTR MSG_DELTA_RADIUS = _UxGT("⊿半径"); // "Radius"
+ LSTR MSG_INFO_MENU = _UxGT("关于打印机"); // "About Printer"
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("打印机信息"); // "Printer Info"
+ LSTR MSG_3POINT_LEVELING = _UxGT("三点调平"); // "3-Point Leveling"
+ LSTR MSG_LINEAR_LEVELING = _UxGT("线性调平"); // "Linear Leveling"
+ LSTR MSG_BILINEAR_LEVELING = _UxGT("双线性调平"); // "Bilinear Leveling"
+ LSTR MSG_UBL_LEVELING = _UxGT("统一热床调平(UBL)"); // "Unified Bed Leveling"
+ LSTR MSG_MESH_LEVELING = _UxGT("网格调平"); // "Mesh Leveling"
+ LSTR MSG_INFO_STATS_MENU = _UxGT("打印机统计"); // "Printer Stats"
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("主板信息"); // "Board Info"
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("温度计"); // "Thermistors"
+ LSTR MSG_INFO_EXTRUDERS = _UxGT("挤出机"); // "Extruders"
+ LSTR MSG_INFO_BAUDRATE = _UxGT("波特率"); // "Baud"
+ LSTR MSG_INFO_PROTOCOL = _UxGT("协议"); // "Protocol"
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("监控温度失控:关");
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("监控温度失控:开");
+ LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("热端空闲超时");
+
+ LSTR MSG_CASE_LIGHT = _UxGT("外壳灯"); // "Case light"
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("灯亮度"); // "Light BRIGHTNESS"
+
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("打印机不正确"); // "The printer is incorrect"
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("打印计数"); // "Print Count"
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("完成了"); // "Completed"
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("总打印时间"); // "Total print time"
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("最长工作时间"); // "Longest job time"
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("总计挤出"); // "Extruded total"
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("打印数"); // "Prints"
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("完成"); // "Completed"
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("总共"); // "Total"
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("最长"); // "Longest"
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("已挤出"); // "Extruded"
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("最低温度"); // "Min Temp"
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("最高温度"); // "Max Temp"
+ LSTR MSG_INFO_PSU = _UxGT("电源供应"); // "Power Supply"
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("驱动力度"); // "Drive Strength"
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ 驱动 %"); // "E Driver %"
+ LSTR MSG_ERROR_TMC = _UxGT("TMC 连接错误");
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("保存驱动设置"); // "DAC EEPROM Write"
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("更换料");
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("打印已暂停"); // "PRINT PAUSED"
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("装载丝料"); // "LOAD FILAMENT"
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("卸载丝料"); // "UNLOAD FILAMENT"
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("恢复选项:"); // "RESUME OPTIONS:"
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("清除更多"); // "Purge more"
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("恢复打印"); // "Resume print"
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" 喷嘴: "); // " Nozzle: "
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("断料传感器");
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("断料距离mm");
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("归原位失败"); // "Homing failed"
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("探针探测失败"); // "Probing failed"
+
+ LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("选择料");
+ LSTR MSG_MMU2_MENU = _UxGT("MMU");
+ LSTR MSG_KILL_MMU2_FIRMWARE = _UxGT("升级MMU固件!");
+ LSTR MSG_MMU2_NOT_RESPONDING = _UxGT("MMU需要专注.");
+ LSTR MSG_MMU2_RESUME = _UxGT("MMU恢复");
+ LSTR MSG_MMU2_RESUMING = _UxGT("MMU恢复中...");
+ LSTR MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU加载");
+ LSTR MSG_MMU2_LOAD_ALL = _UxGT("MMU加载全部");
+ LSTR MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU加载到喷嘴");
+ LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU弹出");
+ LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU弹出 ~");
+ LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU卸载");
+ LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("加载填充. %i...");
+ LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("弹出填充. ...");
+ LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("卸载填充....");
+ LSTR MSG_MMU2_ALL = _UxGT("全部");
+ LSTR MSG_MMU2_FILAMENT_N = _UxGT("料 ~");
+ LSTR MSG_MMU2_RESET = _UxGT("复位MMU");
+ LSTR MSG_MMU2_RESETTING = _UxGT("MMU复位中...");
+ LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("移出, 按下");
+
+ LSTR MSG_MIX = _UxGT("混合");
+ LSTR MSG_MIX_COMPONENT_N = _UxGT("器件 =");
+ LSTR MSG_MIXER = _UxGT("混合器");
+ LSTR MSG_GRADIENT = _UxGT("梯度");
+ LSTR MSG_FULL_GRADIENT = _UxGT("全梯度");
+ LSTR MSG_TOGGLE_MIX = _UxGT("开关混合");
+ LSTR MSG_CYCLE_MIX = _UxGT("循环混合");
+ LSTR MSG_GRADIENT_MIX = _UxGT("梯度混合");
+ LSTR MSG_REVERSE_GRADIENT = _UxGT("反向梯度");
+ LSTR MSG_ACTIVE_VTOOL = _UxGT("激活 V-tool");
+ LSTR MSG_START_VTOOL = _UxGT("开始 V-tool");
+ LSTR MSG_END_VTOOL = _UxGT(" 结束 V-tool");
+ LSTR MSG_GRADIENT_ALIAS = _UxGT("别名 V-tool");
+ LSTR MSG_RESET_VTOOLS = _UxGT("复位 V-tools");
+ LSTR MSG_COMMIT_VTOOL = _UxGT("提交 V-tool Mix");
+ LSTR MSG_VTOOLS_RESET = _UxGT("V-tools 已复位");
+ LSTR MSG_START_Z = _UxGT("开始 Z:");
+ LSTR MSG_END_Z = _UxGT(" 结束 Z:");
+
+ LSTR MSG_GAMES = _UxGT("游戏");
+ LSTR MSG_BRICKOUT = _UxGT("敲方块");
+ LSTR MSG_INVADERS = _UxGT("入侵者");
+ LSTR MSG_SNAKE = _UxGT("贪吃蛇");
+ LSTR MSG_MAZE = _UxGT("迷宫");
+
+ LSTR MSG_BAD_PAGE = _UxGT("错误页面索引");
+ LSTR MSG_BAD_PAGE_SPEED = _UxGT("错误页面速度");
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("按下按钮", "恢复打印"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停靠中..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("等待开始", "丝料", "变更")); // "Wait for start of the filament change"
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("插入料", "并按下", "以继续"));
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("按下按钮来", "加热喷嘴.")); // "Press button to heat nozzle."
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("加热喷嘴", "请等待 ...")); // "Heating nozzle Please wait..."
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("等待", "卸下丝料")); // "Wait for filament unload"
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("等待", "进料")); // "Wait for filament load"
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("等待", "丝料清除")); // "Wait for filament purge"
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("按下已完成", "料的清洗"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("等待打印", "恢复")); // "Wait for print to resume"
+ #else
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("按下继续"));
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停靠中..."));
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("请等待 ...")); // "Please wait..."
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("插入并单击")); // "Insert and Click"
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("按下加热"));
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("加热中 ...")); // "Heating..."
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("退出中 ...")); // "Ejecting..."
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("装载中 ...")); // "Loading..."
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("清除中 ...")); // "Purging..."
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("按下完成"));
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("恢复中 ...")); // "Resuming..."
+ #endif
+ LSTR MSG_TMC_DRIVERS = _UxGT("TMC驱动器");
+ LSTR MSG_TMC_CURRENT = _UxGT("驱动电流");
+ LSTR MSG_TMC_HYBRID_THRS = _UxGT("混合阈值");
+ LSTR MSG_TMC_HOMING_THRS = _UxGT("无感回零");
+ LSTR MSG_TMC_STEPPING_MODE = _UxGT("步进模式");
+ LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop已使能");
+ LSTR MSG_SERVICE_RESET = _UxGT("复位");
+ LSTR MSG_SERVICE_IN = _UxGT(" 在:");
+ LSTR MSG_BACKLASH = _UxGT("回差");
+ LSTR MSG_BACKLASH_CORRECTION = _UxGT("校正");
+ LSTR MSG_BACKLASH_SMOOTHING = _UxGT("平滑的");
+
+ LSTR MSG_LEVEL_X_AXIS = _UxGT("X轴调平");
+ LSTR MSG_AUTO_CALIBRATE = _UxGT("自动校准");
+ LSTR MSG_HEATER_TIMEOUT = _UxGT("加热器超时");
+ LSTR MSG_REHEAT = _UxGT("重新加热");
+ LSTR MSG_REHEATING = _UxGT("重新加热中...");
+}
+
+#if FAN_COUNT == 1
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED
+#else
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N
+#endif
diff --git a/src/lcd/language/language_zh_TW.h b/src/lcd/language/language_zh_TW.h
new file mode 100644
index 0000000..4eba832
--- /dev/null
+++ b/src/lcd/language/language_zh_TW.h
@@ -0,0 +1,501 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * Traditional Chinese
+ *
+ * LCD Menu Messages
+ * See also https://marlinfw.org/docs/development/lcd_language.html
+ */
+namespace Language_zh_TW {
+ using namespace Language_en; // Inherit undefined strings from English
+
+ constexpr uint8_t CHARSIZE = 3;
+ LSTR LANGUAGE = _UxGT("Traditional Chinese");
+
+ LSTR WELCOME_MSG = MACHINE_NAME _UxGT("已就緒."); // " ready."
+ LSTR MSG_YES = _UxGT("是"); // "YES"
+ LSTR MSG_NO = _UxGT("否"); // "NO"
+ LSTR MSG_BACK = _UxGT("返回"); // "Back"
+ LSTR MSG_MEDIA_ABORTING = _UxGT("正在中止..."); // "Aborting..."
+ LSTR MSG_MEDIA_INSERTED = _UxGT("記憶卡已插入"); // "Card inserted"
+ LSTR MSG_MEDIA_REMOVED = _UxGT("記憶卡被拔出"); // "Card removed"
+ LSTR MSG_MEDIA_WAITING = _UxGT("等待記憶卡"); // "Waiting for media"
+ LSTR MSG_MEDIA_READ_ERROR = _UxGT("記憶卡讀取錯誤"); //"Media read error"
+ LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB裝置已移除"); // "USB device removed"
+ LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB啟動失敗"); // "USB start failed"
+ LSTR MSG_LCD_ENDSTOPS = _UxGT("擋塊"); // "Endstops" // Max length 8 characters
+ LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("軟體擋塊"); // "Soft Endstops"
+ LSTR MSG_MAIN = _UxGT("主選單"); // "Main"
+ LSTR MSG_ADVANCED_SETTINGS = _UxGT("進階設置"); // "Advanced Settings"
+ LSTR MSG_CONFIGURATION = _UxGT("設置"); //Configuration
+ LSTR MSG_RUN_AUTO_FILES = _UxGT("自動開始"); // "Autostart"
+ LSTR MSG_DISABLE_STEPPERS = _UxGT("關閉步進馬達"); // "Disable steppers"
+ LSTR MSG_DEBUG_MENU = _UxGT("除錯選單"); // "Debug Menu"
+ LSTR MSG_PROGRESS_BAR_TEST = _UxGT("進度條測試"); // "Progress Bar Test"
+ LSTR MSG_AUTO_HOME = _UxGT("自動回原點"); // "Auto home"
+ LSTR MSG_AUTO_HOME_X = _UxGT("回X原點"); // "Home X"
+ LSTR MSG_AUTO_HOME_Y = _UxGT("回Y原點"); // "Home Y"
+ LSTR MSG_AUTO_HOME_Z = _UxGT("回Z原點"); // "Home Z"
+ LSTR MSG_AUTO_Z_ALIGN = _UxGT("自動Z對齊"); // "Auto Z-Align"
+ LSTR MSG_LEVEL_BED_HOMING = _UxGT("平台調平XYZ歸原點"); // "Homing XYZ"
+ LSTR MSG_LEVEL_BED_WAITING = _UxGT("單擊開始熱床調平"); // "Click to Begin"
+ LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("下個熱床調平點"); // "Next Point"
+ LSTR MSG_LEVEL_BED_DONE = _UxGT("完成熱床調平"); // "Leveling Done!"
+ LSTR MSG_Z_FADE_HEIGHT = _UxGT("淡出高度"); // "Fade Height"
+ LSTR MSG_SET_HOME_OFFSETS = _UxGT("設置原點偏移"); // "Set home offsets"
+ LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("偏移已啟用"); // "Offsets applied"
+ #if HAS_PREHEAT
+ LSTR MSG_PREHEAT_1 = _UxGT("預熱 ") PREHEAT_1_LABEL; // "Preheat PREHEAT_1_LABEL"
+ LSTR MSG_PREHEAT_1_H = _UxGT("預熱 ") PREHEAT_1_LABEL " ~"; // "Preheat PREHEAT_1_LABEL"
+ LSTR MSG_PREHEAT_1_END = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴"); //MSG_PREHEAT_1 " "
+ LSTR MSG_PREHEAT_1_END_E = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴 ~"); //MSG_PREHEAT_1 " "
+ LSTR MSG_PREHEAT_1_ALL = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All"
+ LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 熱床"); //MSG_PREHEAT_1 " Bed"
+ LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 設置"); //MSG_PREHEAT_1 " conf"
+
+ LSTR MSG_PREHEAT_M = _UxGT("預熱 $"); // "Preheat PREHEAT_1_LABEL"
+ LSTR MSG_PREHEAT_M_H = _UxGT("預熱 $ ~"); // "Preheat PREHEAT_1_LABEL"
+ LSTR MSG_PREHEAT_M_END = _UxGT("預熱 $ 噴嘴"); //MSG_PREHEAT_1 " "
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("預熱 $ 噴嘴 ~"); //MSG_PREHEAT_1 " "
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("預熱 $ 全部"); //MSG_PREHEAT_1 " All"
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("預熱 $ 熱床"); //MSG_PREHEAT_1 " Bed"
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("預熱 $ 設置"); //MSG_PREHEAT_1 " conf"
+ #endif
+ LSTR MSG_PREHEAT_CUSTOM = _UxGT("自定預熱"); // "Preheat Custom"
+ LSTR MSG_COOLDOWN = _UxGT("降溫"); // "Cooldown"
+ LSTR MSG_LASER_MENU = _UxGT("激光控制"); // "Laser Control"
+ LSTR MSG_LASER_POWER = _UxGT("激光電源"); // "Laser Power"
+ LSTR MSG_SPINDLE_MENU = _UxGT("主軸控告制"); // "Spindle Control"
+ LSTR MSG_SPINDLE_POWER = _UxGT("主軸電源"); // "Spindle Power"
+ LSTR MSG_SPINDLE_REVERSE = _UxGT("主軸反轉"); // "Spindle Reverse"
+ LSTR MSG_SWITCH_PS_ON = _UxGT("電源打開"); // "Switch power on"
+ LSTR MSG_SWITCH_PS_OFF = _UxGT("電源關閉"); // "Switch power off"
+ LSTR MSG_EXTRUDE = _UxGT("擠出"); // "Extrude"
+ LSTR MSG_RETRACT = _UxGT("回縮"); // "Retract"
+ LSTR MSG_MOVE_AXIS = _UxGT("移動軸"); // "Move axis"
+ LSTR MSG_BED_LEVELING = _UxGT("調平熱床"); // "Bed leveling"
+ LSTR MSG_LEVEL_BED = _UxGT("調平熱床"); // "Level bed"
+ LSTR MSG_BED_TRAMMING = _UxGT("調平邊角"); // "Bed Tramming"
+ LSTR MSG_NEXT_CORNER = _UxGT("下個邊角"); // "Next corner"
+ LSTR MSG_MESH_EDITOR = _UxGT("網格編輯器"); // "Mesh Editor"
+ LSTR MSG_EDIT_MESH = _UxGT("編輯網格"); // "Edit Mesh"
+ LSTR MSG_EDITING_STOPPED = _UxGT("網格編輯已停止"); // "Mesh Editing Stopped"
+ LSTR MSG_PROBING_POINT = _UxGT("探測點"); // "Probing Point"
+ LSTR MSG_MESH_X = _UxGT("索引 X"); // "Index X"
+ LSTR MSG_MESH_Y = _UxGT("索引 Y"); // "Index Y"
+ LSTR MSG_MESH_EDIT_Z = _UxGT("Z 值"); // "Z Value"
+ LSTR MSG_CUSTOM_COMMANDS = _UxGT("自定命令"); // "Custom Commands"
+ LSTR MSG_M48_TEST = _UxGT("M48 探測測試"); // "M48 Probe Test"
+ LSTR MSG_M48_POINT = _UxGT("M48 探測點"); // "M48 Point"
+ LSTR MSG_M48_DEVIATION = _UxGT("偏差"); // "Deviation"
+ LSTR MSG_IDEX_MENU = _UxGT("IDEX Mode");
+ LSTR MSG_OFFSETS_MENU = _UxGT("Tool Offsets");
+ LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park");
+ LSTR MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplication");
+ LSTR MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Mirrored Copy");
+ LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Full Control");
+ LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2nd Nozzle Z");
+ LSTR MSG_HOTEND_OFFSET_A = _UxGT("2nd Nozzle @");
+ LSTR MSG_UBL_DOING_G29 = _UxGT("執行G29"); // "Doing G29"
+ LSTR MSG_UBL_TOOLS = _UxGT("UBL工具"); // "UBL Tools"
+ LSTR MSG_UBL_LEVEL_BED = _UxGT("統一熱床調平(UBL)"); // "Unified Bed Leveling"
+ LSTR MSG_LCD_TILTING_MESH = _UxGT("傾斜點"); // "Tilting Point"
+ LSTR MSG_UBL_MANUAL_MESH = _UxGT("手工建網"); // "Manually Build Mesh"
+ LSTR MSG_UBL_BC_INSERT = _UxGT("放置墊片並測量"); // "Place shim & measure"
+ LSTR MSG_UBL_BC_INSERT2 = _UxGT("測量"); // "Measure"
+ LSTR MSG_UBL_BC_REMOVE = _UxGT("移除並測量熱床"); // "Remove & measure bed"
+ LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("移動到下一個"); // "Moving to next"
+ LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("啟動UBL"); // "Activate UBL"
+ LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("關閉UBL"); // "Deactivate UBL"
+ LSTR MSG_UBL_SET_TEMP_BED = _UxGT("置設熱床溫度"); // "Bed Temp"
+ LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("置設熱床溫度"); // "Bed Temp")
+ LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("置設噴嘴溫度"); // "Hotend Temp"
+ LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("熱端溫度"); // "Hotend Temp"
+ LSTR MSG_UBL_MESH_EDIT = _UxGT("網格編輯"); // "Mesh Edit"
+ LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("編輯客戶網格"); // "Edit Custom Mesh"
+ LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("細調網格"); // "Fine Tuning Mesh"
+ LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("完成編輯網格"); // "Done Editing Mesh"
+ LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("創設客戶網格"); // "Build Custom Mesh"
+ LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("創設網格"); // "Build Mesh"
+ #if HAS_PREHEAT
+ LSTR MSG_UBL_BUILD_MESH_M = _UxGT("創設 $ 網格"); // "Build PREHEAT_1_LABEL Mesh"
+ LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("批准 $ 網格"); // "Validate PREHEAT_1_LABEL Mesh"
+ #endif
+ LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("創設冷網格"); // "Build Cold Mesh"
+ LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("調整網格高度"); // "Adjust Mesh Height"
+ LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("高度合計"); // "Height Amount"
+ LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("批准網格"); // "Validate Mesh"
+ LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("批准客戶網格"); // "Validate Custom Mesh"
+ LSTR MSG_G26_HEATING_BED = _UxGT("G26 加熱熱床"); // "G26 Heating Bed"
+ LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 加熱噴嘴"); //"G26 Heating Nozzle"
+ LSTR MSG_G26_MANUAL_PRIME = _UxGT("手動填裝"); // "Manual priming..."
+ LSTR MSG_G26_FIXED_LENGTH = _UxGT("固定距離填裝"); // "Fixed Length Prime"
+ LSTR MSG_G26_PRIME_DONE = _UxGT("完成填裝"); // "Done Priming"
+ LSTR MSG_G26_CANCELED = _UxGT("G26已取消"); // "G26 Canceled"
+ LSTR MSG_G26_LEAVING = _UxGT("離開 G26"); // "Leaving G26"
+ LSTR MSG_UBL_CONTINUE_MESH = _UxGT("繼續熱床網格"); // "Continue Bed Mesh"
+ LSTR MSG_UBL_MESH_LEVELING = _UxGT("網格調平"); // "Mesh Leveling"
+ LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("三點調平"); // "3-Point Leveling"
+ LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("格子網格調平"); // "Grid Mesh Leveling"
+ LSTR MSG_UBL_MESH_LEVEL = _UxGT("調平網格"); // "Level Mesh"
+ LSTR MSG_UBL_SIDE_POINTS = _UxGT("邊點"); // "Side Points"
+ LSTR MSG_UBL_MAP_TYPE = _UxGT("圖類型"); // "Map Type"
+ LSTR MSG_UBL_OUTPUT_MAP = _UxGT("輸出網格圖"); // "Output Mesh Map"
+ LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("輸出到主機"); // "Output for Host"
+ LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("輸出到CSV"); // "Output for CSV"
+ LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("輸出到備份"); // "Off Printer Backup"
+ LSTR MSG_UBL_INFO_UBL = _UxGT("輸出UBL信息"); // "Output UBL Info"
+ LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("填充合計"); // "Fill-in Amount"
+ LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("手工填充"); // "Manual Fill-in"
+ LSTR MSG_UBL_SMART_FILLIN = _UxGT("聰明填充"); // "Smart Fill-in"
+ LSTR MSG_UBL_FILLIN_MESH = _UxGT("填充網格"); // "Fill-in Mesh"
+ LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("作廢所有的"); // "Invalidate All"
+ LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("作廢最近的"); // "Invalidate Closest"
+ LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("細調所有的"); // "Fine Tune All"
+ LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("細調最近的"); // "Fine Tune Closest"
+ LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("網格存儲"); // "Mesh Storage"
+ LSTR MSG_UBL_STORAGE_SLOT = _UxGT("存儲槽"); // "Memory Slot"
+ LSTR MSG_UBL_LOAD_MESH = _UxGT("裝載熱床網格"); // "Load Bed Mesh"
+ LSTR MSG_UBL_SAVE_MESH = _UxGT("保存熱床網格"); // "Save Bed Mesh"
+ LSTR MSG_MESH_LOADED = _UxGT("網格 %i 已裝載"); // "Mesh %i loaded"
+ LSTR MSG_MESH_SAVED = _UxGT("網格 %i 已保存"); // "Mesh %i saved"
+ LSTR MSG_UBL_NO_STORAGE = _UxGT("沒有存儲"); // "No storage"
+ LSTR MSG_UBL_SAVE_ERROR = _UxGT("錯誤: UBL保存"); // "Err: UBL Save"
+ LSTR MSG_UBL_RESTORE_ERROR = _UxGT("錯誤: UBL還原"); // "Err: UBL Restore"
+ LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-偏移:"); // "Z-Offset: "
+ LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z偏移已停止"); // "Z-Offset Stopped"
+ LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("一步步UBL"); // "Step-By-Step UBL"
+ LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. 創設冷網格");
+ LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2. 聰明填充");
+ LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. 批准網格");
+ LSTR MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. 細調所有的");
+ LSTR MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. 批准網格");
+ LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. 細調所有的");
+ LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7. 保存熱床網格");
+
+ LSTR MSG_LED_CONTROL = _UxGT("燈管控制"); // "LED Control")
+ LSTR MSG_LEDS = _UxGT("燈"); // "Lights")
+ LSTR MSG_LED_PRESETS = _UxGT("燈預置"); // "Light Presets")
+ LSTR MSG_SET_LEDS_RED = _UxGT("红"); // "Red")
+ LSTR MSG_SET_LEDS_ORANGE = _UxGT("橙"); // "Orange")
+ LSTR MSG_SET_LEDS_YELLOW = _UxGT("黃"); // "Yellow")
+ LSTR MSG_SET_LEDS_GREEN = _UxGT("綠"); // "Green")
+ LSTR MSG_SET_LEDS_BLUE = _UxGT("藍"); // "Blue")
+ LSTR MSG_SET_LEDS_INDIGO = _UxGT("青"); // "Indigo")
+ LSTR MSG_SET_LEDS_VIOLET = _UxGT("紫"); // "Violet")
+ LSTR MSG_SET_LEDS_WHITE = _UxGT("白"); // "White")
+ LSTR MSG_SET_LEDS_DEFAULT = _UxGT("復歸"); // "Default")
+ LSTR MSG_CUSTOM_LEDS = _UxGT("定制燈"); // "Custom Lights")
+ LSTR MSG_INTENSITY_R = _UxGT("紅飽和度"); // "Red Intensity")
+ LSTR MSG_INTENSITY_G = _UxGT("綠飽和度"); // "Green Intensity")
+ LSTR MSG_INTENSITY_B = _UxGT("藍飽和度"); // "Blue Intensity")
+ LSTR MSG_INTENSITY_W = _UxGT("白飽和度"); // "White Intensity")
+ LSTR MSG_LED_BRIGHTNESS = _UxGT("亮度"); // "Brightness")
+
+ LSTR MSG_MOVING = _UxGT("移動 ..."); // "Moving...")
+ LSTR MSG_FREE_XY = _UxGT("釋放 XY"); // "Free XY")
+ LSTR MSG_MOVE_X = _UxGT("移動X"); // "Move X"
+ LSTR MSG_MOVE_Y = _UxGT("移動Y"); // "Move Y"
+ LSTR MSG_MOVE_Z = _UxGT("移動Z"); // "Move Z"
+ LSTR MSG_MOVE_N = _UxGT("移動Q"); // "Move @"
+ LSTR MSG_MOVE_E = _UxGT("擠出機"); // "Extruder"
+ LSTR MSG_MOVE_EN = _UxGT("擠出機 *"); // "Extruder *"
+ LSTR MSG_HOTEND_TOO_COLD = _UxGT("噴嘴溫度不夠"); // "Hotend too cold"
+ LSTR MSG_MOVE_N_MM = _UxGT("移動 $ mm"); // "Move 0.025mm"
+ LSTR MSG_MOVE_01MM = _UxGT("移動 0.1 mm"); // "Move 0.1mm"
+ LSTR MSG_MOVE_1MM = _UxGT("移動 1 mm"); // "Move 1mm"
+ LSTR MSG_MOVE_10MM = _UxGT("移動 10 mm"); // "Move 10mm"
+ LSTR MSG_MOVE_100MM = _UxGT("移動 100 mm"); // "Move 100mm"
+ LSTR MSG_SPEED = _UxGT("速率"); // "Speed"
+ LSTR MSG_BED_Z = _UxGT("熱床Z"); // "Bed Z"
+ LSTR MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴"); // "Nozzle" 噴嘴
+ LSTR MSG_NOZZLE_N = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴 ~");
+ LSTR MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" 熱床"); // "Bed"
+ LSTR MSG_CHAMBER = _UxGT("Enclosure");
+ LSTR MSG_FAN_SPEED = _UxGT("風扇速率"); // "Fan speed"
+ LSTR MSG_FAN_SPEED_N = _UxGT("風扇速率 =");
+ LSTR MSG_STORED_FAN_N = _UxGT("Stored Fan =");
+ LSTR MSG_EXTRA_FAN_SPEED = _UxGT("額外風扇速率"); // "Extra fan speed"
+ LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("額外風扇速率 =");
+ LSTR MSG_FLOW = _UxGT("擠出速率");
+ LSTR MSG_FLOW_N = _UxGT("擠出速率 ~"); // "Flow"
+ LSTR MSG_CONTROL = _UxGT("控制"); // "Control"
+ LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" 最小"); // " " LCD_STR_THERMOMETER " Min"
+ LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" 最大"); // " " LCD_STR_THERMOMETER " Max"
+ LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" 系數"); // " " LCD_STR_THERMOMETER " Fact"
+ LSTR MSG_AUTOTEMP = _UxGT("自動控溫"); // "Autotemp"
+ LSTR MSG_LCD_ON = _UxGT("開 "); // "On"
+ LSTR MSG_LCD_OFF = _UxGT("關 "); // "Off"
+
+ LSTR MSG_SELECT = _UxGT("選擇"); // "Select"
+ LSTR MSG_SELECT_E = _UxGT("選擇 *");
+ LSTR MSG_ACC = _UxGT("加速度"); // "Accel" acceleration
+ LSTR MSG_JERK = _UxGT("抖動速率"); // "Jerk"
+ LSTR MSG_VA_JERK = _UxGT("軸抖動速率") STR_A; // "Va-jerk"
+ LSTR MSG_VB_JERK = _UxGT("軸抖動速率") STR_B;
+ LSTR MSG_VC_JERK = _UxGT("軸抖動速率") STR_C;
+ LSTR MSG_VN_JERK = _UxGT("軸抖動速率@");
+ LSTR MSG_VE_JERK = _UxGT("擠出機抖動速率");
+
+ LSTR MSG_MAX_SPEED = _UxGT("速度"); // "Velocity"
+ LSTR MSG_VMAX_A = _UxGT("最大進料速率") STR_A; // "Vmax " max_feedrate_mm_s
+ LSTR MSG_VMAX_B = _UxGT("最大進料速率") STR_B;
+ LSTR MSG_VMAX_C = _UxGT("最大進料速率") STR_C;
+ LSTR MSG_VMAX_N = _UxGT("最大進料速率@");
+ LSTR MSG_VMAX_E = _UxGT("最大進料速率E");
+ LSTR MSG_VMAX_EN = _UxGT("最大進料速率 *"); // "Vmax " max_feedrate_mm_s
+ LSTR MSG_VMIN = _UxGT("最小進料速率"); // "Vmin" min_feedrate_mm_s
+ LSTR MSG_VTRAV_MIN = _UxGT("最小移動速率"); // "VTrav min" min_travel_feedrate_mm_s, (target) speed of the move
+ LSTR MSG_ACCELERATION = _UxGT("加速度"); // "Acceleration"
+ LSTR MSG_AMAX_A = _UxGT("最大列印加速度") STR_A; // "Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves
+ LSTR MSG_AMAX_B = _UxGT("最大列印加速度") STR_B;
+ LSTR MSG_AMAX_C = _UxGT("最大列印加速度") STR_C;
+ LSTR MSG_AMAX_N = _UxGT("最大列印加速度@");
+ LSTR MSG_AMAX_E = _UxGT("最大列印加速度E");
+ LSTR MSG_AMAX_EN = _UxGT("最大列印加速度 *"); // "Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves
+ LSTR MSG_A_RETRACT = _UxGT("回縮加速度"); // "A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts
+ LSTR MSG_A_TRAVEL = _UxGT("非列印移動加速度"); // "A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves
+ LSTR MSG_STEPS_PER_MM = _UxGT("軸步數/mm"); // "Steps/mm" axis_steps_per_mm, axis steps-per-unit G92
+ LSTR MSG_A_STEPS = STR_A _UxGT(" 軸步數/mm"); // "Asteps/mm" axis_steps_per_mm, axis steps-per-unit G92
+ LSTR MSG_B_STEPS = STR_B _UxGT(" 軸步數/mm");
+ LSTR MSG_C_STEPS = STR_C _UxGT(" 軸步數/mm");
+ LSTR MSG_N_STEPS = _UxGT("@ 軸步數/mm");
+ LSTR MSG_E_STEPS = _UxGT("擠出機步數/mm"); // "Esteps/mm"
+ LSTR MSG_EN_STEPS = _UxGT("擠出機~步數/mm");
+ LSTR MSG_TEMPERATURE = _UxGT("溫度"); // "Temperature"
+ LSTR MSG_MOTION = _UxGT("運作"); // "Motion"
+ LSTR MSG_FILAMENT = _UxGT("絲料測容"); // "Filament" menu_control_volumetric
+ LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("測容積mm") SUPERSCRIPT_THREE; // "E in mm3" volumetric_enabled
+ LSTR MSG_FILAMENT_DIAM = _UxGT("絲料直徑"); // "Fil. Dia."
+ LSTR MSG_FILAMENT_DIAM_E = _UxGT("絲料直徑 *");
+ LSTR MSG_FILAMENT_UNLOAD = _UxGT("卸載 mm"); // "Unload mm"
+ LSTR MSG_FILAMENT_LOAD = _UxGT("装載 mm"); // "Load mm"
+ LSTR MSG_ADVANCE_K = _UxGT("Advance K");
+ LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *");
+ LSTR MSG_CONTRAST = _UxGT("LCD對比度"); // "LCD contrast"
+ LSTR MSG_STORE_EEPROM = _UxGT("保存設置"); // "Store memory"
+ LSTR MSG_LOAD_EEPROM = _UxGT("載入設置"); // "Load memory"
+ LSTR MSG_RESTORE_DEFAULTS = _UxGT("恢復安全值"); // "Restore failsafe"
+ LSTR MSG_INIT_EEPROM = _UxGT("初始化設置"); // "Initialize EEPROM"
+ LSTR MSG_ERR_EEPROM_CRC = _UxGT("錯誤: EEPROM CRC"); // "Err: EEPROM CRC"
+ LSTR MSG_ERR_EEPROM_INDEX = _UxGT("錯誤: EEPROM Index"); // "Err: EEPROM Index"
+ LSTR MSG_ERR_EEPROM_VERSION = _UxGT("錯誤: EEPROM Version"); // "EEPROM Version"
+ LSTR MSG_MEDIA_UPDATE = _UxGT("媒體更新"); // "Media Update"
+ LSTR MSG_RESET_PRINTER = _UxGT("重置打印機"); // "Reset Printer
+ LSTR MSG_REFRESH = _UxGT("刷新"); // "Refresh"
+ LSTR MSG_INFO_SCREEN = _UxGT("資訊界面"); // "Info screen"
+ LSTR MSG_PREPARE = _UxGT("準備"); // "Prepare"
+ LSTR MSG_TUNE = _UxGT("調整"); // "Tune"
+ LSTR MSG_START_PRINT = _UxGT("開始列印"); // "Start Print"
+ LSTR MSG_BUTTON_NEXT = _UxGT("下一個"); // "Next"
+ LSTR MSG_BUTTON_INIT = _UxGT("初始 "); // "Init"
+ LSTR MSG_BUTTON_STOP = _UxGT("停止 "); // "Stop"
+ LSTR MSG_BUTTON_PRINT = _UxGT("列印 "); // "Print"
+ LSTR MSG_BUTTON_RESET = _UxGT("復歸 "); // "Reset"
+ LSTR MSG_BUTTON_CANCEL = _UxGT("放棄 "); // "Cancel"
+ LSTR MSG_BUTTON_DONE = _UxGT("確認 "); // "Done"
+ LSTR MSG_BUTTON_BACK = _UxGT("返回 "); // "Back"
+ LSTR MSG_BUTTON_PROCEED = _UxGT("繼續 "); // "Proceed"
+ LSTR MSG_PAUSE_PRINT = _UxGT("暫停列印"); // "Pause print"
+ LSTR MSG_RESUME_PRINT = _UxGT("恢復列印"); // "Resume print"
+ LSTR MSG_STOP_PRINT = _UxGT("停止列印"); // "Stop print"
+ LSTR MSG_PRINTING_OBJECT = _UxGT("列印物件"); // "Printing Object"
+ LSTR MSG_CANCEL_OBJECT = _UxGT("中止物件"); // "Cancel Object"
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("中止物件 ="); // "Cancel Object ="
+ LSTR MSG_OUTAGE_RECOVERY = _UxGT("中斷恢復"); // "Outage Recovery"
+ LSTR MSG_MEDIA_MENU = _UxGT("從記憶卡上列印"); // "Print from SD"
+ LSTR MSG_NO_MEDIA = _UxGT("無記憶卡"); // "No SD card"
+ LSTR MSG_DWELL = _UxGT("休眠 ..."); // "Sleep..."
+ LSTR MSG_USERWAIT = _UxGT("點擊繼續 ..."); // "Click to resume..."
+ LSTR MSG_PRINT_PAUSED = _UxGT("列印已暫停"); // "Print paused"
+ LSTR MSG_PRINTING = _UxGT("列印中 ..."); // "Printing..."
+ LSTR MSG_PRINT_ABORTED = _UxGT("已取消列印"); // "Print aborted"
+ LSTR MSG_NO_MOVE = _UxGT("無移動"); // "No move."
+ LSTR MSG_KILLED = _UxGT("已砍掉"); // "KILLED. "
+ LSTR MSG_STOPPED = _UxGT("已停止"); // "STOPPED. "
+ LSTR MSG_CONTROL_RETRACT = _UxGT("回縮長度mm"); // "Retract mm" retract_length, retract length (positive mm)
+ LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("換手回抽長度mm"); // "Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change
+ LSTR MSG_CONTROL_RETRACTF = _UxGT("回縮速率mm/s"); // "Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s)
+ LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); // "Hop mm" retract_zraise, retract Z-lift
+ LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("回縮恢復長度mm"); // "UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering)
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("換手回縮恢復長度mm"); // "S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change)
+ LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回縮恢復後進料速率mm/s"); // "Unretract V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s)
+ LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V"
+ LSTR MSG_AUTORETRACT = _UxGT("自動回縮"); // "Auto-Retract" autoretract_enabled,
+ LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("交換長度"); // "Swap Length"
+ LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("清除長度"); // "Purge Length"
+ LSTR MSG_TOOL_CHANGE = _UxGT("交換工具"); //"Tool Change"
+ LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z軸提昇"); // "Z Raise"
+ LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("最高速度"); // "Prime Speed"
+ LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("收回速度"); // "Retract Speed"
+ LSTR MSG_NOZZLE_STANDBY = _UxGT("噴嘴待機"); //"Nozzle Standby"
+ LSTR MSG_FILAMENTCHANGE = _UxGT("更換絲料"); // "Change filament"
+ LSTR MSG_FILAMENTCHANGE_E = _UxGT("更換絲料 *");
+ LSTR MSG_FILAMENTLOAD = _UxGT("裝載絲料"); // "Load filament"
+ LSTR MSG_FILAMENTLOAD_E = _UxGT("裝載絲料 *");
+ LSTR MSG_FILAMENTUNLOAD = _UxGT("卸載絲料"); // "Unload filament"
+ LSTR MSG_FILAMENTUNLOAD_E = _UxGT("卸載絲料 *"); // "Unload filament"
+ LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("卸載全部"); // "Unload All"
+ LSTR MSG_INIT_MEDIA = _UxGT("初始化記憶卡"); // "Init. SD card"
+ LSTR MSG_ATTACH_MEDIA = _UxGT("連接記憶卡"); // "Attach Media
+ LSTR MSG_CHANGE_MEDIA = _UxGT("更換記憶卡"); // "Change SD card"
+ LSTR MSG_RELEASE_MEDIA = _UxGT("釋放媒體"); // "Release Media"
+ LSTR MSG_ZPROBE_OUT = _UxGT("Z探針在熱床之外"); // "Z probe out. bed" Z probe is not within the physical limits
+ LSTR MSG_SKEW_FACTOR = _UxGT("偏斜因數"); // "Skew Factor"
+
+ LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch 自檢"); // "BLTouch Self-Test"
+ LSTR MSG_BLTOUCH_RESET = _UxGT("重置BLTouch"); // "Reset BLTouch"
+ LSTR MSG_BLTOUCH_STOW = _UxGT("裝載BLTouch"); // "Stow BLTouch"
+ LSTR MSG_BLTOUCH_DEPLOY = _UxGT("部署BLTouch"); // "Deploy BLTouch"
+
+ LSTR MSG_HOME_FIRST = _UxGT("歸位 %s%s%s 先"); // "Home ... first"
+ LSTR MSG_ZPROBE_OFFSETS = _UxGT("探針偏移"); //Probe Offsets
+ LSTR MSG_ZPROBE_XOFFSET = _UxGT("探針X偏移量"); //Probe X Offset
+ LSTR MSG_ZPROBE_YOFFSET = _UxGT("探針Y偏移量"); //Probe Y Offset
+ LSTR MSG_ZPROBE_ZOFFSET = _UxGT("探針Z偏移量"); //Probe Z Offset
+ LSTR MSG_BABYSTEP_X = _UxGT("微量調整X軸"); // "Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts
+ LSTR MSG_BABYSTEP_Y = _UxGT("微量調整Y軸"); // "Babystep Y"
+ LSTR MSG_BABYSTEP_Z = _UxGT("微量調整Z軸"); // "Babystep Z"
+ LSTR MSG_BABYSTEP_TOTAL = _UxGT("總計"); // "Total"
+ LSTR MSG_ENDSTOP_ABORT = _UxGT("擋塊終止"); // "Endstop abort"
+ LSTR MSG_HEATING_FAILED_LCD = _UxGT("加熱失敗"); // "Heating failed"
+ LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("錯誤:冗餘溫度"); // "Err: REDUNDANT TEMP"
+ LSTR MSG_THERMAL_RUNAWAY = _UxGT("溫度失控"); // "THERMAL RUNAWAY"
+ LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("熱床溫度失控"); // "BED THERMAL RUNAWAY"
+ LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("機箱溫度失控"); // "CHAMBER T. RUNAWAY"
+ LSTR MSG_ERR_MAXTEMP = _UxGT("錯誤:最高溫度"); // "Err: MAXTEMP"
+ LSTR MSG_ERR_MINTEMP = _UxGT("錯誤:最低溫度"); // "Err: MINTEMP"
+ LSTR MSG_HALTED = _UxGT("印表機停機"); // "PRINTER HALTED"
+ LSTR MSG_PLEASE_RESET = _UxGT("請重置"); // "Please reset"
+ LSTR MSG_SHORT_DAY = _UxGT("天"); // "d" // One character only
+ LSTR MSG_SHORT_HOUR = _UxGT("時"); // "h" // One character only
+ LSTR MSG_SHORT_MINUTE = _UxGT("分"); // "m" // One character only
+ LSTR MSG_HEATING = _UxGT("加熱中 ..."); // "Heating..."
+ LSTR MSG_COOLING = _UxGT("冷卻中 ..."); // "Cooling..."
+ LSTR MSG_BED_HEATING = _UxGT("加熱熱床中 ..."); // "Bed Heating..."
+ LSTR MSG_BED_COOLING = _UxGT("熱床冷卻中 ..."); // "Bed Cooling..."
+ LSTR MSG_CHAMBER_HEATING = _UxGT("機箱加熱中 .."); // "Chamber Heating..."
+ LSTR MSG_CHAMBER_COOLING = _UxGT("機箱冷卻中 ..."); //Chamber Cooling...
+ LSTR MSG_DELTA_CALIBRATE = _UxGT("⊿校準"); // "Delta Calibration"
+ LSTR MSG_DELTA_CALIBRATE_X = _UxGT("⊿校準X"); // "Calibrate X"
+ LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("⊿校準Y"); // "Calibrate Y"
+ LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("⊿校準Z"); // "Calibrate Z"
+ LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("⊿校準中心"); // "Calibrate Center"
+ LSTR MSG_DELTA_SETTINGS = _UxGT("⊿設置"); // "Delta Settings"
+ LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("⊿自動校準"); // "Auto Calibration"
+ LSTR MSG_DELTA_DIAG_ROD = _UxGT("⊿斜柱"); // "Diag Rod"
+ LSTR MSG_DELTA_HEIGHT = _UxGT("⊿高度"); // "Height"
+ LSTR MSG_DELTA_RADIUS = _UxGT("⊿半徑"); // "Radius"
+ LSTR MSG_INFO_MENU = _UxGT("關於印表機"); // "About Printer"
+ LSTR MSG_INFO_PRINTER_MENU = _UxGT("印表機訊息"); // "Printer Info"
+ LSTR MSG_3POINT_LEVELING = _UxGT("三點調平"); // "3-Point Leveling"
+ LSTR MSG_LINEAR_LEVELING = _UxGT("線性調平"); // "Linear Leveling"
+ LSTR MSG_BILINEAR_LEVELING = _UxGT(" 雙線性調平"); // "Bilinear Leveling"
+ LSTR MSG_UBL_LEVELING = _UxGT("統一熱床調平(UBL)"); // "Unified Bed Leveling"
+ LSTR MSG_MESH_LEVELING = _UxGT("網格調平"); // "Mesh Leveling"
+ LSTR MSG_INFO_STATS_MENU = _UxGT("印表機統計"); // "Printer Stats"
+ LSTR MSG_INFO_BOARD_MENU = _UxGT("主板訊息"); // "Board Info"
+ LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("溫度計"); // "Thermistors"
+ LSTR MSG_INFO_EXTRUDERS = _UxGT(" 擠出機"); // "Extruders"
+ LSTR MSG_INFO_BAUDRATE = _UxGT("傳輸率"); // "Baud"
+ LSTR MSG_INFO_PROTOCOL = _UxGT("協議"); // "Protocol"
+ LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("監測溫度失控:關"); // "Runaway Watch: OFF"
+ LSTR MSG_INFO_RUNAWAY_ON = _UxGT("監測溫度失控:開"); // "Runaway Watch: ON"
+
+ LSTR MSG_CASE_LIGHT = _UxGT("外殼燈"); // "Case light"
+ LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("燈亮度"); // "Light BRIGHTNESS"
+ LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("打印機不正確"); // "The printer is incorrect"
+
+ #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("列印計數"); // "Print Count"
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("已完成"); // "Completed"
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("總列印時間"); // "Total print time"
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("最長工作時間"); // "Longest job time"
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("總計擠出"); // "Extruded total"
+ #else
+ LSTR MSG_INFO_PRINT_COUNT = _UxGT("列印數"); // "Prints"
+ LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("完成"); // "Completed"
+ LSTR MSG_INFO_PRINT_TIME = _UxGT("總共"); // "Total"
+ LSTR MSG_INFO_PRINT_LONGEST = _UxGT("最長"); // "Longest"
+ LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("已擠出"); // "Extruded"
+ #endif
+
+ LSTR MSG_INFO_MIN_TEMP = _UxGT("最低溫度"); // "Min Temp"
+ LSTR MSG_INFO_MAX_TEMP = _UxGT("最高溫度"); // "Max Temp"
+ LSTR MSG_INFO_PSU = _UxGT("電源供應"); // "Power Supply"
+ LSTR MSG_DRIVE_STRENGTH = _UxGT("驅動力度"); // "Drive Strength"
+ LSTR MSG_DAC_PERCENT_N = _UxGT("@ 驅動 %"); //E Driver %
+ LSTR MSG_ERROR_TMC = _UxGT("TMC連接錯誤"); // "TMC CONNECTION ERROR"
+ LSTR MSG_DAC_EEPROM_WRITE = _UxGT("保存驅動設置"); // "DAC EEPROM Write"
+ LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("更換絲料"); // "FILAMENT CHANGE"
+ LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("列印已暫停"); // "PRINT PAUSED"
+ LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("裝載絲料"); // "LOAD FILAMENT"
+ LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("卸載絲料"); // "UNLOAD FILAMENT"
+ LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("恢複選項:"); // "RESUME OPTIONS:"
+ LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("清除更多"); // "Purge more"
+ LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("恢復列印"); // "Resume print"
+ LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" 噴嘴: "); // " Nozzle: "
+ LSTR MSG_RUNOUT_SENSOR = _UxGT("斷絲偵測"); // "Runout Sensor"
+ LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("絲距離mm"); // "Runout Dist mm"
+ LSTR MSG_KILL_HOMING_FAILED = _UxGT("歸原位失敗"); // "Homing failed"
+ LSTR MSG_LCD_PROBING_FAILED = _UxGT("探針探測失敗"); // "Probing failed"
+
+ //
+ // Filament Change screens show up to 3 lines on a 4-line display
+ // ...or up to 2 lines on a 3-line display
+ //
+ #if LCD_HEIGHT >= 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("按下按鈕", "恢復列印")); //"Press Button to resume print"
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停車中 ...")); // "Parking..."
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("等待開始", "絲料", "變更")); // "Wait for start of the filament change"
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("等待", "卸下絲料")); // "Wait for filament unload"
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("插入絲料", "並按鍵", "繼續 ...")); // "Insert filament and press button to continue..."
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("按下按鈕", "加熱噴嘴.")); // "Press button to heat nozzle."
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("加熱噴嘴", "請等待 ...")); // "Heating nozzle Please wait..."
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("等待", "進料")); // "Wait for filament load"
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("等待", "絲料清除")); // "Wait for filament purge"
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("按下完成","絲料清除")); //"Press button to filament purge"
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("等待列印", "恢復")); // "Wait for print to resume"
+ #else // LCD_HEIGHT < 4
+ LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("按下繼續..")); // "Click to continue"
+ LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停車中 ...")); // "Parking..."
+ LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("請等待 ...")); // "Please wait..."
+ LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("插入並點擊")); // "Insert and Click"
+ LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("按下加熱..")); // "Click to heat"
+ LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("加熱中 ...")); // "Heating..."
+ LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("退出中 ...")); // "Ejecting..."
+ LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("載入中 ...")); // "Loading..."
+ LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("清除中 ...")); // "Purging..."
+ LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("按下完成..")); // "Click to finish"
+ LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("恢復中 ...")); // "Resuming..."
+ #endif // LCD_HEIGHT < 4
+}
+
+#if FAN_COUNT == 1
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED
+#else
+ #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N
+ #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N
+#endif
diff --git a/src/lcd/menu/game/brickout.cpp b/src/lcd/menu/game/brickout.cpp
new file mode 100644
index 0000000..d738250
--- /dev/null
+++ b/src/lcd/menu/game/brickout.cpp
@@ -0,0 +1,207 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../../../inc/MarlinConfigPre.h"
+
+#if ENABLED(MARLIN_BRICKOUT)
+
+#include "game.h"
+
+#define BRICK_H 5
+#define BRICK_TOP MENU_FONT_ASCENT
+
+#define PADDLE_H 2
+#define PADDLE_VEL 3
+#define PADDLE_W ((LCD_PIXEL_WIDTH) / 8)
+#define PADDLE_Y (LCD_PIXEL_HEIGHT - 1 - PADDLE_H)
+
+#define BRICK_W ((LCD_PIXEL_WIDTH) / (BRICK_COLS))
+#define BRICK_BOT (BRICK_TOP + BRICK_H * BRICK_ROWS - 1)
+
+#define BRICK_COL(X) ((X) / (BRICK_W))
+#define BRICK_ROW(Y) ((Y - (BRICK_TOP)) / (BRICK_H))
+
+brickout_data_t &bdat = marlin_game_data.brickout;
+
+inline void reset_bricks(const uint16_t v) {
+ bdat.brick_count = (BRICK_COLS) * (BRICK_ROWS);
+ LOOP_L_N(i, BRICK_ROWS) bdat.bricks[i] = v;
+}
+
+void reset_ball() {
+ constexpr uint8_t ball_dist = 24;
+ bdat.bally = BTOF(PADDLE_Y - ball_dist);
+ bdat.ballv = FTOF(1.3f);
+ bdat.ballh = -FTOF(1.25f);
+ uint8_t bx = bdat.paddle_x + (PADDLE_W) / 2 + ball_dist;
+ if (bx >= LCD_PIXEL_WIDTH - 10) { bx -= ball_dist * 2; bdat.ballh = -bdat.ballh; }
+ bdat.ballx = BTOF(bx);
+ bdat.hit_dir = -1;
+}
+
+void BrickoutGame::game_screen() {
+ if (game_frame()) { // Run logic twice for finer resolution
+ // Update Paddle Position
+ bdat.paddle_x = constrain(int8_t(ui.encoderPosition), 0, (LCD_PIXEL_WIDTH - (PADDLE_W)) / (PADDLE_VEL));
+ ui.encoderPosition = bdat.paddle_x;
+ bdat.paddle_x *= (PADDLE_VEL);
+
+ // Run the ball logic
+ if (game_state) do {
+
+ // Provisionally update the ball position
+ const fixed_t newx = bdat.ballx + bdat.ballh, newy = bdat.bally + bdat.ballv; // current next position
+ if (!WITHIN(newx, 0, BTOF(LCD_PIXEL_WIDTH - 1))) { // out in x?
+ bdat.ballh = -bdat.ballh; _BUZZ(5, 220); // bounce x
+ }
+ if (newy < 0) { // out in y?
+ bdat.ballv = -bdat.ballv; _BUZZ(5, 280); // bounce v
+ bdat.hit_dir = 1;
+ }
+ // Did the ball go below the bottom?
+ else if (newy > BTOF(LCD_PIXEL_HEIGHT)) {
+ _BUZZ(500, 75);
+ if (--bdat.balls_left) reset_ball(); else game_state = 0;
+ break; // done
+ }
+
+ // Is the ball colliding with a brick?
+ if (WITHIN(newy, BTOF(BRICK_TOP), BTOF(BRICK_BOT))) {
+ const int8_t bit = BRICK_COL(FTOB(newx)), row = BRICK_ROW(FTOB(newy));
+ const uint16_t mask = _BV(bit);
+ if (bdat.bricks[row] & mask) {
+ // Yes. Remove it!
+ bdat.bricks[row] &= ~mask;
+ // Score!
+ score += BRICK_ROWS - row;
+ // If bricks are gone, go to reset state
+ if (!--bdat.brick_count) game_state = 2;
+ // Bounce the ball cleverly
+ if ((bdat.ballv < 0) == (bdat.hit_dir < 0)) { bdat.ballv = -bdat.ballv; bdat.ballh += fixed_t(random(-16, 16)); _BUZZ(5, 880); }
+ else { bdat.ballh = -bdat.ballh; bdat.ballv += fixed_t(random(-16, 16)); _BUZZ(5, 640); }
+ }
+ }
+ // Is the ball moving down and in paddle range?
+ else if (bdat.ballv > 0 && WITHIN(newy, BTOF(PADDLE_Y), BTOF(PADDLE_Y + PADDLE_H))) {
+ // Ball actually hitting paddle
+ const int8_t diff = FTOB(newx) - bdat.paddle_x;
+ if (WITHIN(diff, 0, PADDLE_W - 1)) {
+
+ // Reverse Y direction
+ bdat.ballv = -bdat.ballv; _BUZZ(3, 880);
+ bdat.hit_dir = -1;
+
+ // Near edges affects X velocity
+ const bool is_left_edge = (diff <= 1);
+ if (is_left_edge || diff >= PADDLE_W-1 - 1) {
+ if ((bdat.ballh > 0) == is_left_edge) bdat.ballh = -bdat.ballh;
+ }
+ else if (diff <= 3) {
+ bdat.ballh += fixed_t(random(-64, 0));
+ NOLESS(bdat.ballh, BTOF(-2));
+ NOMORE(bdat.ballh, BTOF(2));
+ }
+ else if (diff >= PADDLE_W-1 - 3) {
+ bdat.ballh += fixed_t(random( 0, 64));
+ NOLESS(bdat.ballh, BTOF(-2));
+ NOMORE(bdat.ballh, BTOF(2));
+ }
+
+ // Paddle hit after clearing the board? Reset the board.
+ if (game_state == 2) { reset_bricks(0xFFFF); game_state = 1; }
+ }
+ }
+
+ bdat.ballx += bdat.ballh; bdat.bally += bdat.ballv; // update with new velocity
+
+ } while (false);
+ }
+
+ u8g.setColorIndex(1);
+
+ // Draw bricks
+ if (PAGE_CONTAINS(BRICK_TOP, BRICK_BOT)) {
+ LOOP_L_N(y, BRICK_ROWS) {
+ const uint8_t yy = y * BRICK_H + BRICK_TOP;
+ if (PAGE_CONTAINS(yy, yy + BRICK_H - 1)) {
+ LOOP_L_N(x, BRICK_COLS) {
+ if (TEST(bdat.bricks[y], x)) {
+ const uint8_t xx = x * BRICK_W;
+ LOOP_L_N(v, BRICK_H - 1)
+ if (PAGE_CONTAINS(yy + v, yy + v))
+ u8g.drawHLine(xx, yy + v, BRICK_W - 1);
+ }
+ }
+ }
+ }
+ }
+
+ // Draw paddle
+ if (PAGE_CONTAINS(PADDLE_Y-1, PADDLE_Y)) {
+ u8g.drawHLine(bdat.paddle_x, PADDLE_Y, PADDLE_W);
+ #if PADDLE_H > 1
+ u8g.drawHLine(bdat.paddle_x, PADDLE_Y-1, PADDLE_W);
+ #if PADDLE_H > 2
+ u8g.drawHLine(bdat.paddle_x, PADDLE_Y-2, PADDLE_W);
+ #endif
+ #endif
+ }
+
+ // Draw ball while game is running
+ if (game_state) {
+ const uint8_t by = FTOB(bdat.bally);
+ if (PAGE_CONTAINS(by, by+1))
+ u8g.drawFrame(FTOB(bdat.ballx), by, 2, 2);
+ }
+ // Or draw GAME OVER
+ else
+ draw_game_over();
+
+ if (PAGE_UNDER(MENU_FONT_ASCENT)) {
+ // Score Digits
+ //const uint8_t sx = (LCD_PIXEL_WIDTH - (score >= 10 ? score >= 100 ? score >= 1000 ? 4 : 3 : 2 : 1) * MENU_FONT_WIDTH) / 2;
+ constexpr uint8_t sx = 0;
+ lcd_put_int(sx, MENU_FONT_ASCENT - 1, score);
+
+ // Balls Left
+ lcd_moveto(LCD_PIXEL_WIDTH - MENU_FONT_WIDTH * 3, MENU_FONT_ASCENT - 1);
+ PGM_P const ohs = PSTR("ooo\0\0");
+ lcd_put_u8str_P(ohs + 3 - bdat.balls_left);
+ }
+
+ // A click always exits this game
+ if (ui.use_click()) exit_game();
+}
+
+#define SCREEN_M ((LCD_PIXEL_WIDTH) / 2)
+
+void BrickoutGame::enter_game() {
+ init_game(2, game_screen); // 2 = reset bricks on paddle hit
+ constexpr uint8_t paddle_start = SCREEN_M - (PADDLE_W) / 2;
+ bdat.paddle_x = paddle_start;
+ bdat.balls_left = 3;
+ reset_bricks(0x0000);
+ reset_ball();
+ ui.encoderPosition = paddle_start / (PADDLE_VEL);
+}
+
+#endif // MARLIN_BRICKOUT
diff --git a/src/lcd/menu/game/brickout.h b/src/lcd/menu/game/brickout.h
new file mode 100644
index 0000000..cf1fbc6
--- /dev/null
+++ b/src/lcd/menu/game/brickout.h
@@ -0,0 +1,38 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "types.h"
+
+#define BRICK_ROWS 4
+#define BRICK_COLS 16
+
+typedef struct {
+ uint8_t balls_left, brick_count;
+ uint16_t bricks[BRICK_ROWS];
+ int8_t paddle_x, hit_dir;
+ fixed_t ballx, bally, ballh, ballv;
+} brickout_data_t;
+
+class BrickoutGame : MarlinGame { public: static void enter_game(), game_screen(); };
+
+extern BrickoutGame brickout;
diff --git a/src/lcd/menu/game/game.cpp b/src/lcd/menu/game/game.cpp
new file mode 100644
index 0000000..d465b00
--- /dev/null
+++ b/src/lcd/menu/game/game.cpp
@@ -0,0 +1,66 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../../../inc/MarlinConfigPre.h"
+
+#if HAS_GAMES
+
+#include "game.h"
+
+int MarlinGame::score;
+uint8_t MarlinGame::game_state;
+millis_t MarlinGame::next_frame;
+
+MarlinGameData marlin_game_data;
+
+bool MarlinGame::game_frame() {
+ static int8_t slew;
+ if (ui.first_page) slew = 2;
+ ui.refresh(LCDVIEW_CALL_NO_REDRAW); // Refresh as often as possible
+ return (game_state && slew-- > 0);
+}
+
+void MarlinGame::draw_game_over() {
+ constexpr int8_t gowide = (MENU_FONT_WIDTH) * 9,
+ gohigh = MENU_FONT_ASCENT - 3,
+ lx = (LCD_PIXEL_WIDTH - gowide) / 2,
+ ly = (LCD_PIXEL_HEIGHT + gohigh) / 2;
+ if (PAGE_CONTAINS(ly - gohigh - 1, ly + 1)) {
+ u8g.setColorIndex(0);
+ u8g.drawBox(lx - 1, ly - gohigh - 1, gowide + 2, gohigh + 2);
+ u8g.setColorIndex(1);
+ if (ui.get_blink()) lcd_put_u8str(lx, ly, F("GAME OVER"));
+ }
+}
+
+void MarlinGame::init_game(const uint8_t init_state, const screenFunc_t screen) {
+ score = 0;
+ game_state = init_state;
+ ui.goto_screen(screen);
+ ui.defer_status_screen();
+}
+
+void MarlinGame::exit_game() {
+ ui.goto_previous_screen_no_defer();
+}
+
+#endif // HAS_GAMES
diff --git a/src/lcd/menu/game/game.h b/src/lcd/menu/game/game.h
new file mode 100644
index 0000000..ba123cb
--- /dev/null
+++ b/src/lcd/menu/game/game.h
@@ -0,0 +1,70 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "../../../inc/MarlinConfigPre.h"
+#include "../../dogm/marlinui_DOGM.h"
+#include "../../lcdprint.h"
+#include "../../marlinui.h"
+
+//#define MUTE_GAMES
+
+#if ENABLED(MUTE_GAMES) || !HAS_SOUND
+ #define _BUZZ(D,F) NOOP
+#else
+ #define _BUZZ(D,F) BUZZ(D,F)
+#endif
+
+#if HAS_GAME_MENU
+ void menu_game();
+#endif
+
+#if ENABLED(MARLIN_BRICKOUT)
+ #include "brickout.h"
+#endif
+#if ENABLED(MARLIN_INVADERS)
+ #include "invaders.h"
+#endif
+#if ENABLED(MARLIN_MAZE)
+ #include "maze.h"
+#endif
+#if ENABLED(MARLIN_SNAKE)
+ #include "snake.h"
+#endif
+
+// Pool game data to save SRAM
+union MarlinGameData {
+ #if ENABLED(MARLIN_BRICKOUT)
+ brickout_data_t brickout;
+ #endif
+ #if ENABLED(MARLIN_INVADERS)
+ invaders_data_t invaders;
+ #endif
+ #if ENABLED(MARLIN_SNAKE)
+ snake_data_t snake;
+ #endif
+ #if ENABLED(MARLIN_MAZE)
+ maze_data_t maze;
+ #endif
+};
+
+extern MarlinGameData marlin_game_data;
diff --git a/src/lcd/menu/game/invaders.cpp b/src/lcd/menu/game/invaders.cpp
new file mode 100644
index 0000000..56e4c22
--- /dev/null
+++ b/src/lcd/menu/game/invaders.cpp
@@ -0,0 +1,438 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../../../inc/MarlinConfigPre.h"
+
+#if ENABLED(MARLIN_INVADERS)
+
+#include "game.h"
+
+#define CANNON_W 11
+#define CANNON_H 8
+#define CANNON_VEL 4
+#define CANNON_Y (LCD_PIXEL_HEIGHT - 1 - CANNON_H)
+
+#define INVADER_VEL 3
+
+#define INVADER_TOP MENU_FONT_ASCENT
+#define INVADERS_WIDE ((INVADER_COL_W) * (INVADER_COLS))
+#define INVADERS_HIGH ((INVADER_ROW_H) * (INVADER_ROWS))
+
+#define UFO_H 5
+#define UFO_W 13
+
+#define LASER_H 4
+#define SHOT_H 3
+#define EXPL_W 11
+#define LIFE_W 8
+#define LIFE_H 5
+
+#define INVADER_RIGHT ((INVADER_COLS) * (INVADER_COL_W))
+
+// 11x8
+const unsigned char invader[3][2][16] PROGMEM = {
+ { { B00000110,B00000000,
+ B00001111,B00000000,
+ B00011111,B10000000,
+ B00110110,B11000000,
+ B00111111,B11000000,
+ B00001001,B00000000,
+ B00010110,B10000000,
+ B00101001,B01000000
+ }, {
+ B00000110,B00000000,
+ B00001111,B00000000,
+ B00011111,B10000000,
+ B00110110,B11000000,
+ B00111111,B11000000,
+ B00010110,B10000000,
+ B00100000,B01000000,
+ B00010000,B10000000
+ }
+ }, {
+ { B00010000,B01000000,
+ B00001000,B10000000,
+ B00011111,B11000000,
+ B00110111,B01100000,
+ B01111111,B11110000,
+ B01011111,B11010000,
+ B01010000,B01010000,
+ B00001101,B10000000
+ }, {
+ B00010000,B01000000,
+ B01001000,B10010000,
+ B01011111,B11010000,
+ B01110111,B01110000,
+ B01111111,B11110000,
+ B00011111,B11000000,
+ B00010000,B01000000,
+ B00100000,B00100000
+ }
+ }, {
+ { B00001111,B00000000,
+ B01111111,B11100000,
+ B11111111,B11110000,
+ B11100110,B01110000,
+ B11111111,B11110000,
+ B00011001,B10000000,
+ B00110110,B11000000,
+ B11000000,B00110000
+ }, {
+ B00001111,B00000000,
+ B01111111,B11100000,
+ B11111111,B11110000,
+ B11100110,B01110000,
+ B11111111,B11110000,
+ B00011001,B10000000,
+ B00110110,B11000000,
+ B00011001,B10000000
+ }
+ }
+};
+const unsigned char cannon[] PROGMEM = {
+ B00000100,B00000000,
+ B00001110,B00000000,
+ B00001110,B00000000,
+ B01111111,B11000000,
+ B11111111,B11100000,
+ B11111111,B11100000,
+ B11111111,B11100000,
+ B11111111,B11100000
+};
+const unsigned char life[] PROGMEM = {
+ B00010000,
+ B01111100,
+ B11111110,
+ B11111110,
+ B11111110
+};
+const unsigned char explosion[] PROGMEM = {
+ B01000100,B01000000,
+ B00100100,B10000000,
+ B00000000,B00000000,
+ B00110001,B10000000,
+ B00000000,B00000000,
+ B00100100,B10000000,
+ B01000100,B01000000
+};
+const unsigned char ufo[] PROGMEM = {
+ B00011111,B11000000,
+ B01111111,B11110000,
+ B11011101,B11011000,
+ B11111111,B11111000,
+ B01111111,B11110000
+};
+
+constexpr uint8_t inv_type[] = {
+ #if INVADER_ROWS == 5
+ 0, 1, 1, 2, 2
+ #elif INVADER_ROWS == 4
+ 0, 1, 1, 2
+ #elif INVADER_ROWS == 3
+ 0, 1, 2
+ #else
+ #error "INVASION_SIZE must be 3, 4, or 5."
+ #endif
+};
+
+invaders_data_t &idat = marlin_game_data.invaders;
+
+#define INV_X_LEFT(C,T) (idat.pos.x + (C) * (INVADER_COL_W) + inv_off[T])
+#define INV_X_CTR(C,T) (INV_X_LEFT(C,T) + inv_wide[T] / 2)
+#define INV_Y_BOT(R) (idat.pos.y + (R + 1) * (INVADER_ROW_H) - 2)
+
+constexpr uint8_t inv_off[] = { 2, 1, 0 }, inv_wide[] = { 8, 11, 12 };
+
+inline void update_invader_data() {
+ uint8_t inv_mask = 0;
+ // Get a list of all active invaders
+ uint8_t sc = 0;
+ LOOP_L_N(y, INVADER_ROWS) {
+ uint8_t m = idat.bugs[y];
+ if (m) idat.botmost = y + 1;
+ inv_mask |= m;
+ LOOP_L_N(x, INVADER_COLS)
+ if (TEST(m, x)) idat.shooters[sc++] = (y << 4) | x;
+ }
+ idat.leftmost = 0;
+ LOOP_L_N(i, INVADER_COLS) { if (TEST(inv_mask, i)) break; idat.leftmost -= INVADER_COL_W; }
+ idat.rightmost = LCD_PIXEL_WIDTH - (INVADERS_WIDE);
+ for (uint8_t i = INVADER_COLS; i--;) { if (TEST(inv_mask, i)) break; idat.rightmost += INVADER_COL_W; }
+ if (idat.count == 2) idat.dir = idat.dir > 0 ? INVADER_VEL + 1 : -(INVADER_VEL + 1);
+}
+
+inline void reset_bullets() {
+ LOOP_L_N(i, COUNT(idat.bullet)) idat.bullet[i].v = 0;
+}
+
+inline void reset_invaders() {
+ idat.pos.x = 0; idat.pos.y = INVADER_TOP;
+ idat.dir = INVADER_VEL;
+ idat.count = (INVADER_COLS) * (INVADER_ROWS);
+ LOOP_L_N(i, INVADER_ROWS) idat.bugs[i] = _BV(INVADER_COLS) - 1;
+ update_invader_data();
+ reset_bullets();
+}
+
+
+inline void spawn_ufo() {
+ idat.ufov = random(0, 2) ? 1 : -1;
+ idat.ufox = idat.ufov > 0 ? -(UFO_W) : LCD_PIXEL_WIDTH - 1;
+}
+
+inline void reset_player() {
+ idat.cannon_x = 0;
+ ui.encoderPosition = 0;
+}
+
+inline void fire_cannon() {
+ idat.laser.x = idat.cannon_x + CANNON_W / 2;
+ idat.laser.y = LCD_PIXEL_HEIGHT - CANNON_H - (LASER_H);
+ idat.laser.v = -(LASER_H);
+}
+
+inline void explode(const int8_t x, const int8_t y, const int8_t v=4) {
+ idat.explod.x = x - (EXPL_W) / 2;
+ idat.explod.y = y;
+ idat.explod.v = v;
+}
+
+inline void kill_cannon(uint8_t &game_state, const uint8_t st) {
+ reset_bullets();
+ explode(idat.cannon_x + (CANNON_W) / 2, CANNON_Y, 6);
+ _BUZZ(1000, 10);
+ if (--idat.cannons_left) {
+ idat.laser.v = 0;
+ game_state = st;
+ reset_player();
+ }
+ else
+ game_state = 0;
+}
+
+void InvadersGame::game_screen() {
+ ui.refresh(LCDVIEW_CALL_NO_REDRAW); // Call as often as possible
+
+ // Run game logic once per full screen
+ if (ui.first_page) {
+
+ // Update Cannon Position
+ int16_t ep = constrain(int16_t(ui.encoderPosition), 0, (LCD_PIXEL_WIDTH - (CANNON_W)) / (CANNON_VEL));
+ ui.encoderPosition = ep;
+
+ ep *= (CANNON_VEL);
+ if (ep > idat.cannon_x) { idat.cannon_x += CANNON_VEL - 1; if (ep - idat.cannon_x < 2) idat.cannon_x = ep; }
+ if (ep < idat.cannon_x) { idat.cannon_x -= CANNON_VEL - 1; if (idat.cannon_x - ep < 2) idat.cannon_x = ep; }
+
+ // Run the game logic
+ if (game_state) do {
+
+ // Move the UFO, if any
+ if (idat.ufov) { idat.ufox += idat.ufov; if (!WITHIN(idat.ufox, -(UFO_W), LCD_PIXEL_WIDTH - 1)) idat.ufov = 0; }
+
+ if (game_state > 1) { if (--game_state == 2) { reset_invaders(); } else if (game_state == 100) { game_state = 1; } break; }
+
+ const bool did_blink = (++idat.blink_count > idat.count >> 1);
+ if (did_blink) {
+ idat.game_blink = !idat.game_blink;
+ idat.blink_count = 0;
+ }
+
+ if (idat.count && did_blink) {
+ const int8_t newx = idat.pos.x + idat.dir;
+ if (!WITHIN(newx, idat.leftmost, idat.rightmost)) { // Invaders reached the edge?
+ idat.dir *= -1; // Invaders change direction
+ idat.pos.y += (INVADER_ROW_H) / 2; // Invaders move down
+ idat.pos.x -= idat.dir; // ...and only move down this time.
+ if (idat.pos.y + idat.botmost * (INVADER_ROW_H) - 2 >= CANNON_Y) // Invaders reached the bottom?
+ kill_cannon(game_state, 20); // Kill the cannon. Reset invaders.
+ }
+
+ idat.pos.x += idat.dir; // Invaders take one step left/right
+
+ // Randomly shoot if invaders are listed
+ if (idat.count && !random(0, 20)) {
+
+ // Find a free bullet
+ laser_t *b = nullptr;
+ LOOP_L_N(i, COUNT(idat.bullet)) if (!idat.bullet[i].v) { b = &idat.bullet[i]; break; }
+ if (b) {
+ // Pick a random shooter and update the bullet
+ //SERIAL_ECHOLNPGM("free bullet found");
+ const uint8_t inv = idat.shooters[random(0, idat.count + 1)], col = inv & 0x0F, row = inv >> 4, type = inv_type[row];
+ b->x = INV_X_CTR(col, type);
+ b->y = INV_Y_BOT(row);
+ b->v = 2 + random(0, 2);
+ }
+ }
+ }
+
+ // Update the laser position
+ if (idat.laser.v) {
+ idat.laser.y += idat.laser.v;
+ if (idat.laser.y < 0) idat.laser.v = 0;
+ }
+
+ // Did the laser collide with an invader?
+ if (idat.laser.v && WITHIN(idat.laser.y, idat.pos.y, idat.pos.y + INVADERS_HIGH - 1)) {
+ const int8_t col = idat.laser_col();
+ if (WITHIN(col, 0, INVADER_COLS - 1)) {
+ const int8_t row = idat.laser_row();
+ if (WITHIN(row, 0, INVADER_ROWS - 1)) {
+ const uint8_t mask = _BV(col);
+ if (idat.bugs[row] & mask) {
+ const uint8_t type = inv_type[row];
+ const int8_t invx = INV_X_LEFT(col, type);
+ if (WITHIN(idat.laser.x, invx, invx + inv_wide[type] - 1)) {
+ // Turn off laser
+ idat.laser.v = 0;
+ // Remove the invader!
+ idat.bugs[row] &= ~mask;
+ // Score!
+ score += INVADER_ROWS - row;
+ // Explode sound!
+ _BUZZ(40, 10);
+ // Explosion bitmap!
+ explode(invx + inv_wide[type] / 2, idat.pos.y + row * (INVADER_ROW_H));
+ // If invaders are gone, go to reset invaders state
+ if (--idat.count) update_invader_data(); else { game_state = 20; reset_bullets(); }
+ } // laser x hit
+ } // invader exists
+ } // good row
+ } // good col
+ } // laser in invader zone
+
+ // Handle alien bullets
+ LOOP_L_N(s, COUNT(idat.bullet)) {
+ laser_t *b = &idat.bullet[s];
+ if (b->v) {
+ // Update alien bullet position
+ b->y += b->v;
+ if (b->y >= LCD_PIXEL_HEIGHT)
+ b->v = 0; // Offscreen
+ else if (b->y >= CANNON_Y && WITHIN(b->x, idat.cannon_x, idat.cannon_x + CANNON_W - 1))
+ kill_cannon(game_state, 120); // Hit the cannon
+ }
+ }
+
+ // Randomly spawn a UFO
+ if (!idat.ufov && !random(0,500)) spawn_ufo();
+
+ // Did the laser hit a ufo?
+ if (idat.laser.v && idat.ufov && idat.laser.y < UFO_H + 2 && WITHIN(idat.laser.x, idat.ufox, idat.ufox + UFO_W - 1)) {
+ // Turn off laser and UFO
+ idat.laser.v = idat.ufov = 0;
+ // Score!
+ score += 10;
+ // Explode!
+ _BUZZ(40, 10);
+ // Explosion bitmap
+ explode(idat.ufox + (UFO_W) / 2, 1);
+ }
+
+ } while (false);
+
+ }
+
+ // Click-and-hold to abort
+ if (ui.button_pressed()) --idat.quit_count; else idat.quit_count = 10;
+
+ // Click to fire or exit
+ if (ui.use_click()) {
+ if (!game_state)
+ idat.quit_count = 0;
+ else if (game_state == 1 && !idat.laser.v)
+ fire_cannon();
+ }
+
+ if (!idat.quit_count) exit_game();
+
+ u8g.setColorIndex(1);
+
+ // Draw invaders
+ if (PAGE_CONTAINS(idat.pos.y, idat.pos.y + idat.botmost * (INVADER_ROW_H) - 2 - 1)) {
+ int8_t yy = idat.pos.y;
+ LOOP_L_N(y, INVADER_ROWS) {
+ const uint8_t type = inv_type[y];
+ if (PAGE_CONTAINS(yy, yy + INVADER_H - 1)) {
+ int8_t xx = idat.pos.x;
+ LOOP_L_N(x, INVADER_COLS) {
+ if (TEST(idat.bugs[y], x))
+ u8g.drawBitmapP(xx, yy, 2, INVADER_H, invader[type][idat.game_blink]);
+ xx += INVADER_COL_W;
+ }
+ }
+ yy += INVADER_ROW_H;
+ }
+ }
+
+ // Draw UFO
+ if (idat.ufov && PAGE_UNDER(UFO_H + 2))
+ u8g.drawBitmapP(idat.ufox, 2, 2, UFO_H, ufo);
+
+ // Draw cannon
+ if (game_state && PAGE_CONTAINS(CANNON_Y, CANNON_Y + CANNON_H - 1) && (game_state < 2 || (game_state & 0x02)))
+ u8g.drawBitmapP(idat.cannon_x, CANNON_Y, 2, CANNON_H, cannon);
+
+ // Draw laser
+ if (idat.laser.v && PAGE_CONTAINS(idat.laser.y, idat.laser.y + LASER_H - 1))
+ u8g.drawVLine(idat.laser.x, idat.laser.y, LASER_H);
+
+ // Draw invader bullets
+ LOOP_L_N (i, COUNT(idat.bullet)) {
+ if (idat.bullet[i].v && PAGE_CONTAINS(idat.bullet[i].y - (SHOT_H - 1), idat.bullet[i].y))
+ u8g.drawVLine(idat.bullet[i].x, idat.bullet[i].y - (SHOT_H - 1), SHOT_H);
+ }
+
+ // Draw explosion
+ if (idat.explod.v && PAGE_CONTAINS(idat.explod.y, idat.explod.y + 7 - 1)) {
+ u8g.drawBitmapP(idat.explod.x, idat.explod.y, 2, 7, explosion);
+ --idat.explod.v;
+ }
+
+ // Blink GAME OVER when game is over
+ if (!game_state) draw_game_over();
+
+ if (PAGE_UNDER(MENU_FONT_ASCENT - 1)) {
+ // Draw Score
+ //const uint8_t sx = (LCD_PIXEL_WIDTH - (score >= 10 ? score >= 100 ? score >= 1000 ? 4 : 3 : 2 : 1) * MENU_FONT_WIDTH) / 2;
+ constexpr uint8_t sx = 0;
+ lcd_put_int(sx, MENU_FONT_ASCENT - 1, score);
+
+ // Draw lives
+ if (idat.cannons_left)
+ for (uint8_t i = 1; i <= idat.cannons_left; ++i)
+ u8g.drawBitmapP(LCD_PIXEL_WIDTH - i * (LIFE_W), 6 - (LIFE_H), 1, LIFE_H, life);
+ }
+
+}
+
+void InvadersGame::enter_game() {
+ init_game(20, game_screen); // countdown to reset invaders
+ idat.cannons_left = 3;
+ idat.quit_count = 10;
+ idat.laser.v = 0;
+ reset_invaders();
+ reset_player();
+}
+
+#endif // MARLIN_INVADERS
diff --git a/src/lcd/menu/game/invaders.h b/src/lcd/menu/game/invaders.h
new file mode 100644
index 0000000..c99e6c1
--- /dev/null
+++ b/src/lcd/menu/game/invaders.h
@@ -0,0 +1,62 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "types.h"
+
+#define INVASION_SIZE 3
+
+#if INVASION_SIZE == 3
+ #define INVADER_COLS 5
+#elif INVASION_SIZE == 4
+ #define INVADER_COLS 6
+#else
+ #define INVADER_COLS 8
+ #undef INVASION_SIZE
+ #define INVASION_SIZE 5
+#endif
+
+#define INVADER_ROWS INVASION_SIZE
+
+#define INVADER_COL_W 14
+#define INVADER_H 8
+#define INVADER_ROW_H (INVADER_H + 2)
+
+typedef struct { int8_t x, y, v; } laser_t;
+
+typedef struct {
+ pos_t pos;
+ uint8_t cannons_left;
+ int8_t cannon_x;
+ laser_t bullet[10], laser, explod;
+ int8_t dir, leftmost, rightmost, botmost;
+ uint8_t count, quit_count, blink_count;
+ uint8_t bugs[INVADER_ROWS], shooters[(INVADER_ROWS) * (INVADER_COLS)];
+ int8_t ufox, ufov;
+ bool game_blink;
+ int8_t laser_col() { return ((laser.x - pos.x) / (INVADER_COL_W)); };
+ int8_t laser_row() { return ((laser.y - pos.y + 2) / (INVADER_ROW_H)); };
+} invaders_data_t;
+
+class InvadersGame : MarlinGame { public: static void enter_game(), game_screen(); };
+
+extern InvadersGame invaders;
diff --git a/src/lcd/menu/game/maze.cpp b/src/lcd/menu/game/maze.cpp
new file mode 100644
index 0000000..85f752e
--- /dev/null
+++ b/src/lcd/menu/game/maze.cpp
@@ -0,0 +1,134 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../../../inc/MarlinConfigPre.h"
+
+#if ENABLED(MARLIN_MAZE)
+
+#include "game.h"
+
+int8_t move_dir, last_move_dir, // NESW0
+ prizex, prizey, prize_cnt, old_encoder;
+fixed_t playerx, playery;
+
+// Up to 50 lines, then you win!
+typedef struct { int8_t x, y; } pos_t;
+uint8_t head_ind;
+pos_t maze_walls[50] = {
+ { 0, 0 }
+};
+
+// Turn the player cw or ccw
+inline void turn_player(const bool cw) {
+ if (move_dir == 4) move_dir = last_move_dir;
+ move_dir += cw ? 1 : -1;
+ move_dir &= 0x03;
+ last_move_dir = move_dir;
+}
+
+// Reset the player for a new game
+void player_reset() {
+ // Init position
+ playerx = BTOF(1);
+ playery = BTOF(GAME_H / 2);
+
+ // Init motion with a ccw turn
+ move_dir = 0;
+ turn_player(false);
+
+ // Clear prize flag
+ prize_cnt = 255;
+
+ // Clear the controls
+ ui.encoderPosition = 0;
+ old_encoder = 0;
+}
+
+void MazeGame::game_screen() {
+ // Run the sprite logic
+ if (game_frame()) do { // Run logic twice for finer resolution
+
+ // Move the man one unit in the current direction
+ // Direction index 4 is for the stopped man
+ const int8_t oldx = FTOB(playerx), oldy = FTOB(playery);
+ pos_t dir_add[] = { { 0, -1 }, { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, 0 } };
+ playerx += dir_add[move_dir].x;
+ playery += dir_add[move_dir].y;
+ const int8_t x = FTOB(playerx), y = FTOB(playery);
+
+ } while(0);
+
+ u8g.setColorIndex(1);
+
+ // Draw Score
+ if (PAGE_UNDER(HEADER_H)) lcd_put_int(0, HEADER_H - 1, score);
+
+ // Draw the maze
+ // LOOP_L_N(n, head_ind) {
+ // const pos_t &p = maze_walls[n], &q = maze_walls[n + 1];
+ // if (p.x == q.x) {
+ // const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y));
+ // if (PAGE_CONTAINS(y1, y2))
+ // u8g.drawVLine(GAMEX(p.x), y1, y2 - y1 + 1);
+ // }
+ // else if (PAGE_CONTAINS(GAMEY(p.y), GAMEY(p.y))) {
+ // const int8_t x1 = GAMEX(_MIN(p.x, q.x)), x2 = GAMEX(_MAX(p.x, q.x));
+ // u8g.drawHLine(x1, GAMEY(p.y), x2 - x1 + 1);
+ // }
+ // }
+
+ // Draw Man
+ // const int8_t fy = GAMEY(foody);
+ // if (PAGE_CONTAINS(fy, fy + FOOD_WH - 1)) {
+ // const int8_t fx = GAMEX(foodx);
+ // u8g.drawFrame(fx, fy, FOOD_WH, FOOD_WH);
+ // if (FOOD_WH == 5) u8g.drawPixel(fx + 2, fy + 2);
+ // }
+
+ // Draw Ghosts
+ // const int8_t fy = GAMEY(foody);
+ // if (PAGE_CONTAINS(fy, fy + FOOD_WH - 1)) {
+ // const int8_t fx = GAMEX(foodx);
+ // u8g.drawFrame(fx, fy, FOOD_WH, FOOD_WH);
+ // if (FOOD_WH == 5) u8g.drawPixel(fx + 2, fy + 2);
+ // }
+
+ // Draw Prize
+ // if (PAGE_CONTAINS(prizey, prizey + PRIZE_WH - 1)) {
+ // u8g.drawFrame(prizex, prizey, PRIZE_WH, PRIZE_WH);
+ // if (PRIZE_WH == 5) u8g.drawPixel(prizex + 2, prizey + 2);
+ // }
+
+ // Draw GAME OVER
+ if (!game_state) draw_game_over();
+
+ // A click always exits this game
+ if (ui.use_click()) exit_game();
+}
+
+void MazeGame::enter_game() {
+ init_game(1, game_screen); // Game running
+ reset_player();
+ reset_enemies();
+}
+
+#endif // MARLIN_MAZE
diff --git a/src/lcd/menu/game/maze.h b/src/lcd/menu/game/maze.h
new file mode 100644
index 0000000..ff5dde0
--- /dev/null
+++ b/src/lcd/menu/game/maze.h
@@ -0,0 +1,30 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "types.h"
+
+typedef struct { pos_t pos; } maze_data_t;
+
+class MazeGame : MarlinGame { public: static void enter_game(), game_screen(); };
+
+extern MazeGame maze;
diff --git a/src/lcd/menu/game/snake.cpp b/src/lcd/menu/game/snake.cpp
new file mode 100644
index 0000000..c88893a
--- /dev/null
+++ b/src/lcd/menu/game/snake.cpp
@@ -0,0 +1,323 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../../../inc/MarlinConfigPre.h"
+
+#if ENABLED(MARLIN_SNAKE)
+
+#include "game.h"
+
+#define SNAKE_BOX 4
+
+#define HEADER_H (MENU_FONT_ASCENT - 2)
+#define SNAKE_WH (SNAKE_BOX + 1)
+
+#define IDEAL_L 2
+#define IDEAL_R (LCD_PIXEL_WIDTH - 1 - 2)
+#define IDEAL_T (HEADER_H + 2)
+#define IDEAL_B (LCD_PIXEL_HEIGHT - 1 - 2)
+#define IDEAL_W (IDEAL_R - (IDEAL_L) + 1)
+#define IDEAL_H (IDEAL_B - (IDEAL_T) + 1)
+
+#define GAME_W int((IDEAL_W) / (SNAKE_WH))
+#define GAME_H int((IDEAL_H) / (SNAKE_WH))
+
+#define BOARD_W ((SNAKE_WH) * (GAME_W) + 1)
+#define BOARD_H ((SNAKE_WH) * (GAME_H) + 1)
+#define BOARD_L ((LCD_PIXEL_WIDTH - (BOARD_W) + 1) / 2)
+#define BOARD_R (BOARD_L + BOARD_W - 1)
+#define BOARD_T (((LCD_PIXEL_HEIGHT + IDEAL_T) - (BOARD_H)) / 2)
+#define BOARD_B (BOARD_T + BOARD_H - 1)
+
+#define GAMEX(X) (BOARD_L + ((X) * (SNAKE_WH)))
+#define GAMEY(Y) (BOARD_T + ((Y) * (SNAKE_WH)))
+
+#if SNAKE_BOX > 2
+ #define FOOD_WH SNAKE_BOX
+#else
+ #define FOOD_WH 2
+#endif
+
+#if SNAKE_BOX < 1
+ #define SNAKE_SIZ 1
+#else
+ #define SNAKE_SIZ SNAKE_BOX
+#endif
+
+constexpr fixed_t snakev = FTOF(0.20);
+
+snake_data_t &sdat = marlin_game_data.snake;
+
+// Remove the first pixel from the tail.
+// If needed, shift out the first segment.
+void shorten_tail() {
+ pos_t &p = sdat.snake_tail[0], &q = sdat.snake_tail[1];
+ bool shift = false;
+ if (p.x == q.x) {
+ // Vertical line
+ p.y += (q.y > p.y) ? 1 : -1;
+ shift = p.y == q.y;
+ }
+ else {
+ // Horizontal line
+ p.x += (q.x > p.x) ? 1 : -1;
+ shift = p.x == q.x;
+ }
+ if (shift) {
+ sdat.head_ind--;
+ LOOP_LE_N(i, sdat.head_ind)
+ sdat.snake_tail[i] = sdat.snake_tail[i + 1];
+ }
+}
+
+// The food is on a line
+inline bool food_on_line() {
+ LOOP_L_N(n, sdat.head_ind) {
+ pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1];
+ if (p.x == q.x) {
+ if ((sdat.foodx == p.x - 1 || sdat.foodx == p.x) && WITHIN(sdat.foody, _MIN(p.y, q.y), _MAX(p.y, q.y)))
+ return true;
+ }
+ else if ((sdat.foody == p.y - 1 || sdat.foody == p.y) && WITHIN(sdat.foodx, _MIN(p.x, q.x), _MAX(p.x, q.x)))
+ return true;
+ }
+ return false;
+}
+
+// Add a new food blob
+void food_reset() {
+ do {
+ sdat.foodx = random(0, GAME_W);
+ sdat.foody = random(0, GAME_H);
+ } while (food_on_line());
+}
+
+// Turn the snake cw or ccw
+inline void turn_snake(const bool cw) {
+ sdat.snake_dir += cw ? 1 : -1;
+ sdat.snake_dir &= 0x03;
+ sdat.head_ind++;
+ sdat.snake_tail[sdat.head_ind].x = FTOB(sdat.snakex);
+ sdat.snake_tail[sdat.head_ind].y = FTOB(sdat.snakey);
+}
+
+// Reset the snake for a new game
+void snake_reset() {
+ // Init the head and velocity
+ sdat.snakex = BTOF(1);
+ sdat.snakey = BTOF(GAME_H / 2);
+ //snakev = FTOF(0.25);
+
+ // Init the tail with a cw turn
+ sdat.snake_dir = 0;
+ sdat.head_ind = 0;
+ sdat.snake_tail[0].x = 0;
+ sdat.snake_tail[0].y = GAME_H / 2;
+ turn_snake(true);
+
+ // Clear food flag
+ sdat.food_cnt = 5;
+
+ // Clear the controls
+ ui.encoderPosition = 0;
+ sdat.old_encoder = 0;
+}
+
+// Check if head segment overlaps another
+bool snake_overlap() {
+ // 4 lines must exist before a collision is possible
+ if (sdat.head_ind < 4) return false;
+ // Is the last segment crossing any others?
+ const pos_t &h1 = sdat.snake_tail[sdat.head_ind - 1], &h2 = sdat.snake_tail[sdat.head_ind];
+ // VERTICAL head segment?
+ if (h1.x == h2.x) {
+ // Loop from oldest to segment two away from head
+ LOOP_L_N(n, sdat.head_ind - 2) {
+ // Segment p to q
+ const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1];
+ if (p.x != q.x) {
+ // Crossing horizontal segment
+ if (WITHIN(h1.x, _MIN(p.x, q.x), _MAX(p.x, q.x)) && (h1.y <= p.y) == (h2.y >= p.y)) return true;
+ } // Overlapping vertical segment
+ else if (h1.x == p.x && _MIN(h1.y, h2.y) <= _MAX(p.y, q.y) && _MAX(h1.y, h2.y) >= _MIN(p.y, q.y)) return true;
+ }
+ }
+ else {
+ // Loop from oldest to segment two away from head
+ LOOP_L_N(n, sdat.head_ind - 2) {
+ // Segment p to q
+ const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1];
+ if (p.y != q.y) {
+ // Crossing vertical segment
+ if (WITHIN(h1.y, _MIN(p.y, q.y), _MAX(p.y, q.y)) && (h1.x <= p.x) == (h2.x >= p.x)) return true;
+ } // Overlapping horizontal segment
+ else if (h1.y == p.y && _MIN(h1.x, h2.x) <= _MAX(p.x, q.x) && _MAX(h1.x, h2.x) >= _MIN(p.x, q.x)) return true;
+ }
+ }
+ return false;
+}
+
+void SnakeGame::game_screen() {
+ // Run the snake logic
+ if (game_frame()) do { // Run logic twice for finer resolution
+
+ // Move the snake's head one unit in the current direction
+ const int8_t oldx = FTOB(sdat.snakex), oldy = FTOB(sdat.snakey);
+ switch (sdat.snake_dir) {
+ case 0: sdat.snakey -= snakev; break;
+ case 1: sdat.snakex += snakev; break;
+ case 2: sdat.snakey += snakev; break;
+ case 3: sdat.snakex -= snakev; break;
+ }
+ const int8_t x = FTOB(sdat.snakex), y = FTOB(sdat.snakey);
+
+ // If movement took place...
+ if (oldx != x || oldy != y) {
+
+ if (!WITHIN(x, 0, GAME_W - 1) || !WITHIN(y, 0, GAME_H - 1)) {
+ game_state = 0; // Game Over
+ _BUZZ(400, 40); // Bzzzt!
+ break; // ...out of do-while
+ }
+
+ sdat.snake_tail[sdat.head_ind].x = x;
+ sdat.snake_tail[sdat.head_ind].y = y;
+
+ // Change snake direction if set
+ const int8_t enc = int8_t(ui.encoderPosition), diff = enc - sdat.old_encoder;
+ if (diff) {
+ sdat.old_encoder = enc;
+ turn_snake(diff > 0);
+ }
+
+ if (sdat.food_cnt) --sdat.food_cnt; else shorten_tail();
+
+ // Did the snake collide with itself or go out of bounds?
+ if (snake_overlap()) {
+ game_state = 0; // Game Over
+ _BUZZ(400, 40); // Bzzzt!
+ }
+ // Is the snake at the food?
+ else if (x == sdat.foodx && y == sdat.foody) {
+ _BUZZ(5, 220);
+ _BUZZ(5, 280);
+ score++;
+ sdat.food_cnt = 2;
+ food_reset();
+ }
+ }
+
+ } while(0);
+
+ u8g.setColorIndex(1);
+
+ // Draw Score
+ if (PAGE_UNDER(HEADER_H)) lcd_put_int(0, HEADER_H - 1, score);
+
+ // DRAW THE PLAYFIELD BORDER
+ u8g.drawFrame(BOARD_L - 2, BOARD_T - 2, BOARD_R - BOARD_L + 4, BOARD_B - BOARD_T + 4);
+
+ // Draw the snake (tail)
+ #if SNAKE_WH < 2
+
+ // At this scale just draw a line
+ LOOP_L_N(n, sdat.head_ind) {
+ const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1];
+ if (p.x == q.x) {
+ const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y));
+ if (PAGE_CONTAINS(y1, y2))
+ u8g.drawVLine(GAMEX(p.x), y1, y2 - y1 + 1);
+ }
+ else if (PAGE_CONTAINS(GAMEY(p.y), GAMEY(p.y))) {
+ const int8_t x1 = GAMEX(_MIN(p.x, q.x)), x2 = GAMEX(_MAX(p.x, q.x));
+ u8g.drawHLine(x1, GAMEY(p.y), x2 - x1 + 1);
+ }
+ }
+
+ #elif SNAKE_WH == 2
+
+ // At this scale draw two lines
+ LOOP_L_N(n, sdat.head_ind) {
+ const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1];
+ if (p.x == q.x) {
+ const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y));
+ if (PAGE_CONTAINS(y1, y2 + 1))
+ u8g.drawFrame(GAMEX(p.x), y1, 2, y2 - y1 + 1 + 1);
+ }
+ else {
+ const int8_t py = GAMEY(p.y);
+ if (PAGE_CONTAINS(py, py + 1)) {
+ const int8_t x1 = GAMEX(_MIN(p.x, q.x)), x2 = GAMEX(_MAX(p.x, q.x));
+ u8g.drawFrame(x1, py, x2 - x1 + 1 + 1, 2);
+ }
+ }
+ }
+
+ #else
+
+ // Draw a series of boxes
+ LOOP_L_N(n, sdat.head_ind) {
+ const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1];
+ if (p.x == q.x) {
+ const int8_t y1 = _MIN(p.y, q.y), y2 = _MAX(p.y, q.y);
+ if (PAGE_CONTAINS(GAMEY(y1), GAMEY(y2) + SNAKE_SIZ - 1)) {
+ for (int8_t i = y1; i <= y2; ++i) {
+ const int8_t y = GAMEY(i);
+ if (PAGE_CONTAINS(y, y + SNAKE_SIZ - 1))
+ u8g.drawBox(GAMEX(p.x), y, SNAKE_SIZ, SNAKE_SIZ);
+ }
+ }
+ }
+ else {
+ const int8_t py = GAMEY(p.y);
+ if (PAGE_CONTAINS(py, py + SNAKE_SIZ - 1)) {
+ const int8_t x1 = _MIN(p.x, q.x), x2 = _MAX(p.x, q.x);
+ for (int8_t i = x1; i <= x2; ++i)
+ u8g.drawBox(GAMEX(i), py, SNAKE_SIZ, SNAKE_SIZ);
+ }
+ }
+ }
+
+ #endif
+
+ // Draw food
+ const int8_t fy = GAMEY(sdat.foody);
+ if (PAGE_CONTAINS(fy, fy + FOOD_WH - 1)) {
+ const int8_t fx = GAMEX(sdat.foodx);
+ u8g.drawFrame(fx, fy, FOOD_WH, FOOD_WH);
+ if (FOOD_WH == 5) u8g.drawPixel(fx + 2, fy + 2);
+ }
+
+ // Draw GAME OVER
+ if (!game_state) draw_game_over();
+
+ // A click always exits this game
+ if (ui.use_click()) exit_game();
+}
+
+void SnakeGame::enter_game() {
+ init_game(1, game_screen); // 1 = Game running
+ snake_reset();
+ food_reset();
+}
+
+#endif // MARLIN_SNAKE
diff --git a/src/lcd/menu/game/snake.h b/src/lcd/menu/game/snake.h
new file mode 100644
index 0000000..09a3a72
--- /dev/null
+++ b/src/lcd/menu/game/snake.h
@@ -0,0 +1,38 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "types.h"
+
+typedef struct {
+ int8_t snake_dir, // NESW
+ foodx, foody,
+ food_cnt,
+ old_encoder;
+ pos_t snake_tail[50];
+ fixed_t snakex, snakey;
+ uint8_t head_ind;
+} snake_data_t;
+
+class SnakeGame : MarlinGame { public: static void enter_game(), game_screen(); };
+
+extern SnakeGame snake;
diff --git a/src/lcd/menu/game/types.h b/src/lcd/menu/game/types.h
new file mode 100644
index 0000000..6e0a205
--- /dev/null
+++ b/src/lcd/menu/game/types.h
@@ -0,0 +1,46 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include
+
+typedef struct { int8_t x, y; } pos_t;
+
+// Simple 8:8 fixed-point
+typedef int16_t fixed_t;
+#define FTOF(F) fixed_t((F)*256.0f)
+#define PTOF(P) (float(P)*(1.0f/256.0f))
+#define BTOF(X) (fixed_t(X)<<8)
+#define FTOB(X) int8_t(fixed_t(X)>>8)
+
+class MarlinGame {
+protected:
+ static int score;
+ static uint8_t game_state;
+ static millis_t next_frame;
+
+ static bool game_frame();
+ static void draw_game_over();
+ static void exit_game();
+public:
+ static void init_game(const uint8_t init_state, const screenFunc_t screen);
+};
diff --git a/src/lcd/menu/menu.cpp b/src/lcd/menu/menu.cpp
new file mode 100644
index 0000000..9dd7498
--- /dev/null
+++ b/src/lcd/menu/menu.cpp
@@ -0,0 +1,377 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if HAS_MARLINUI_MENU
+
+#include "menu.h"
+#include "../../module/planner.h"
+#include "../../module/motion.h"
+#include "../../module/printcounter.h"
+#include "../../module/temperature.h"
+#include "../../gcode/queue.h"
+
+#if HAS_SOUND
+ #include "../../libs/buzzer.h"
+#endif
+
+#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+ #include "../../module/probe.h"
+#endif
+
+#if HAS_LEVELING
+ #include "../../feature/bedlevel/bedlevel.h"
+#endif
+
+////////////////////////////////////////////
+///////////// Global Variables /////////////
+////////////////////////////////////////////
+
+#if HAS_LEVELING && ANY(LCD_BED_TRAMMING, PROBE_OFFSET_WIZARD, X_AXIS_TWIST_COMPENSATION)
+ bool leveling_was_active; // = false
+#endif
+#if ANY(PROBE_MANUALLY, MESH_BED_LEVELING, X_AXIS_TWIST_COMPENSATION)
+ uint8_t manual_probe_index; // = 0
+#endif
+
+// Menu Navigation
+int8_t encoderTopLine, encoderLine, screen_items;
+
+typedef struct {
+ screenFunc_t menu_function; // The screen's function
+ uint32_t encoder_position; // The position of the encoder
+ int8_t top_line, items; // The amount of scroll, and the number of items
+ #if SCREENS_CAN_TIME_OUT
+ bool sticky; // The screen is sticky
+ #endif
+} menuPosition;
+menuPosition screen_history[6];
+uint8_t screen_history_depth = 0;
+
+int8_t MenuItemBase::itemIndex; // Index number for draw and action
+FSTR_P MenuItemBase::itemStringF; // A string for substitution
+const char *MenuItemBase::itemStringC;
+chimera_t editable; // Value Editing
+
+// Menu Edit Items
+FSTR_P MenuEditItemBase::editLabel;
+void* MenuEditItemBase::editValue;
+int32_t MenuEditItemBase::minEditValue,
+ MenuEditItemBase::maxEditValue;
+screenFunc_t MenuEditItemBase::callbackFunc;
+bool MenuEditItemBase::liveEdit;
+
+////////////////////////////////////////////
+//////// Menu Navigation & History /////////
+////////////////////////////////////////////
+
+void MarlinUI::return_to_status() { goto_screen(status_screen); }
+
+void MarlinUI::push_current_screen() {
+ if (screen_history_depth < COUNT(screen_history))
+ screen_history[screen_history_depth++] = { currentScreen, encoderPosition, encoderTopLine, screen_items OPTARG(SCREENS_CAN_TIME_OUT, screen_is_sticky()) };
+}
+
+void MarlinUI::_goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_back/*=false*/)) {
+ IF_DISABLED(TURBO_BACK_MENU_ITEM, constexpr bool is_back = false);
+ TERN_(HAS_TOUCH_BUTTONS, on_edit_screen = false);
+ if (screen_history_depth > 0) {
+ menuPosition &sh = screen_history[--screen_history_depth];
+ goto_screen(sh.menu_function,
+ is_back ? 0 : sh.encoder_position,
+ is_back ? 0 : sh.top_line,
+ sh.items
+ );
+ defer_status_screen(TERN_(SCREENS_CAN_TIME_OUT, sh.sticky));
+ }
+ else
+ return_to_status();
+}
+
+////////////////////////////////////////////
+/////////// Menu Editing Actions ///////////
+////////////////////////////////////////////
+
+// All Edit Screens run the same way, but `draw_edit_screen` is implementation-specific
+void MenuEditItemBase::edit_screen(strfunc_t strfunc, loadfunc_t loadfunc) {
+ // Reset repeat_delay for Touch Buttons
+ TERN_(HAS_TOUCH_BUTTONS, ui.repeat_delay = BUTTON_DELAY_EDIT);
+ // Constrain ui.encoderPosition to 0 ... maxEditValue (calculated in encoder steps)
+ if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = 0;
+ if (int32_t(ui.encoderPosition) > maxEditValue) ui.encoderPosition = maxEditValue;
+ // If drawing is flagged then redraw the (whole) edit screen
+ if (ui.should_draw())
+ draw_edit_screen(strfunc(ui.encoderPosition + minEditValue));
+ // If there was a click or "live editing" and encoder moved...
+ if (ui.lcd_clicked || (liveEdit && ui.should_draw())) {
+ // Pass the editValue pointer to the loadfunc along with the encoder plus min
+ if (editValue) loadfunc(editValue, ui.encoderPosition + minEditValue);
+ // If a callbackFunc was set, call it for click or always for "live editing"
+ if (callbackFunc && (liveEdit || ui.lcd_clicked)) (*callbackFunc)();
+ // Use up the click to finish editing and go to the previous screen
+ if (ui.use_click()) ui.goto_previous_screen();
+ }
+}
+
+// Going to an edit screen sets up some persistent values first
+void MenuEditItemBase::goto_edit_screen(
+ FSTR_P const el, // Edit label
+ void * const ev, // Edit value pointer
+ const int32_t minv, // Encoder minimum
+ const int32_t maxv, // Encoder maximum
+ const uint16_t ep, // Initial encoder value
+ const screenFunc_t cs, // MenuItem_type::draw_edit_screen => MenuEditItemBase::edit()
+ const screenFunc_t cb, // Callback after edit
+ const bool le // Flag to call cb() during editing
+) {
+ TERN_(HAS_TOUCH_BUTTONS, ui.on_edit_screen = true);
+ ui.screen_changed = true;
+ ui.push_current_screen();
+ ui.refresh();
+ editLabel = el;
+ editValue = ev;
+ minEditValue = minv;
+ maxEditValue = maxv;
+ ui.encoderPosition = ep;
+ ui.currentScreen = cs;
+ callbackFunc = cb;
+ liveEdit = le;
+}
+
+////////////////////////////////////////////
+///////////////// Menu Tree ////////////////
+////////////////////////////////////////////
+
+#include "../../MarlinCore.h"
+
+/**
+ * General function to go directly to a screen
+ */
+void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, const uint8_t top/*=0*/, const uint8_t items/*=0*/) {
+ if (currentScreen != screen) {
+ thermalManager.set_menu_cold_override(false);
+
+ TERN_(IS_DWIN_MARLINUI, did_first_redraw = false);
+
+ TERN_(HAS_TOUCH_BUTTONS, repeat_delay = BUTTON_DELAY_MENU);
+
+ TERN_(LCD_SET_PROGRESS_MANUALLY, progress_reset());
+
+ #if BOTH(DOUBLECLICK_FOR_Z_BABYSTEPPING, BABYSTEPPING)
+ static millis_t doubleclick_expire_ms = 0;
+ // Going to menu_main from status screen? Remember first click time.
+ // Going back to status screen within a very short time? Go to Z babystepping.
+ if (screen == menu_main) {
+ if (on_status_screen())
+ doubleclick_expire_ms = millis() + DOUBLECLICK_MAX_INTERVAL;
+ }
+ else if (screen == status_screen && currentScreen == menu_main && PENDING(millis(), doubleclick_expire_ms)) {
+ if (BABYSTEP_ALLOWED())
+ screen = TERN(BABYSTEP_ZPROBE_OFFSET, lcd_babystep_zoffset, lcd_babystep_z);
+ else {
+ #if ENABLED(MOVE_Z_WHEN_IDLE)
+ ui.manual_move.menu_scale = MOVE_Z_IDLE_MULTIPLICATOR;
+ screen = []{ lcd_move_axis(Z_AXIS); };
+ #endif
+ }
+ }
+ #endif
+
+ currentScreen = screen;
+ encoderPosition = encoder;
+ encoderTopLine = top;
+ screen_items = items;
+ if (on_status_screen()) {
+ defer_status_screen(false);
+ clear_menu_history();
+ TERN_(AUTO_BED_LEVELING_UBL, bedlevel.lcd_map_control = false);
+ }
+
+ clear_lcd();
+
+ // Re-initialize custom characters that may be re-used
+ #if HAS_MARLINUI_HD44780
+ if (TERN1(AUTO_BED_LEVELING_UBL, !bedlevel.lcd_map_control))
+ set_custom_characters(on_status_screen() ? CHARSET_INFO : CHARSET_MENU);
+ #endif
+
+ refresh(LCDVIEW_CALL_REDRAW_NEXT);
+ screen_changed = true;
+ TERN_(HAS_MARLINUI_U8GLIB, drawing_screen = false);
+
+ TERN_(HAS_MARLINUI_MENU, encoder_direction_normal());
+
+ set_selection(false);
+ }
+}
+
+////////////////////////////////////////////
+///////////// Manual Movement //////////////
+////////////////////////////////////////////
+
+//
+// Display a "synchronize" screen with a custom message until
+// all moves are finished. Go back to calling screen when done.
+//
+void MarlinUI::synchronize(FSTR_P const fmsg/*=nullptr*/) {
+ static FSTR_P sync_message = fmsg ?: GET_TEXT_F(MSG_MOVING);
+ push_current_screen();
+ goto_screen([]{
+ if (should_draw()) MenuItem_static::draw(LCD_HEIGHT >= 4, sync_message);
+ });
+ defer_status_screen();
+ planner.synchronize(); // idle() is called until moves complete
+ goto_previous_screen_no_defer();
+}
+
+/**
+ * Scrolling for menus and other line-based screens
+ *
+ * encoderLine is the position based on the encoder
+ * encoderTopLine is the top menu line to display
+ * screen_items is the total number of items in the menu (after one call)
+ */
+void scroll_screen(const uint8_t limit, const bool is_menu) {
+ ui.encoder_direction_menus();
+ ENCODER_RATE_MULTIPLY(false);
+ if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = 0;
+ if (ui.first_page) {
+ encoderLine = ui.encoderPosition / (ENCODER_STEPS_PER_MENU_ITEM);
+ ui.screen_changed = false;
+ }
+ if (screen_items > 0 && encoderLine >= screen_items - limit) {
+ encoderLine = _MAX(0, screen_items - limit);
+ ui.encoderPosition = encoderLine * (ENCODER_STEPS_PER_MENU_ITEM);
+ }
+ if (is_menu) {
+ NOMORE(encoderTopLine, encoderLine);
+ if (encoderLine >= encoderTopLine + LCD_HEIGHT)
+ encoderTopLine = encoderLine - LCD_HEIGHT + 1;
+ }
+ else
+ encoderTopLine = encoderLine;
+}
+
+#if HAS_SOUND
+ void MarlinUI::completion_feedback(const bool good/*=true*/) {
+ TERN_(HAS_TOUCH_SLEEP, wakeup_screen()); // Wake up on rotary encoder click...
+ if (good) OKAY_BUZZ(); else ERR_BUZZ();
+ }
+#endif
+
+#if HAS_LINE_TO_Z
+
+ void line_to_z(const_float_t z) {
+ current_position.z = z;
+ line_to_current_position(manual_feedrate_mm_s.z);
+ }
+
+#endif
+
+#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+
+ #include "../../feature/babystep.h"
+
+ void lcd_babystep_zoffset() {
+ if (ui.use_click()) return ui.goto_previous_screen_no_defer();
+ ui.defer_status_screen();
+ const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0;
+ if (ui.encoderPosition) {
+ const int16_t babystep_increment = int16_t(ui.encoderPosition) * (BABYSTEP_SIZE_Z);
+ ui.encoderPosition = 0;
+
+ const float diff = planner.mm_per_step[Z_AXIS] * babystep_increment,
+ new_probe_offset = probe.offset.z + diff,
+ new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET
+ , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - diff
+ , new_probe_offset
+ );
+ if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) {
+
+ babystep.add_steps(Z_AXIS, babystep_increment);
+
+ if (do_probe)
+ probe.offset.z = new_offs;
+ else
+ TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP);
+
+ ui.refresh(LCDVIEW_CALL_REDRAW_NEXT);
+ }
+ }
+ if (ui.should_draw()) {
+ if (do_probe) {
+ MenuEditItemBase::draw_edit_screen(GET_TEXT_F(MSG_ZPROBE_ZOFFSET), BABYSTEP_TO_STR(probe.offset.z));
+ TERN_(BABYSTEP_ZPROBE_GFX_OVERLAY, ui.zoffset_overlay(probe.offset.z));
+ }
+ else {
+ #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET)
+ MenuEditItemBase::draw_edit_screen(GET_TEXT_F(MSG_HOTEND_OFFSET_Z), ftostr54sign(hotend_offset[active_extruder].z));
+ #endif
+ }
+ }
+ }
+
+#endif // BABYSTEP_ZPROBE_OFFSET
+
+void _lcd_draw_homing() {
+ if (ui.should_draw()) {
+ constexpr uint8_t line = (LCD_HEIGHT - 1) / 2;
+ MenuItem_static::draw(line, GET_TEXT_F(MSG_LEVEL_BED_HOMING));
+ }
+}
+
+#if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS))
+ void _lcd_toggle_bed_leveling() { set_bed_leveling_enabled(!planner.leveling_active); }
+#endif
+
+//
+// Selection screen presents a prompt and two options
+//
+bool MarlinUI::selection; // = false
+bool MarlinUI::update_selection() {
+ encoder_direction_select();
+ if (encoderPosition) {
+ selection = int16_t(encoderPosition) > 0;
+ encoderPosition = 0;
+ }
+ return selection;
+}
+
+void MenuItem_confirm::select_screen(
+ FSTR_P const yes, FSTR_P const no,
+ selectFunc_t yesFunc, selectFunc_t noFunc,
+ FSTR_P const pref, const char * const string/*=nullptr*/, FSTR_P const suff/*=nullptr*/
+) {
+ ui.defer_status_screen();
+ const bool ui_selection = !yes ? false : !no || ui.update_selection(),
+ got_click = ui.use_click();
+ if (got_click || ui.should_draw()) {
+ draw_select_screen(yes, no, ui_selection, pref, string, suff);
+ if (got_click) {
+ selectFunc_t callFunc = ui_selection ? yesFunc : noFunc;
+ if (callFunc) callFunc(); else ui.goto_previous_screen();
+ }
+ }
+}
+
+#endif // HAS_MARLINUI_MENU
diff --git a/src/lcd/menu/menu.h b/src/lcd/menu/menu.h
new file mode 100644
index 0000000..befffe5
--- /dev/null
+++ b/src/lcd/menu/menu.h
@@ -0,0 +1,272 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "../marlinui.h"
+#include "../../libs/numtostr.h"
+#include "../../inc/MarlinConfig.h"
+
+#include "limits.h"
+
+extern int8_t encoderLine, encoderTopLine, screen_items;
+
+void scroll_screen(const uint8_t limit, const bool is_menu);
+
+typedef void (*selectFunc_t)();
+
+#define SS_LEFT 0x00
+#define SS_CENTER 0x01
+#define SS_INVERT 0x02
+#define SS_DEFAULT SS_CENTER
+
+#if ENABLED(BABYSTEP_ZPROBE_OFFSET) && Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9
+ #define BABYSTEP_TO_STR(N) ftostr43sign(N)
+#elif ENABLED(BABYSTEPPING)
+ #define BABYSTEP_TO_STR(N) ftostr53sign(N)
+#endif
+
+////////////////////////////////////////////
+///////////// Base Menu Items //////////////
+////////////////////////////////////////////
+
+class MenuItemBase {
+ public:
+ // Index to interject in the item label and/or for use by its action.
+ static int8_t itemIndex;
+
+ // Optional pointers for use in display or by the action
+ static FSTR_P itemStringF;
+ static const char* itemStringC;
+
+ // Store an index and string for later substitution
+ FORCE_INLINE static void init(const int8_t ind=0, FSTR_P const fstr=nullptr) { itemIndex = ind; itemStringF = fstr; itemStringC = nullptr; }
+ FORCE_INLINE static void init(const int8_t ind, const char * const cstr) { itemIndex = ind; itemStringC = cstr; itemStringF = nullptr; }
+
+ // Implementation-specific:
+ // Draw an item either selected (pre_char) or not (space) with post_char
+ // Menus may set up itemIndex, itemStringC/F and pass them to string-building or string-emitting functions
+ static void _draw(const bool sel, const uint8_t row, FSTR_P const fstr, const char pre_char, const char post_char);
+
+ // Draw an item either selected ('>') or not (space) with post_char
+ FORCE_INLINE static void _draw(const bool sel, const uint8_t row, FSTR_P const fstr, const char post_char) {
+ _draw(sel, row, fstr, '>', post_char);
+ }
+};
+
+// STATIC_ITEM(LABEL,...)
+class MenuItem_static : public MenuItemBase {
+ public:
+ static void draw(const uint8_t row, FSTR_P const fstr, const uint8_t style=SS_DEFAULT, const char * const vstr=nullptr);
+};
+
+// BACK_ITEM(LABEL)
+class MenuItem_back : public MenuItemBase {
+ public:
+ FORCE_INLINE static void draw(const bool sel, const uint8_t row, FSTR_P const fstr) {
+ _draw(sel, row, fstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]);
+ }
+ // Back Item action goes back one step in history
+ FORCE_INLINE static void action(FSTR_P const=nullptr) { ui.go_back(); }
+};
+
+// CONFIRM_ITEM(LABEL,Y,N,FY,FN,...),
+// YESNO_ITEM(LABEL,FY,FN,...)
+class MenuItem_confirm : public MenuItemBase {
+ public:
+ FORCE_INLINE static void draw(const bool sel, const uint8_t row, FSTR_P const ftpl, ...) {
+ _draw(sel, row, ftpl, '>', LCD_STR_ARROW_RIGHT[0]);
+ }
+ // Implemented for HD44780 and DOGM
+ // Draw the prompt, buttons, and state
+ static void draw_select_screen(
+ FSTR_P const yes, // Right option label
+ FSTR_P const no, // Left option label
+ const bool yesno, // Is "yes" selected?
+ FSTR_P const pref, // Prompt prefix
+ const char * const string, // Prompt runtime string
+ FSTR_P const suff // Prompt suffix
+ );
+ static void select_screen(
+ FSTR_P const yes, FSTR_P const no,
+ selectFunc_t yesFunc, selectFunc_t noFunc,
+ FSTR_P const pref, const char * const string=nullptr, FSTR_P const suff=nullptr
+ );
+ static void select_screen(
+ FSTR_P const yes, FSTR_P const no,
+ selectFunc_t yesFunc, selectFunc_t noFunc,
+ FSTR_P const pref, FSTR_P const fstr, FSTR_P const suff=nullptr
+ ) {
+ #ifdef __AVR__
+ char str[strlen_P(FTOP(fstr)) + 1];
+ strcpy_P(str, FTOP(fstr));
+ select_screen(yes, no, yesFunc, noFunc, pref, str, suff);
+ #else
+ select_screen(yes, no, yesFunc, noFunc, pref, FTOP(fstr), suff);
+ #endif
+ }
+ // Shortcut for prompt with "NO"/ "YES" labels
+ FORCE_INLINE static void confirm_screen(selectFunc_t yesFunc, selectFunc_t noFunc, FSTR_P const pref, const char * const string=nullptr, FSTR_P const suff=nullptr) {
+ select_screen(GET_TEXT_F(MSG_YES), GET_TEXT_F(MSG_NO), yesFunc, noFunc, pref, string, suff);
+ }
+};
+
+////////////////////////////////////////////
+///////////// Edit Menu Items //////////////
+////////////////////////////////////////////
+
+// The Menu Edit shadow value
+typedef union {
+ bool state;
+ float decimal;
+ int8_t int8;
+ int16_t int16;
+ int32_t int32;
+ uint8_t uint8;
+ uint16_t uint16;
+ uint32_t uint32;
+ celsius_t celsius;
+} chimera_t;
+extern chimera_t editable;
+
+// Base class for Menu Edit Items
+class MenuEditItemBase : public MenuItemBase {
+ private:
+ // These values are statically constructed by init() via action()
+ // The action() method acts like the instantiator. The entire lifespan
+ // of a menu item is within its declaration, so all these values decompose
+ // into behavior and unused items get optimized out.
+ static FSTR_P editLabel;
+ static void *editValue;
+ static int32_t minEditValue, maxEditValue; // Encoder value range
+ static screenFunc_t callbackFunc;
+ static bool liveEdit;
+ protected:
+ typedef const char* (*strfunc_t)(const int32_t);
+ typedef void (*loadfunc_t)(void *, const int32_t);
+ static void goto_edit_screen(
+ FSTR_P const el, // Edit label
+ void * const ev, // Edit value pointer
+ const int32_t minv, // Encoder minimum
+ const int32_t maxv, // Encoder maximum
+ const uint16_t ep, // Initial encoder value
+ const screenFunc_t cs, // MenuItem_type::draw_edit_screen => MenuEditItemBase::edit()
+ const screenFunc_t cb, // Callback after edit
+ const bool le // Flag to call cb() during editing
+ );
+ static void edit_screen(strfunc_t, loadfunc_t); // Edit value handler
+ public:
+ // Implementation-specific:
+ // Draw the current item at specified row with edit data
+ static void draw(const bool sel, const uint8_t row, FSTR_P const ftpl, const char * const inStr, const bool pgm=false);
+
+ static void draw(const bool sel, const uint8_t row, FSTR_P const ftpl, FSTR_P const fstr) {
+ draw(sel, row, ftpl, FTOP(fstr), true);
+ }
+
+ // Implementation-specific:
+ // This low-level method is good to draw from anywhere
+ static void draw_edit_screen(FSTR_P const fstr, const char * const value);
+
+ // This method is for the current menu item
+ static void draw_edit_screen(const char * const value) { draw_edit_screen(editLabel, value); }
+};
+
+#if ENABLED(SDSUPPORT)
+ class CardReader;
+ class MenuItem_sdbase {
+ public:
+ // Implemented for HD44780 and DOGM
+ static void draw(const bool sel, const uint8_t row, FSTR_P const fstr, CardReader &theCard, const bool isDir);
+ };
+#endif
+
+////////////////////////////////////////////
+/////////////// Menu Screens ///////////////
+////////////////////////////////////////////
+
+void menu_main();
+void menu_move();
+
+#if ENABLED(SDSUPPORT)
+ void menu_media();
+#endif
+
+////////////////////////////////////////////
+//////// Menu Item Helper Functions ////////
+////////////////////////////////////////////
+
+void _lcd_draw_homing();
+
+#define HAS_LINE_TO_Z ANY(DELTA, PROBE_MANUALLY, MESH_BED_LEVELING, LCD_BED_TRAMMING)
+
+#if HAS_LINE_TO_Z
+ void line_to_z(const_float_t z);
+#endif
+
+#if ENABLED(PROBE_OFFSET_WIZARD)
+ void goto_probe_offset_wizard();
+#endif
+
+#if ENABLED(X_AXIS_TWIST_COMPENSATION)
+ void xatc_wizard_continue();
+ void menu_advanced_settings();
+#endif
+
+#if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS))
+ void _lcd_toggle_bed_leveling();
+#endif
+
+#if ENABLED(BABYSTEPPING)
+ #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+ void lcd_babystep_zoffset();
+ #else
+ void lcd_babystep_z();
+ #endif
+
+ #if ENABLED(BABYSTEP_MILLIMETER_UNITS)
+ #define BABYSTEP_SIZE_X int32_t((BABYSTEP_MULTIPLICATOR_XY) * planner.settings.axis_steps_per_mm[X_AXIS])
+ #define BABYSTEP_SIZE_Y int32_t((BABYSTEP_MULTIPLICATOR_XY) * planner.settings.axis_steps_per_mm[Y_AXIS])
+ #define BABYSTEP_SIZE_Z int32_t((BABYSTEP_MULTIPLICATOR_Z) * planner.settings.axis_steps_per_mm[Z_AXIS])
+ #else
+ #define BABYSTEP_SIZE_X BABYSTEP_MULTIPLICATOR_XY
+ #define BABYSTEP_SIZE_Y BABYSTEP_MULTIPLICATOR_XY
+ #define BABYSTEP_SIZE_Z BABYSTEP_MULTIPLICATOR_Z
+ #endif
+
+#endif
+
+#if ENABLED(TOUCH_SCREEN_CALIBRATION)
+ void touch_screen_calibration();
+#endif
+
+extern uint8_t screen_history_depth;
+inline void clear_menu_history() { screen_history_depth = 0; }
+
+#define STICKY_SCREEN(S) []{ ui.defer_status_screen(); ui.goto_screen(S); }
+
+#if HAS_LEVELING && ANY(LCD_BED_TRAMMING, PROBE_OFFSET_WIZARD, X_AXIS_TWIST_COMPENSATION)
+ extern bool leveling_was_active;
+#endif
+
+#if ANY(PROBE_MANUALLY, MESH_BED_LEVELING, X_AXIS_TWIST_COMPENSATION)
+ extern uint8_t manual_probe_index;
+#endif
diff --git a/src/lcd/menu/menu_addon.h b/src/lcd/menu/menu_addon.h
new file mode 100644
index 0000000..73e7061
--- /dev/null
+++ b/src/lcd/menu/menu_addon.h
@@ -0,0 +1,33 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "../lcdprint.h"
+
+#define _MENU_ITEM_ADDON_START(N,X) do{ \
+ if (ui.should_draw() && _menuLineNr == _thisItemNr - 1) { \
+ N(X)
+
+#define MENU_ITEM_ADDON_START(X) _MENU_ITEM_ADDON_START(SETCURSOR_X, X)
+#define MENU_ITEM_ADDON_START_RJ(X) _MENU_ITEM_ADDON_START(SETCURSOR_X_RJ, X)
+
+#define MENU_ITEM_ADDON_END() } }while(0)
diff --git a/src/lcd/menu/menu_advanced.cpp b/src/lcd/menu/menu_advanced.cpp
new file mode 100644
index 0000000..b8234dc
--- /dev/null
+++ b/src/lcd/menu/menu_advanced.cpp
@@ -0,0 +1,704 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Advanced Settings Menus
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if HAS_MARLINUI_MENU
+
+#include "menu_item.h"
+#include "../../MarlinCore.h"
+#include "../../module/planner.h"
+
+#if DISABLED(NO_VOLUMETRICS)
+ #include "../../gcode/parser.h"
+#endif
+
+#if HAS_BED_PROBE
+ #include "../../module/probe.h"
+#endif
+
+#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER)
+ #include "../../module/temperature.h"
+#endif
+
+#if HAS_FILAMENT_RUNOUT_DISTANCE
+ #include "../../feature/runout.h"
+#endif
+
+#if ENABLED(SD_FIRMWARE_UPDATE)
+ #include "../../module/settings.h"
+#endif
+
+#if ENABLED(PASSWORD_FEATURE)
+ #include "../../feature/password/password.h"
+#endif
+
+void menu_tmc();
+void menu_backlash();
+
+#if HAS_MOTOR_CURRENT_DAC
+
+ #include "../../feature/dac/stepper_dac.h"
+
+ void menu_dac() {
+ static xyze_uint8_t driverPercent;
+ LOOP_LOGICAL_AXES(i) driverPercent[i] = stepper_dac.get_current_percent((AxisEnum)i);
+ START_MENU();
+ BACK_ITEM(MSG_ADVANCED_SETTINGS);
+
+ LOOP_LOGICAL_AXES(a)
+ EDIT_ITEM_N(uint8, a, MSG_DAC_PERCENT_N, &driverPercent[a], 0, 100, []{ stepper_dac.set_current_percents(driverPercent); });
+
+ ACTION_ITEM(MSG_DAC_EEPROM_WRITE, stepper_dac.commit_eeprom);
+ END_MENU();
+ }
+
+#endif
+
+#if HAS_MOTOR_CURRENT_PWM
+
+ #include "../../module/stepper.h"
+
+ void menu_pwm() {
+ START_MENU();
+ BACK_ITEM(MSG_ADVANCED_SETTINGS);
+ #define EDIT_CURRENT_PWM(LABEL,I) EDIT_ITEM_F(long5, F(LABEL), &stepper.motor_current_setting[I], 100, 2000, stepper.refresh_motor_power)
+ #if ANY_PIN(MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y)
+ EDIT_CURRENT_PWM(STR_A STR_B, 0);
+ #endif
+ #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
+ EDIT_CURRENT_PWM(STR_C, 1);
+ #endif
+ #if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
+ EDIT_CURRENT_PWM(STR_E, 2);
+ #endif
+ END_MENU();
+ }
+
+#endif
+
+#if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE)
+ //
+ // Advanced Settings > Filament
+ //
+ void menu_advanced_filament() {
+ START_MENU();
+ BACK_ITEM(MSG_ADVANCED_SETTINGS);
+
+ #if ENABLED(LIN_ADVANCE)
+ #if EXTRUDERS == 1
+ EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 10);
+ #elif HAS_MULTI_EXTRUDER
+ EXTRUDER_LOOP()
+ EDIT_ITEM_N(float42_52, e, MSG_ADVANCE_K_E, &planner.extruder_advance_K[e], 0, 10);
+ #endif
+ #endif
+
+ #if DISABLED(NO_VOLUMETRICS)
+ EDIT_ITEM(bool, MSG_VOLUMETRIC_ENABLED, &parser.volumetric_enabled, planner.calculate_volumetric_multipliers);
+
+ #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT)
+ EDIT_ITEM_FAST(float42_52, MSG_VOLUMETRIC_LIMIT, &planner.volumetric_extruder_limit[active_extruder], 0.0f, 20.0f, planner.calculate_volumetric_extruder_limits);
+ #if HAS_MULTI_EXTRUDER
+ EXTRUDER_LOOP()
+ EDIT_ITEM_FAST_N(float42_52, e, MSG_VOLUMETRIC_LIMIT_E, &planner.volumetric_extruder_limit[e], 0.0f, 20.00f, planner.calculate_volumetric_extruder_limits);
+ #endif
+ #endif
+
+ if (parser.volumetric_enabled) {
+ EDIT_ITEM_FAST(float43, MSG_FILAMENT_DIAM, &planner.filament_size[active_extruder], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
+ #if HAS_MULTI_EXTRUDER
+ EXTRUDER_LOOP()
+ EDIT_ITEM_FAST_N(float43, e, MSG_FILAMENT_DIAM_E, &planner.filament_size[e], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
+ #endif
+ }
+ #endif
+
+ #if ENABLED(ADVANCED_PAUSE_FEATURE)
+ constexpr float extrude_maxlength = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 999);
+
+ EDIT_ITEM_FAST(float4, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength);
+ #if HAS_MULTI_EXTRUDER
+ EXTRUDER_LOOP()
+ EDIT_ITEM_FAST_N(float4, e, MSG_FILAMENTUNLOAD_E, &fc_settings[e].unload_length, 0, extrude_maxlength);
+ #endif
+
+ EDIT_ITEM_FAST(float4, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength);
+ #if HAS_MULTI_EXTRUDER
+ EXTRUDER_LOOP()
+ EDIT_ITEM_FAST_N(float4, e, MSG_FILAMENTLOAD_E, &fc_settings[e].load_length, 0, extrude_maxlength);
+ #endif
+ #endif
+
+ #if HAS_FILAMENT_RUNOUT_DISTANCE
+ editable.decimal = runout.runout_distance();
+ EDIT_ITEM_FAST(float3, MSG_RUNOUT_DISTANCE_MM, &editable.decimal, 1, 999,
+ []{ runout.set_runout_distance(editable.decimal); }, true
+ );
+ #endif
+
+ END_MENU();
+ }
+
+#endif // !NO_VOLUMETRICS || ADVANCED_PAUSE_FEATURE
+
+//
+// Advanced Settings > Temperature helpers
+//
+
+#if ENABLED(PID_AUTOTUNE_MENU)
+
+ #if ENABLED(PIDTEMP)
+ int16_t autotune_temp[HOTENDS] = ARRAY_BY_HOTENDS1(PREHEAT_1_TEMP_HOTEND);
+ #endif
+ #if ENABLED(PIDTEMPBED)
+ int16_t autotune_temp_bed = PREHEAT_1_TEMP_BED;
+ #endif
+ #if ENABLED(PIDTEMPCHAMBER)
+ int16_t autotune_temp_chamber = PREHEAT_1_TEMP_CHAMBER;
+ #endif
+
+ #include "../../gcode/queue.h"
+
+ void _lcd_autotune(const heater_id_t hid) {
+ char cmd[30];
+ int16_t tune_temp;
+ switch (hid) {
+ #if ENABLED(PIDTEMPBED)
+ case H_BED: tune_temp = autotune_temp_bed; break;
+ #endif
+ #if ENABLED(PIDTEMPCHAMBER)
+ case H_CHAMBER: tune_temp = autotune_temp_chamber; break;
+ #endif
+ default:
+ #if ENABLED(PIDTEMP)
+ tune_temp = autotune_temp[hid]; break;
+ #else
+ return;
+ #endif
+ }
+ sprintf_P(cmd, PSTR("M303 U1 E%i S%i"), hid, tune_temp);
+ queue.inject(cmd);
+ ui.return_to_status();
+ }
+
+#endif // PID_AUTOTUNE_MENU
+
+#if ENABLED(PID_EDIT_MENU)
+
+ float raw_Ki, raw_Kd; // place-holders for Ki and Kd edits
+
+ // Helpers for editing PID Ki & Kd values
+ // grab the PID value out of the temp variable; scale it; then update the PID driver
+ void copy_and_scalePID_i(const int8_t e) {
+ switch (e) {
+ #if ENABLED(PIDTEMPBED)
+ case H_BED: thermalManager.temp_bed.pid.Ki = scalePID_i(raw_Ki); break;
+ #endif
+ #if ENABLED(PIDTEMPCHAMBER)
+ case H_CHAMBER: thermalManager.temp_chamber.pid.Ki = scalePID_i(raw_Ki); break;
+ #endif
+ default:
+ #if ENABLED(PIDTEMP)
+ PID_PARAM(Ki, e) = scalePID_i(raw_Ki);
+ thermalManager.updatePID();
+ #endif
+ break;
+ }
+ }
+ void copy_and_scalePID_d(const int8_t e) {
+ switch (e) {
+ #if ENABLED(PIDTEMPBED)
+ case H_BED: thermalManager.temp_bed.pid.Kd = scalePID_d(raw_Kd); break;
+ #endif
+ #if ENABLED(PIDTEMPCHAMBER)
+ case H_CHAMBER: thermalManager.temp_chamber.pid.Kd = scalePID_d(raw_Kd); break;
+ #endif
+ default:
+ #if ENABLED(PIDTEMP)
+ PID_PARAM(Kd, e) = scalePID_d(raw_Kd);
+ thermalManager.updatePID();
+ #endif
+ break;
+ }
+ }
+#endif
+
+#if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) || ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU, MPC_AUTOTUNE_MENU, MPC_EDIT_MENU)
+ #define SHOW_MENU_ADVANCED_TEMPERATURE 1
+#endif
+
+//
+// Advanced Settings > Temperature
+//
+#if SHOW_MENU_ADVANCED_TEMPERATURE
+
+ #if ENABLED(MPC_EDIT_MENU)
+ #define MPC_EDIT_DEFS(N) \
+ MPC_t &c = thermalManager.temp_hotend[N].constants; \
+ TERN_(MPC_INCLUDE_FAN, editable.decimal = c.ambient_xfer_coeff_fan0 + c.fan255_adjustment)
+ #endif
+
+ void menu_advanced_temperature() {
+ #if ENABLED(MPC_EDIT_MENU) && !HAS_MULTI_HOTEND
+ MPC_EDIT_DEFS(0);
+ #endif
+
+ START_MENU();
+ BACK_ITEM(MSG_ADVANCED_SETTINGS);
+
+ //
+ // Autotemp, Min, Max, Fact
+ //
+ #if BOTH(AUTOTEMP, HAS_TEMP_HOTEND)
+ EDIT_ITEM(bool, MSG_AUTOTEMP, &planner.autotemp_enabled);
+ EDIT_ITEM(int3, MSG_MIN, &planner.autotemp_min, 0, thermalManager.hotend_max_target(0));
+ EDIT_ITEM(int3, MSG_MAX, &planner.autotemp_max, 0, thermalManager.hotend_max_target(0));
+ EDIT_ITEM(float42_52, MSG_FACTOR, &planner.autotemp_factor, 0, 10);
+ #endif
+
+ //
+ // PID-P, PID-I, PID-D, PID-C, PID Autotune
+ // PID-P E1, PID-I E1, PID-D E1, PID-C E1, PID Autotune E1
+ // PID-P E2, PID-I E2, PID-D E2, PID-C E2, PID Autotune E2
+ // PID-P E3, PID-I E3, PID-D E3, PID-C E3, PID Autotune E3
+ // PID-P E4, PID-I E4, PID-D E4, PID-C E4, PID Autotune E4
+ // PID-P E5, PID-I E5, PID-D E5, PID-C E5, PID Autotune E5
+ //
+
+ #if BOTH(PIDTEMP, PID_EDIT_MENU)
+ #define __PID_HOTEND_MENU_ITEMS(N) \
+ raw_Ki = unscalePID_i(PID_PARAM(Ki, N)); \
+ raw_Kd = unscalePID_d(PID_PARAM(Kd, N)); \
+ EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &PID_PARAM(Kp, N), 1, 9990); \
+ EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \
+ EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); })
+
+ #if ENABLED(PID_EXTRUSION_SCALING)
+ #define _PID_HOTEND_MENU_ITEMS(N) \
+ __PID_HOTEND_MENU_ITEMS(N); \
+ EDIT_ITEM_N(float4, N, MSG_PID_C_E, &PID_PARAM(Kc, N), 1, 9990)
+ #else
+ #define _PID_HOTEND_MENU_ITEMS(N) __PID_HOTEND_MENU_ITEMS(N)
+ #endif
+
+ #if ENABLED(PID_FAN_SCALING)
+ #define _HOTEND_PID_EDIT_MENU_ITEMS(N) \
+ _PID_HOTEND_MENU_ITEMS(N); \
+ EDIT_ITEM_N(float4, N, MSG_PID_F_E, &PID_PARAM(Kf, N), 1, 9990)
+ #else
+ #define _HOTEND_PID_EDIT_MENU_ITEMS(N) _PID_HOTEND_MENU_ITEMS(N)
+ #endif
+
+ #else
+
+ #define _HOTEND_PID_EDIT_MENU_ITEMS(N) NOOP
+
+ #endif
+
+ #if ENABLED(PID_EDIT_MENU) && EITHER(PIDTEMPBED, PIDTEMPCHAMBER)
+ #define _PID_EDIT_ITEMS_TMPL(N,T) \
+ raw_Ki = unscalePID_i(T.pid.Ki); \
+ raw_Kd = unscalePID_d(T.pid.Kd); \
+ EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &T.pid.Kp, 1, 9990); \
+ EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \
+ EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); })
+ #endif
+
+ #if ENABLED(PIDTEMP)
+ #if ENABLED(PID_AUTOTUNE_MENU)
+ #define HOTEND_PID_EDIT_MENU_ITEMS(N) \
+ _HOTEND_PID_EDIT_MENU_ITEMS(N); \
+ EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.hotend_max_target(N), []{ _lcd_autotune(heater_id_t(MenuItemBase::itemIndex)); });
+ #else
+ #define HOTEND_PID_EDIT_MENU_ITEMS(N) _HOTEND_PID_EDIT_MENU_ITEMS(N);
+ #endif
+
+ HOTEND_PID_EDIT_MENU_ITEMS(0);
+ #if ENABLED(PID_PARAMS_PER_HOTEND)
+ REPEAT_S(1, HOTENDS, HOTEND_PID_EDIT_MENU_ITEMS);
+ #endif
+ #endif
+
+ #if ENABLED(MPC_EDIT_MENU)
+
+ #define _MPC_EDIT_ITEMS(N) \
+ EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_POWER_E, &c.heater_power, 1, 200); \
+ EDIT_ITEM_FAST_N(float31sign, N, MSG_MPC_BLOCK_HEAT_CAPACITY_E, &c.block_heat_capacity, 0, 40); \
+ EDIT_ITEM_FAST_N(float43, N, MSG_SENSOR_RESPONSIVENESS_E, &c.sensor_responsiveness, 0, 1); \
+ EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_E, &c.ambient_xfer_coeff_fan0, 0, 1)
+
+ #if ENABLED(MPC_INCLUDE_FAN)
+ #define MPC_EDIT_ITEMS(N) \
+ _MPC_EDIT_ITEMS(N); \
+ EDIT_ITEM_FAST_N(float43, N, MSG_MPC_AMBIENT_XFER_COEFF_FAN_E, &editable.decimal, 0, 1, []{ \
+ MPC_t &c = thermalManager.temp_hotend[MenuItemBase::itemIndex].constants; \
+ c.fan255_adjustment = editable.decimal - c.ambient_xfer_coeff_fan0; \
+ })
+ #else
+ #define MPC_EDIT_ITEMS _MPC_EDIT_ITEMS
+ #endif
+
+ #if HAS_MULTI_HOTEND
+ static auto mpc_edit_hotend = [](const uint8_t e) {
+ MPC_EDIT_DEFS(e);
+ START_MENU();
+ BACK_ITEM(MSG_TEMPERATURE);
+ MPC_EDIT_ITEMS(e);
+ END_MENU();
+ };
+ #define MPC_ENTRY(N) SUBMENU_N(N, MSG_MPC_EDIT, []{ mpc_edit_hotend(MenuItemBase::itemIndex); });
+ #else
+ #define MPC_ENTRY MPC_EDIT_ITEMS
+ #endif
+
+ REPEAT(HOTENDS, MPC_ENTRY);
+
+ #endif // MPC_EDIT_MENU
+
+ #if ENABLED(MPC_AUTOTUNE_MENU)
+ ACTION_ITEM(MSG_MPC_AUTOTUNE, []{ queue.inject(F("M306 T")); ui.return_to_status(); });
+ #endif
+
+ #if ENABLED(PIDTEMPBED)
+ #if ENABLED(PID_EDIT_MENU)
+ _PID_EDIT_ITEMS_TMPL(H_BED, thermalManager.temp_bed);
+ #endif
+ #if ENABLED(PID_AUTOTUNE_MENU)
+ EDIT_ITEM_FAST_N(int3, H_BED, MSG_PID_AUTOTUNE_E, &autotune_temp_bed, PREHEAT_1_TEMP_BED, BED_MAX_TARGET, []{ _lcd_autotune(H_BED); });
+ #endif
+ #endif
+
+ #if ENABLED(PIDTEMPCHAMBER)
+ #if ENABLED(PID_EDIT_MENU)
+ _PID_EDIT_ITEMS_TMPL(H_CHAMBER, thermalManager.temp_chamber);
+ #endif
+ #if ENABLED(PID_AUTOTUNE_MENU)
+ EDIT_ITEM_FAST_N(int3, H_CHAMBER, MSG_PID_AUTOTUNE_E, &autotune_temp_chamber, PREHEAT_1_TEMP_CHAMBER, CHAMBER_MAX_TARGET, []{ _lcd_autotune(H_CHAMBER); });
+ #endif
+ #endif
+
+ END_MENU();
+ }
+
+#endif // SHOW_MENU_ADVANCED_TEMPERATURE
+
+#if DISABLED(SLIM_LCD_MENUS)
+
+ // M203 / M205 Velocity options
+ void menu_advanced_velocity() {
+ // M203 Max Feedrate
+ constexpr xyze_feedrate_t max_fr_edit =
+ #ifdef MAX_FEEDRATE_EDIT_VALUES
+ MAX_FEEDRATE_EDIT_VALUES
+ #elif ENABLED(LIMITED_MAX_FR_EDITING)
+ DEFAULT_MAX_FEEDRATE
+ #else
+ LOGICAL_AXIS_ARRAY_1(9999)
+ #endif
+ ;
+ #if ENABLED(LIMITED_MAX_FR_EDITING) && !defined(MAX_FEEDRATE_EDIT_VALUES)
+ const xyze_feedrate_t max_fr_edit_scaled = max_fr_edit * 2;
+ #else
+ const xyze_feedrate_t &max_fr_edit_scaled = max_fr_edit;
+ #endif
+
+ START_MENU();
+ BACK_ITEM(MSG_ADVANCED_SETTINGS);
+
+ LOOP_NUM_AXES(a)
+ EDIT_ITEM_FAST_N(float5, a, MSG_VMAX_N, &planner.settings.max_feedrate_mm_s[a], 1, max_fr_edit_scaled[a]);
+
+ #if E_STEPPERS
+ EDIT_ITEM_FAST_N(float5, E_AXIS, MSG_VMAX_N, &planner.settings.max_feedrate_mm_s[E_AXIS_N(active_extruder)], 1, max_fr_edit_scaled.e);
+ #endif
+ #if ENABLED(DISTINCT_E_FACTORS)
+ LOOP_L_N(n, E_STEPPERS)
+ EDIT_ITEM_FAST_N(float5, n, MSG_VMAX_EN, &planner.settings.max_feedrate_mm_s[E_AXIS_N(n)], 1, max_fr_edit_scaled.e);
+ #endif
+
+ // M205 S Min Feedrate
+ EDIT_ITEM_FAST(float5, MSG_VMIN, &planner.settings.min_feedrate_mm_s, 0, 9999);
+
+ // M205 T Min Travel Feedrate
+ EDIT_ITEM_FAST(float5, MSG_VTRAV_MIN, &planner.settings.min_travel_feedrate_mm_s, 0, 9999);
+
+ END_MENU();
+ }
+
+ // M201 / M204 Accelerations
+ void menu_advanced_acceleration() {
+ const float max_accel = _MAX(planner.settings.max_acceleration_mm_per_s2[A_AXIS], planner.settings.max_acceleration_mm_per_s2[B_AXIS], planner.settings.max_acceleration_mm_per_s2[C_AXIS]);
+
+ // M201 settings
+ constexpr xyze_ulong_t max_accel_edit =
+ #ifdef MAX_ACCEL_EDIT_VALUES
+ MAX_ACCEL_EDIT_VALUES
+ #elif ENABLED(LIMITED_MAX_ACCEL_EDITING)
+ DEFAULT_MAX_ACCELERATION
+ #else
+ LOGICAL_AXIS_ARRAY_1(99000)
+ #endif
+ ;
+ #if ENABLED(LIMITED_MAX_ACCEL_EDITING) && !defined(MAX_ACCEL_EDIT_VALUES)
+ const xyze_ulong_t max_accel_edit_scaled = max_accel_edit * 2;
+ #else
+ const xyze_ulong_t &max_accel_edit_scaled = max_accel_edit;
+ #endif
+
+ START_MENU();
+ BACK_ITEM(MSG_ADVANCED_SETTINGS);
+
+ // M204 P Acceleration
+ EDIT_ITEM_FAST(float5_25, MSG_ACC, &planner.settings.acceleration, 25, max_accel);
+
+ #if HAS_EXTRUDERS
+ // M204 R Retract Acceleration
+ EDIT_ITEM_FAST(float5, MSG_A_RETRACT, &planner.settings.retract_acceleration, 100, planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(active_extruder)]);
+ #endif
+
+ // M204 T Travel Acceleration
+ EDIT_ITEM_FAST(float5_25, MSG_A_TRAVEL, &planner.settings.travel_acceleration, 25, max_accel);
+
+ #define EDIT_AMAX(Q,L) EDIT_ITEM_FAST_N(long5_25, _AXIS(Q), MSG_AMAX_N, &planner.settings.max_acceleration_mm_per_s2[_AXIS(Q)], L, max_accel_edit_scaled[_AXIS(Q)], []{ planner.refresh_acceleration_rates(); })
+ NUM_AXIS_CODE(
+ EDIT_AMAX(A, 100), EDIT_AMAX(B, 100), EDIT_AMAX(C, 10),
+ EDIT_AMAX(I, 10), EDIT_AMAX(J, 10), EDIT_AMAX(K, 10)
+ );
+
+ #if ENABLED(DISTINCT_E_FACTORS)
+ EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(active_extruder)], 100, max_accel_edit_scaled.e, []{ planner.refresh_acceleration_rates(); });
+ LOOP_L_N(n, E_STEPPERS)
+ EDIT_ITEM_FAST_N(long5_25, n, MSG_AMAX_EN, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(n)], 100, max_accel_edit_scaled.e, []{
+ if (MenuItemBase::itemIndex == active_extruder)
+ planner.refresh_acceleration_rates();
+ });
+ #elif E_STEPPERS
+ EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS], 100, max_accel_edit_scaled.e, []{ planner.refresh_acceleration_rates(); });
+ #endif
+
+ #ifdef XY_FREQUENCY_LIMIT
+ EDIT_ITEM(int8, MSG_XY_FREQUENCY_LIMIT, &planner.xy_freq_limit_hz, 0, 100, planner.refresh_frequency_limit, true);
+ editable.uint8 = uint8_t(LROUND(planner.xy_freq_min_speed_factor * 255)); // percent to u8
+ EDIT_ITEM(percent, MSG_XY_FREQUENCY_FEEDRATE, &editable.uint8, 3, 255, []{ planner.set_min_speed_factor_u8(editable.uint8); }, true);
+ #endif
+
+ END_MENU();
+ }
+
+ #if HAS_CLASSIC_JERK
+
+ void menu_advanced_jerk() {
+ START_MENU();
+ BACK_ITEM(MSG_ADVANCED_SETTINGS);
+
+ #if HAS_JUNCTION_DEVIATION
+ EDIT_ITEM(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.001f, TERN(LIN_ADVANCE, 0.3f, 0.5f)
+ OPTARG(LIN_ADVANCE, planner.recalculate_max_e_jerk)
+ );
+ #endif
+
+ constexpr xyze_float_t max_jerk_edit =
+ #ifdef MAX_JERK_EDIT_VALUES
+ MAX_JERK_EDIT_VALUES
+ #elif ENABLED(LIMITED_JERK_EDITING)
+ #define _JERK2(N) DEFAULT_##N##JERK * 2
+ { MAPLIST(_JERK2, LOGICAL_AXIS_NAMES) }
+ #else
+ LOGICAL_AXIS_ARRAY_1(990)
+ #endif
+ ;
+
+ LOOP_LOGICAL_AXES(a) {
+ if (a == C_AXIS || TERN0(HAS_EXTRUDERS, a == E_AXIS))
+ EDIT_ITEM_FAST_N(float52sign, a, MSG_VN_JERK, &planner.max_jerk[a], 0.1f, max_jerk_edit[a]);
+ else
+ EDIT_ITEM_FAST_N(float3, a, MSG_VN_JERK, &planner.max_jerk[a], 1.0f, max_jerk_edit[a]);
+ }
+
+ END_MENU();
+ }
+
+ #endif
+
+ // M851 - Z Probe Offsets
+ #if HAS_BED_PROBE
+ void menu_probe_offsets() {
+ START_MENU();
+ BACK_ITEM(MSG_ADVANCED_SETTINGS);
+ #if HAS_PROBE_XY_OFFSET
+ EDIT_ITEM(float31sign, MSG_ZPROBE_XOFFSET, &probe.offset.x, -(X_BED_SIZE), X_BED_SIZE);
+ EDIT_ITEM(float31sign, MSG_ZPROBE_YOFFSET, &probe.offset.y, -(Y_BED_SIZE), Y_BED_SIZE);
+ #endif
+ EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
+
+ #if ENABLED(PROBE_OFFSET_WIZARD)
+ SUBMENU(MSG_PROBE_WIZARD, goto_probe_offset_wizard);
+ #endif
+
+ #if ENABLED(X_AXIS_TWIST_COMPENSATION)
+ SUBMENU(MSG_XATC, xatc_wizard_continue);
+ #endif
+
+ END_MENU();
+ }
+ #endif
+
+#endif // !SLIM_LCD_MENUS
+
+// M92 Steps-per-mm
+void menu_advanced_steps_per_mm() {
+ START_MENU();
+ BACK_ITEM(MSG_ADVANCED_SETTINGS);
+
+ LOOP_NUM_AXES(a)
+ EDIT_ITEM_FAST_N(float61, a, MSG_N_STEPS, &planner.settings.axis_steps_per_mm[a], 5, 9999, []{ planner.refresh_positioning(); });
+
+ #if ENABLED(DISTINCT_E_FACTORS)
+ LOOP_L_N(n, E_STEPPERS)
+ EDIT_ITEM_FAST_N(float61, n, MSG_EN_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(n)], 5, 9999, []{
+ const uint8_t e = MenuItemBase::itemIndex;
+ if (e == active_extruder)
+ planner.refresh_positioning();
+ else
+ planner.mm_per_step[E_AXIS_N(e)] = 1.0f / planner.settings.axis_steps_per_mm[E_AXIS_N(e)];
+ });
+ #elif E_STEPPERS
+ EDIT_ITEM_FAST_N(float61, E_AXIS, MSG_N_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS], 5, 9999, []{ planner.refresh_positioning(); });
+ #endif
+
+ END_MENU();
+}
+
+void menu_advanced_settings() {
+ const bool is_busy = printer_busy();
+
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ bool sd_update_state = settings.sd_update_status();
+ #endif
+
+ START_MENU();
+ BACK_ITEM(MSG_CONFIGURATION);
+
+ #if DISABLED(SLIM_LCD_MENUS)
+
+ #if HAS_M206_COMMAND
+ //
+ // Set Home Offsets
+ //
+ ACTION_ITEM(MSG_SET_HOME_OFFSETS, []{ queue.inject(F("M428")); ui.return_to_status(); });
+ #endif
+
+ // M203 / M205 - Feedrate items
+ SUBMENU(MSG_MAX_SPEED, menu_advanced_velocity);
+
+ // M201 - Acceleration items
+ SUBMENU(MSG_ACCELERATION, menu_advanced_acceleration);
+
+ #if HAS_CLASSIC_JERK
+ // M205 - Max Jerk
+ SUBMENU(MSG_JERK, menu_advanced_jerk);
+ #elif HAS_JUNCTION_DEVIATION
+ EDIT_ITEM(float43, MSG_JUNCTION_DEVIATION, &planner.junction_deviation_mm, 0.001f, 0.3f
+ OPTARG(LIN_ADVANCE, planner.recalculate_max_e_jerk)
+ );
+ #endif
+
+ // M851 - Z Probe Offsets
+ #if HAS_BED_PROBE
+ if (!is_busy) SUBMENU(MSG_ZPROBE_OFFSETS, menu_probe_offsets);
+ #endif
+
+ #endif // !SLIM_LCD_MENUS
+
+ // M92 - Steps Per mm
+ if (!is_busy)
+ SUBMENU(MSG_STEPS_PER_MM, menu_advanced_steps_per_mm);
+
+ #if ENABLED(BACKLASH_GCODE)
+ SUBMENU(MSG_BACKLASH, menu_backlash);
+ #endif
+
+ #if HAS_MOTOR_CURRENT_DAC
+ SUBMENU(MSG_DRIVE_STRENGTH, menu_dac);
+ #endif
+ #if HAS_MOTOR_CURRENT_PWM
+ SUBMENU(MSG_DRIVE_STRENGTH, menu_pwm);
+ #endif
+
+ #if HAS_TRINAMIC_CONFIG
+ SUBMENU(MSG_TMC_DRIVERS, menu_tmc);
+ #endif
+
+ #if SHOW_MENU_ADVANCED_TEMPERATURE
+ SUBMENU(MSG_TEMPERATURE, menu_advanced_temperature);
+ #endif
+
+ #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE)
+ SUBMENU(MSG_FILAMENT, menu_advanced_filament);
+ #elif ENABLED(LIN_ADVANCE)
+ #if EXTRUDERS == 1
+ EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 10);
+ #elif HAS_MULTI_EXTRUDER
+ LOOP_L_N(n, E_STEPPERS)
+ EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 10);
+ #endif
+ #endif
+
+ // M540 S - Abort on endstop hit when SD printing
+ #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT)
+ EDIT_ITEM(bool, MSG_ENDSTOP_ABORT, &planner.abort_on_endstop_hit);
+ #endif
+
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ EDIT_ITEM(bool, MSG_MEDIA_UPDATE, &sd_update_state, []{
+ //
+ // Toggle the SD Firmware Update state in EEPROM
+ //
+ const bool new_state = !settings.sd_update_status(),
+ didset = settings.set_sd_update_status(new_state);
+ ui.completion_feedback(didset);
+ ui.return_to_status();
+ if (new_state) LCD_MESSAGE(MSG_RESET_PRINTER); else ui.reset_status();
+ });
+ #endif
+
+ #if ENABLED(PASSWORD_FEATURE)
+ SUBMENU(MSG_PASSWORD_SETTINGS, password.access_menu_password);
+ #endif
+
+ #if ENABLED(EEPROM_SETTINGS) && DISABLED(SLIM_LCD_MENUS)
+ CONFIRM_ITEM(MSG_INIT_EEPROM,
+ MSG_BUTTON_INIT, MSG_BUTTON_CANCEL,
+ ui.init_eeprom, nullptr,
+ GET_TEXT_F(MSG_INIT_EEPROM), (const char *)nullptr, F("?")
+ );
+ #endif
+
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU
diff --git a/src/lcd/menu/menu_backlash.cpp b/src/lcd/menu/menu_backlash.cpp
new file mode 100644
index 0000000..6b6cdf2
--- /dev/null
+++ b/src/lcd/menu/menu_backlash.cpp
@@ -0,0 +1,78 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Backlash Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if BOTH(HAS_MARLINUI_MENU, BACKLASH_GCODE)
+
+#include "menu_item.h"
+
+#include "../../feature/backlash.h"
+
+void menu_backlash() {
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ editable.uint8 = backlash.get_correction_uint8();
+ EDIT_ITEM_FAST(percent, MSG_BACKLASH_CORRECTION, &editable.uint8, backlash.all_off, backlash.all_on, []{ backlash.set_correction_uint8(editable.uint8); });
+
+ #if DISABLED(CORE_BACKLASH) || EITHER(MARKFORGED_XY, MARKFORGED_YX)
+ #define _CAN_CALI AXIS_CAN_CALIBRATE
+ #else
+ #define _CAN_CALI(A) true
+ #endif
+
+ #define EDIT_BACKLASH_DISTANCE(N) do { \
+ editable.decimal = backlash.get_distance_mm(_AXIS(N)); \
+ EDIT_ITEM_FAST_N(float43, _AXIS(N), MSG_BACKLASH_N, &editable.decimal, 0.0f, 9.9f, []{ backlash.set_distance_mm(_AXIS(N), editable.decimal); }); \
+ } while (0);
+
+ if (_CAN_CALI(A)) EDIT_BACKLASH_DISTANCE(A);
+ #if HAS_Y_AXIS && _CAN_CALI(B)
+ EDIT_BACKLASH_DISTANCE(B);
+ #endif
+ #if HAS_Z_AXIS && _CAN_CALI(C)
+ EDIT_BACKLASH_DISTANCE(C);
+ #endif
+ #if HAS_I_AXIS && _CAN_CALI(I)
+ EDIT_BACKLASH_DISTANCE(I);
+ #endif
+ #if HAS_J_AXIS && _CAN_CALI(J)
+ EDIT_BACKLASH_DISTANCE(J);
+ #endif
+ #if HAS_K_AXIS && _CAN_CALI(K)
+ EDIT_BACKLASH_DISTANCE(K);
+ #endif
+
+ #ifdef BACKLASH_SMOOTHING_MM
+ editable.decimal = backlash.get_smoothing_mm();
+ EDIT_ITEM_FAST(float43, MSG_BACKLASH_SMOOTHING, &editable.decimal, 0.0f, 9.9f, []{ backlash.set_smoothing_mm(editable.decimal); });
+ #endif
+
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU && BACKLASH_GCODE
diff --git a/src/lcd/menu/menu_bed_corners.cpp b/src/lcd/menu/menu_bed_corners.cpp
new file mode 100644
index 0000000..c4a63da
--- /dev/null
+++ b/src/lcd/menu/menu_bed_corners.cpp
@@ -0,0 +1,365 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Level Bed Corners menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if BOTH(HAS_MARLINUI_MENU, LCD_BED_TRAMMING)
+
+#include "menu_item.h"
+#include "../../module/motion.h"
+#include "../../module/planner.h"
+
+#if HAS_LEVELING
+ #include "../../feature/bedlevel/bedlevel.h"
+#endif
+
+#ifndef BED_TRAMMING_Z_HOP
+ #define BED_TRAMMING_Z_HOP 4.0
+#endif
+#ifndef BED_TRAMMING_HEIGHT
+ #define BED_TRAMMING_HEIGHT 0.0
+#endif
+
+#if ENABLED(BED_TRAMMING_USE_PROBE)
+ #include "../../module/probe.h"
+ #include "../../module/endstops.h"
+ #if ENABLED(BLTOUCH)
+ #include "../../feature/bltouch.h"
+ #endif
+ #ifndef BED_TRAMMING_PROBE_TOLERANCE
+ #define BED_TRAMMING_PROBE_TOLERANCE 0.2
+ #endif
+ float last_z;
+ int good_points;
+ bool corner_probing_done, wait_for_probe;
+
+ #if HAS_MARLINUI_U8GLIB
+ #include "../dogm/marlinui_DOGM.h"
+ #endif
+ #define GOOD_POINTS_TO_STR(N) ui8tostr2(N)
+ #define LAST_Z_TO_STR(N) ftostr53_63(N) //ftostr42_52(N)
+
+#endif
+
+static_assert(BED_TRAMMING_Z_HOP >= 0, "BED_TRAMMING_Z_HOP must be >= 0. Please update your configuration.");
+
+#ifndef BED_TRAMMING_LEVELING_ORDER
+ #define BED_TRAMMING_LEVELING_ORDER { LF, RF, LB, RB } // Default
+ //#define BED_TRAMMING_LEVELING_ORDER { LF, LB, RF } // 3 hard-coded points
+ //#define BED_TRAMMING_LEVELING_ORDER { LF, RF } // 3-Point tramming - Rear
+ //#define BED_TRAMMING_LEVELING_ORDER { LF, LB } // 3-Point tramming - Right
+ //#define BED_TRAMMING_LEVELING_ORDER { RF, RB } // 3-Point tramming - Left
+ //#define BED_TRAMMING_LEVELING_ORDER { LB, RB } // 3-Point tramming - Front
+#endif
+
+#define LF 1
+#define RF 2
+#define RB 3
+#define LB 4
+constexpr int lco[] = BED_TRAMMING_LEVELING_ORDER;
+constexpr bool level_corners_3_points = COUNT(lco) == 2;
+static_assert(level_corners_3_points || COUNT(lco) == 4, "BED_TRAMMING_LEVELING_ORDER must have exactly 2 or 4 corners.");
+
+constexpr int lcodiff = ABS(lco[0] - lco[1]);
+static_assert(COUNT(lco) == 4 || lcodiff == 1 || lcodiff == 3, "The first two BED_TRAMMING_LEVELING_ORDER corners must be on the same edge.");
+
+constexpr int nr_edge_points = level_corners_3_points ? 3 : 4;
+constexpr int available_points = nr_edge_points + ENABLED(BED_TRAMMING_INCLUDE_CENTER);
+constexpr int center_index = TERN(BED_TRAMMING_INCLUDE_CENTER, available_points - 1, -1);
+constexpr float inset_lfrb[4] = BED_TRAMMING_INSET_LFRB;
+constexpr xy_pos_t lf { (X_MIN_BED) + inset_lfrb[0], (Y_MIN_BED) + inset_lfrb[1] },
+ rb { (X_MAX_BED) - inset_lfrb[2], (Y_MAX_BED) - inset_lfrb[3] };
+
+static int8_t bed_corner;
+
+/**
+ * Select next corner coordinates
+ */
+static void _lcd_level_bed_corners_get_next_position() {
+
+ if (level_corners_3_points) {
+ if (bed_corner >= available_points) bed_corner = 0; // Above max position -> move back to first corner
+ switch (bed_corner) {
+ case 0 ... 1:
+ // First two corners set explicitly by the configuration
+ current_position = lf; // Left front
+ switch (lco[bed_corner]) {
+ case RF: current_position.x = rb.x; break; // Right Front
+ case RB: current_position = rb; break; // Right Back
+ case LB: current_position.y = rb.y; break; // Left Back
+ }
+ break;
+
+ case 2:
+ // Determine which edge to probe for 3rd point
+ current_position.set(lf.x + (rb.x - lf.x) / 2, lf.y + (rb.y - lf.y) / 2);
+ if ((lco[0] == LB && lco[1] == RB) || (lco[0] == RB && lco[1] == LB)) current_position.y = lf.y; // Front Center
+ if ((lco[0] == LF && lco[1] == LB) || (lco[0] == LB && lco[1] == LF)) current_position.x = rb.x; // Center Right
+ if ((lco[0] == RF && lco[1] == RB) || (lco[0] == RB && lco[1] == RF)) current_position.x = lf.x; // Left Center
+ if ((lco[0] == LF && lco[1] == RF) || (lco[0] == RF && lco[1] == LF)) current_position.y = rb.y; // Center Back
+ #if DISABLED(BED_TRAMMING_INCLUDE_CENTER) && ENABLED(BED_TRAMMING_USE_PROBE)
+ bed_corner++; // Must increment the count to ensure it resets the loop if the 3rd point is out of tolerance
+ #endif
+ break;
+
+ #if ENABLED(BED_TRAMMING_INCLUDE_CENTER)
+ case 3:
+ current_position.set(X_CENTER, Y_CENTER);
+ break;
+ #endif
+ }
+ }
+ else {
+ // Four-Corner Bed Tramming with optional center
+ if (TERN0(BED_TRAMMING_INCLUDE_CENTER, bed_corner == center_index)) {
+ current_position.set(X_CENTER, Y_CENTER);
+ TERN_(BED_TRAMMING_USE_PROBE, good_points--); // Decrement to allow one additional probe point
+ }
+ else {
+ current_position = lf; // Left front
+ switch (lco[bed_corner]) {
+ case RF: current_position.x = rb.x; break; // Right front
+ case RB: current_position = rb; break; // Right rear
+ case LB: current_position.y = rb.y; break; // Left rear
+ }
+ }
+ }
+}
+
+/**
+ * Level corners, starting in the front-left corner.
+ */
+#if ENABLED(BED_TRAMMING_USE_PROBE)
+
+ #define VALIDATE_POINT(X, Y, STR) static_assert(Probe::build_time::can_reach((X), (Y)), \
+ "BED_TRAMMING_INSET_LFRB " STR " inset is not reachable with the default NOZZLE_TO_PROBE offset and PROBING_MARGIN.")
+ VALIDATE_POINT(lf.x, Y_CENTER, "left"); VALIDATE_POINT(X_CENTER, lf.y, "front");
+ VALIDATE_POINT(rb.x, Y_CENTER, "right"); VALIDATE_POINT(X_CENTER, rb.y, "back");
+
+ #ifndef PAGE_CONTAINS
+ #define PAGE_CONTAINS(...) true
+ #endif
+
+ void _lcd_draw_probing() {
+ if (!ui.should_draw()) return;
+
+ TERN_(HAS_MARLINUI_U8GLIB, ui.set_font(FONT_MENU)); // Set up the font for extra info
+
+ MenuItem_static::draw(0, GET_TEXT_F(MSG_PROBING_POINT), SS_INVERT); // "Probing Mesh" heading
+
+ uint8_t cy = TERN(TFT_COLOR_UI, 3, LCD_HEIGHT - 1), y = LCD_ROW_Y(cy);
+
+ // Display # of good points found vs total needed
+ if (PAGE_CONTAINS(y - (MENU_FONT_HEIGHT), y)) {
+ SETCURSOR(TERN(TFT_COLOR_UI, 2, 0), cy);
+ lcd_put_u8str(GET_TEXT_F(MSG_BED_TRAMMING_GOOD_POINTS));
+ IF_ENABLED(TFT_COLOR_UI, lcd_moveto(12, cy));
+ lcd_put_u8str(GOOD_POINTS_TO_STR(good_points));
+ lcd_put_lchar('/');
+ lcd_put_u8str(GOOD_POINTS_TO_STR(nr_edge_points));
+ }
+
+ --cy;
+ y -= MENU_LINE_HEIGHT;
+
+ // Display the Last Z value
+ if (PAGE_CONTAINS(y - (MENU_FONT_HEIGHT), y)) {
+ SETCURSOR(TERN(TFT_COLOR_UI, 2, 0), cy);
+ lcd_put_u8str(GET_TEXT_F(MSG_BED_TRAMMING_LAST_Z));
+ IF_ENABLED(TFT_COLOR_UI, lcd_moveto(12, 2));
+ lcd_put_u8str(LAST_Z_TO_STR(last_z));
+ }
+ }
+
+ void _lcd_draw_raise() {
+ if (!ui.should_draw()) return;
+ MenuItem_confirm::select_screen(
+ GET_TEXT_F(MSG_BUTTON_DONE), GET_TEXT_F(MSG_BUTTON_SKIP)
+ , []{ corner_probing_done = true; wait_for_probe = false; }
+ , []{ wait_for_probe = false; }
+ , GET_TEXT_F(MSG_BED_TRAMMING_RAISE)
+ );
+ }
+
+ void _lcd_draw_level_prompt() {
+ if (!ui.should_draw()) return;
+ MenuItem_confirm::select_screen(
+ GET_TEXT_F(TERN(HAS_LEVELING, MSG_BUTTON_LEVEL, MSG_BUTTON_DONE)),
+ TERN(HAS_LEVELING, GET_TEXT_F(MSG_BUTTON_BACK), nullptr)
+ , []{ queue.inject(TERN(HAS_LEVELING, F("G29N"), FPSTR(G28_STR))); ui.return_to_status(); }
+ , TERN(HAS_LEVELING, ui.goto_previous_screen_no_defer, []{})
+ , GET_TEXT_F(MSG_BED_TRAMMING_IN_RANGE)
+ );
+ }
+
+ bool _lcd_level_bed_corners_probe(bool verify=false) {
+ if (verify) do_blocking_move_to_z(current_position.z + BED_TRAMMING_Z_HOP); // do clearance if needed
+ TERN_(BLTOUCH, if (!bltouch.high_speed_mode) bltouch.deploy()); // Deploy in LOW SPEED MODE on every probe action
+ do_blocking_move_to_z(last_z - BED_TRAMMING_PROBE_TOLERANCE, MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW)); // Move down to lower tolerance
+ if (TEST(endstops.trigger_state(), Z_MIN_PROBE)) { // check if probe triggered
+ endstops.hit_on_purpose();
+ set_current_from_steppers_for_axis(Z_AXIS);
+ sync_plan_position();
+ TERN_(BLTOUCH, if (!bltouch.high_speed_mode) bltouch.stow()); // Stow in LOW SPEED MODE on every trigger
+ // Triggered outside tolerance range?
+ if (ABS(current_position.z - last_z) > BED_TRAMMING_PROBE_TOLERANCE) {
+ last_z = current_position.z; // Above tolerance. Set a new Z for subsequent corners.
+ good_points = 0; // ...and start over
+ }
+ return true; // probe triggered
+ }
+ do_blocking_move_to_z(last_z); // go back to tolerance middle point before raise
+ return false; // probe not triggered
+ }
+
+ bool _lcd_level_bed_corners_raise() {
+ bool probe_triggered = false;
+ corner_probing_done = false;
+ wait_for_probe = true;
+ ui.goto_screen(_lcd_draw_raise); // show raise screen
+ ui.set_selection(true);
+ while (wait_for_probe && !probe_triggered) { // loop while waiting to bed raise and probe trigger
+ probe_triggered = PROBE_TRIGGERED();
+ if (probe_triggered) {
+ endstops.hit_on_purpose();
+ TERN_(BED_TRAMMING_AUDIO_FEEDBACK, BUZZ(200, 600));
+ }
+ idle();
+ }
+ TERN_(BLTOUCH, if (!bltouch.high_speed_mode) bltouch.stow());
+ ui.goto_screen(_lcd_draw_probing);
+ return (probe_triggered);
+ }
+
+ void _lcd_test_corners() {
+ bed_corner = TERN(BED_TRAMMING_INCLUDE_CENTER, center_index, 0);
+ last_z = BED_TRAMMING_HEIGHT;
+ endstops.enable_z_probe(true);
+ good_points = 0;
+ ui.goto_screen(_lcd_draw_probing);
+ do {
+ ui.refresh(LCDVIEW_REDRAW_NOW);
+ _lcd_draw_probing(); // update screen with # of good points
+
+ do_blocking_move_to_z(current_position.z + BED_TRAMMING_Z_HOP + TERN0(BLTOUCH, bltouch.z_extra_clearance())); // clearance
+
+ _lcd_level_bed_corners_get_next_position(); // Select next corner coordinates
+ current_position -= probe.offset_xy; // Account for probe offsets
+ do_blocking_move_to_xy(current_position); // Goto corner
+
+ TERN_(BLTOUCH, if (bltouch.high_speed_mode) bltouch.deploy()); // Deploy in HIGH SPEED MODE
+ if (!_lcd_level_bed_corners_probe()) { // Probe down to tolerance
+ if (_lcd_level_bed_corners_raise()) { // Prompt user to raise bed if needed
+ #if ENABLED(BED_TRAMMING_VERIFY_RAISED) // Verify
+ while (!_lcd_level_bed_corners_probe(true)) { // Loop while corner verified
+ if (!_lcd_level_bed_corners_raise()) { // Prompt user to raise bed if needed
+ if (corner_probing_done) return; // Done was selected
+ break; // Skip was selected
+ }
+ }
+ #endif
+ }
+ else if (corner_probing_done) // Done was selected
+ return;
+ }
+
+ if (bed_corner != center_index) good_points++; // ignore center
+ if (++bed_corner > 3) bed_corner = 0;
+
+ } while (good_points < nr_edge_points); // loop until all points within tolerance
+
+ #if ENABLED(BLTOUCH)
+ if (bltouch.high_speed_mode) {
+ // In HIGH SPEED MODE do clearance and stow at the very end
+ do_blocking_move_to_z(current_position.z + BED_TRAMMING_Z_HOP);
+ bltouch.stow();
+ }
+ #endif
+
+ ui.goto_screen(_lcd_draw_level_prompt); // prompt for bed leveling
+ ui.set_selection(true);
+ }
+
+#else // !BED_TRAMMING_USE_PROBE
+
+ static void _lcd_goto_next_corner() {
+ line_to_z(BED_TRAMMING_Z_HOP);
+
+ // Select next corner coordinates
+ _lcd_level_bed_corners_get_next_position();
+
+ line_to_current_position(manual_feedrate_mm_s.x);
+ line_to_z(BED_TRAMMING_HEIGHT);
+ if (++bed_corner >= available_points) bed_corner = 0;
+ }
+
+#endif // !BED_TRAMMING_USE_PROBE
+
+static void _lcd_level_bed_corners_homing() {
+ _lcd_draw_homing();
+ if (!all_axes_homed()) return;
+ #if ENABLED(BED_TRAMMING_USE_PROBE)
+ _lcd_test_corners();
+ if (corner_probing_done) ui.goto_previous_screen_no_defer();
+ TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active));
+ endstops.enable_z_probe(false);
+ #else
+ bed_corner = 0;
+ ui.goto_screen([]{
+ MenuItem_confirm::select_screen(
+ GET_TEXT_F(MSG_BUTTON_NEXT), GET_TEXT_F(MSG_BUTTON_DONE)
+ , _lcd_goto_next_corner
+ , []{
+ line_to_z(BED_TRAMMING_Z_HOP); // Raise Z off the bed when done
+ TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active));
+ ui.goto_previous_screen_no_defer();
+ }
+ , GET_TEXT_F(TERN(BED_TRAMMING_INCLUDE_CENTER, MSG_LEVEL_BED_NEXT_POINT, MSG_NEXT_CORNER))
+ , (const char*)nullptr, F("?")
+ );
+ });
+ ui.set_selection(true);
+ _lcd_goto_next_corner();
+ #endif
+}
+
+void _lcd_level_bed_corners() {
+ ui.defer_status_screen();
+ if (!all_axes_trusted()) {
+ set_all_unhomed();
+ queue.inject_P(G28_STR);
+ }
+
+ // Disable leveling so the planner won't mess with us
+ #if HAS_LEVELING
+ leveling_was_active = planner.leveling_active;
+ set_bed_leveling_enabled(false);
+ #endif
+
+ ui.goto_screen(_lcd_level_bed_corners_homing);
+}
+
+#endif // HAS_MARLINUI_MENU && LCD_BED_TRAMMING
diff --git a/src/lcd/menu/menu_bed_leveling.cpp b/src/lcd/menu/menu_bed_leveling.cpp
new file mode 100644
index 0000000..294666e
--- /dev/null
+++ b/src/lcd/menu/menu_bed_leveling.cpp
@@ -0,0 +1,304 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Bed Leveling Menus
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if ENABLED(LCD_BED_LEVELING)
+
+#include "menu_item.h"
+#include "../../module/planner.h"
+#include "../../feature/bedlevel/bedlevel.h"
+
+#if HAS_BED_PROBE && DISABLED(BABYSTEP_ZPROBE_OFFSET)
+ #include "../../module/probe.h"
+#endif
+
+#if HAS_GRAPHICAL_TFT
+ #include "../tft/tft.h"
+ #if ENABLED(TOUCH_SCREEN)
+ #include "../tft/touch.h"
+ #endif
+#endif
+
+#if EITHER(PROBE_MANUALLY, MESH_BED_LEVELING)
+
+ #include "../../module/motion.h"
+ #include "../../gcode/queue.h"
+
+ //
+ // Motion > Level Bed handlers
+ //
+
+ // LCD probed points are from defaults
+ constexpr uint8_t total_probe_points = TERN(AUTO_BED_LEVELING_3POINT, 3, GRID_MAX_POINTS);
+
+ //
+ // Bed leveling is done. Wait for G29 to complete.
+ // A flag is used so that this can release control
+ // and allow the command queue to be processed.
+ //
+ // When G29 finishes the last move:
+ // - Raise Z to the "Z after probing" height
+ // - Don't return until done.
+ //
+ // ** This blocks the command queue! **
+ //
+ void _lcd_level_bed_done() {
+ if (!ui.wait_for_move) {
+ #if Z_AFTER_PROBING > 0 && DISABLED(MESH_BED_LEVELING)
+ // Display "Done" screen and wait for moves to complete
+ line_to_z(Z_AFTER_PROBING);
+ ui.synchronize(GET_TEXT_F(MSG_LEVEL_BED_DONE));
+ #endif
+ ui.goto_previous_screen_no_defer();
+ ui.completion_feedback();
+ }
+ if (ui.should_draw()) MenuItem_static::draw(LCD_HEIGHT >= 4, GET_TEXT_F(MSG_LEVEL_BED_DONE));
+ ui.refresh(LCDVIEW_CALL_REDRAW_NEXT);
+ }
+
+ void _lcd_level_goto_next_point();
+
+ //
+ // Step 7: Get the Z coordinate, click goes to the next point or exits
+ //
+ void _lcd_level_bed_get_z() {
+
+ if (ui.use_click()) {
+
+ //
+ // Save the current Z position and move
+ //
+
+ // If done...
+ if (++manual_probe_index >= total_probe_points) {
+ //
+ // The last G29 records the point and enables bed leveling
+ //
+ ui.wait_for_move = true;
+ ui.goto_screen(_lcd_level_bed_done);
+ #if ENABLED(MESH_BED_LEVELING)
+ queue.inject(F("G29S2"));
+ #elif ENABLED(PROBE_MANUALLY)
+ queue.inject(F("G29V1"));
+ #endif
+ }
+ else
+ _lcd_level_goto_next_point();
+
+ return;
+ }
+
+ //
+ // Encoder knob or keypad buttons adjust the Z position
+ //
+ if (ui.encoderPosition) {
+ const float z = current_position.z + float(int32_t(ui.encoderPosition)) * (MESH_EDIT_Z_STEP);
+ line_to_z(constrain(z, -(LCD_PROBE_Z_RANGE) * 0.5f, (LCD_PROBE_Z_RANGE) * 0.5f));
+ ui.refresh(LCDVIEW_CALL_REDRAW_NEXT);
+ ui.encoderPosition = 0;
+ }
+
+ //
+ // Draw on first display, then only on Z change
+ //
+ if (ui.should_draw()) {
+ const float v = current_position.z;
+ MenuEditItemBase::draw_edit_screen(GET_TEXT_F(MSG_MOVE_Z), ftostr43sign(v + (v < 0 ? -0.0001f : 0.0001f), '+'));
+ }
+ }
+
+ //
+ // Step 6: Display "Next point: 1 / 9" while waiting for move to finish
+ //
+ void _lcd_level_bed_moving() {
+ if (ui.should_draw()) {
+ char msg[10];
+ sprintf_P(msg, PSTR("%i / %u"), int(manual_probe_index + 1), total_probe_points);
+ MenuEditItemBase::draw_edit_screen(GET_TEXT_F(MSG_LEVEL_BED_NEXT_POINT), msg);
+ }
+ ui.refresh(LCDVIEW_CALL_NO_REDRAW);
+ if (!ui.wait_for_move) ui.goto_screen(_lcd_level_bed_get_z);
+ }
+
+ //
+ // Step 5: Initiate a move to the next point
+ //
+ void _lcd_level_goto_next_point() {
+ ui.goto_screen(_lcd_level_bed_moving);
+
+ // G29 Records Z, moves, and signals when it pauses
+ ui.wait_for_move = true;
+ #if ENABLED(MESH_BED_LEVELING)
+ queue.inject(manual_probe_index ? F("G29S2") : F("G29S1"));
+ #elif ENABLED(PROBE_MANUALLY)
+ queue.inject(F("G29V1"));
+ #endif
+ }
+
+ //
+ // Step 4: Display "Click to Begin", wait for click
+ // Move to the first probe position
+ //
+ void _lcd_level_bed_homing_done() {
+ if (ui.should_draw()) {
+ MenuItem_static::draw(1, GET_TEXT_F(MSG_LEVEL_BED_WAITING));
+ // Color UI needs a control to detect a touch
+ #if BOTH(TOUCH_SCREEN, HAS_GRAPHICAL_TFT)
+ touch.add_control(CLICK, 0, 0, TFT_WIDTH, TFT_HEIGHT);
+ #endif
+ }
+ if (ui.use_click()) {
+ manual_probe_index = 0;
+ _lcd_level_goto_next_point();
+ }
+ }
+
+ //
+ // Step 3: Display "Homing XYZ" - Wait for homing to finish
+ //
+ void _lcd_level_bed_homing() {
+ _lcd_draw_homing();
+ if (all_axes_homed()) ui.goto_screen(_lcd_level_bed_homing_done);
+ }
+
+ #if ENABLED(PROBE_MANUALLY)
+ extern bool g29_in_progress;
+ #endif
+
+ //
+ // Step 2: Continue Bed Leveling...
+ //
+ void _lcd_level_bed_continue() {
+ ui.defer_status_screen();
+ set_all_unhomed();
+ ui.goto_screen(_lcd_level_bed_homing);
+ queue.inject_P(G28_STR);
+ }
+
+#endif // PROBE_MANUALLY || MESH_BED_LEVELING
+
+#if ENABLED(MESH_EDIT_MENU)
+
+ inline void refresh_planner() {
+ set_current_from_steppers_for_axis(ALL_AXES_ENUM);
+ sync_plan_position();
+ }
+
+ void menu_edit_mesh() {
+ static uint8_t xind, yind; // =0
+ START_MENU();
+ BACK_ITEM(MSG_BED_LEVELING);
+ EDIT_ITEM(uint8, MSG_MESH_X, &xind, 0, (GRID_MAX_POINTS_X) - 1);
+ EDIT_ITEM(uint8, MSG_MESH_Y, &yind, 0, (GRID_MAX_POINTS_Y) - 1);
+ EDIT_ITEM_FAST(float43, MSG_MESH_EDIT_Z, &bedlevel.z_values[xind][yind], -(LCD_PROBE_Z_RANGE) * 0.5, (LCD_PROBE_Z_RANGE) * 0.5, refresh_planner);
+ END_MENU();
+ }
+
+#endif // MESH_EDIT_MENU
+
+/**
+ * Step 1: Bed Level entry-point
+ *
+ * << Motion
+ * Auto Home (if homing needed)
+ * Leveling On/Off (if data exists, and homed)
+ * Fade Height: --- (Req: ENABLE_LEVELING_FADE_HEIGHT)
+ * Mesh Z Offset: --- (Req: MESH_BED_LEVELING)
+ * Z Probe Offset: --- (Req: HAS_BED_PROBE, Opt: BABYSTEP_ZPROBE_OFFSET)
+ * Level Bed >
+ * Bed Tramming > (if homed)
+ * Load Settings (Req: EEPROM_SETTINGS)
+ * Save Settings (Req: EEPROM_SETTINGS)
+ */
+void menu_bed_leveling() {
+ const bool is_homed = all_axes_trusted(),
+ is_valid = leveling_is_valid();
+
+ START_MENU();
+ BACK_ITEM(MSG_MOTION);
+
+ // Auto Home if not using manual probing
+ #if NONE(PROBE_MANUALLY, MESH_BED_LEVELING)
+ if (!is_homed) GCODES_ITEM(MSG_AUTO_HOME, FPSTR(G28_STR));
+ #endif
+
+ // Level Bed
+ #if EITHER(PROBE_MANUALLY, MESH_BED_LEVELING)
+ // Manual leveling uses a guided procedure
+ SUBMENU(MSG_LEVEL_BED, _lcd_level_bed_continue);
+ #else
+ // Automatic leveling can just run the G-code
+ GCODES_ITEM(MSG_LEVEL_BED, is_homed ? F("G29") : F("G29N"));
+ #endif
+
+ #if ENABLED(MESH_EDIT_MENU)
+ if (is_valid) SUBMENU(MSG_EDIT_MESH, menu_edit_mesh);
+ #endif
+
+ // Homed and leveling is valid? Then leveling can be toggled.
+ if (is_homed && is_valid) {
+ bool show_state = planner.leveling_active;
+ EDIT_ITEM(bool, MSG_BED_LEVELING, &show_state, _lcd_toggle_bed_leveling);
+ }
+
+ // Z Fade Height
+ #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
+ // Shadow for editing the fade height
+ editable.decimal = planner.z_fade_height;
+ EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, []{ set_z_fade_height(editable.decimal); });
+ #endif
+
+ //
+ // Mesh Bed Leveling Z-Offset
+ //
+ #if ENABLED(MESH_BED_LEVELING)
+ #if WITHIN(Z_PROBE_OFFSET_RANGE_MIN, -9, 9)
+ #define LCD_Z_OFFSET_TYPE float43 // Values from -9.000 to +9.000
+ #else
+ #define LCD_Z_OFFSET_TYPE float42_52 // Values from -99.99 to 99.99
+ #endif
+ EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_BED_Z, &bedlevel.z_offset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
+ #endif
+
+ #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+ SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset);
+ #elif HAS_BED_PROBE
+ EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
+ #endif
+
+ #if ENABLED(LCD_BED_TRAMMING)
+ SUBMENU(MSG_BED_TRAMMING, _lcd_level_bed_corners);
+ #endif
+
+ #if ENABLED(EEPROM_SETTINGS)
+ ACTION_ITEM(MSG_LOAD_EEPROM, ui.load_settings);
+ ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings);
+ #endif
+ END_MENU();
+}
+
+#endif // LCD_BED_LEVELING
diff --git a/src/lcd/menu/menu_cancelobject.cpp b/src/lcd/menu/menu_cancelobject.cpp
new file mode 100644
index 0000000..b2d36bf
--- /dev/null
+++ b/src/lcd/menu/menu_cancelobject.cpp
@@ -0,0 +1,74 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Cancel Object Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if BOTH(HAS_MARLINUI_MENU, CANCEL_OBJECTS)
+
+#include "menu_item.h"
+#include "menu_addon.h"
+
+#include "../../feature/cancel_object.h"
+
+static void lcd_cancel_object_confirm() {
+ const int8_t v = MenuItemBase::itemIndex;
+ const char item_num[] = {
+ ' ',
+ char((v > 9) ? '0' + (v / 10) : ' '),
+ char('0' + (v % 10)),
+ '\0'
+ };
+ MenuItem_confirm::confirm_screen(
+ []{
+ cancelable.cancel_object(MenuItemBase::itemIndex);
+ ui.completion_feedback();
+ ui.goto_previous_screen();
+ },
+ nullptr,
+ GET_TEXT_F(MSG_CANCEL_OBJECT), item_num, F("?")
+ );
+}
+
+void menu_cancelobject() {
+ const int8_t ao = cancelable.active_object;
+
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ // Draw cancelable items in a loop
+ for (int8_t i = -1; i < cancelable.object_count; i++) {
+ if (i == ao) continue; // Active is drawn on -1 index
+ const int8_t j = i < 0 ? ao : i; // Active or index item
+ if (!cancelable.is_canceled(j)) { // Not canceled already?
+ SUBMENU_N(j, MSG_CANCEL_OBJECT_N, lcd_cancel_object_confirm); // Offer the option.
+ if (i < 0) SKIP_ITEM(); // Extra line after active
+ }
+ }
+
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU && CANCEL_OBJECTS
diff --git a/src/lcd/menu/menu_configuration.cpp b/src/lcd/menu/menu_configuration.cpp
new file mode 100644
index 0000000..1f2257a
--- /dev/null
+++ b/src/lcd/menu/menu_configuration.cpp
@@ -0,0 +1,592 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Configuration Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if HAS_MARLINUI_MENU
+
+#include "menu_item.h"
+
+#include "../../MarlinCore.h"
+
+#if HAS_FILAMENT_SENSOR
+ #include "../../feature/runout.h"
+#endif
+
+#if HAS_FANCHECK
+ #include "../../feature/fancheck.h"
+#endif
+
+#if ENABLED(POWER_LOSS_RECOVERY)
+ #include "../../feature/powerloss.h"
+#endif
+
+#if HAS_BED_PROBE
+ #include "../../module/probe.h"
+ #if ENABLED(BLTOUCH)
+ #include "../../feature/bltouch.h"
+ #endif
+#endif
+
+#if ENABLED(SOUND_MENU_ITEM)
+ #include "../../libs/buzzer.h"
+#endif
+
+#include "../../core/debug_out.h"
+
+#define HAS_DEBUG_MENU ENABLED(LCD_PROGRESS_BAR_TEST)
+
+void menu_advanced_settings();
+#if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION)
+ void menu_delta_calibrate();
+#endif
+
+#if ENABLED(LCD_PROGRESS_BAR_TEST)
+
+ #include "../lcdprint.h"
+
+ static void progress_bar_test() {
+ static int8_t bar_percent = 0;
+ if (ui.use_click()) {
+ ui.goto_previous_screen();
+ TERN_(HAS_MARLINUI_HD44780, ui.set_custom_characters(CHARSET_MENU));
+ return;
+ }
+ bar_percent += (int8_t)ui.encoderPosition;
+ LIMIT(bar_percent, 0, 100);
+ ui.encoderPosition = 0;
+ MenuItem_static::draw(0, GET_TEXT_F(MSG_PROGRESS_BAR_TEST), SS_DEFAULT|SS_INVERT);
+ lcd_put_int((LCD_WIDTH) / 2 - 2, LCD_HEIGHT - 2, bar_percent); lcd_put_lchar('%');
+ lcd_moveto(0, LCD_HEIGHT - 1); ui.draw_progress_bar(bar_percent);
+ }
+
+ void _progress_bar_test() {
+ ui.goto_screen(progress_bar_test);
+ TERN_(HAS_MARLINUI_HD44780, ui.set_custom_characters(CHARSET_INFO));
+ }
+
+#endif // LCD_PROGRESS_BAR_TEST
+
+#if HAS_DEBUG_MENU
+
+ void menu_debug() {
+ START_MENU();
+
+ BACK_ITEM(MSG_CONFIGURATION);
+
+ #if ENABLED(LCD_PROGRESS_BAR_TEST)
+ SUBMENU(MSG_PROGRESS_BAR_TEST, _progress_bar_test);
+ #endif
+
+ END_MENU();
+ }
+
+#endif
+
+#if HAS_MULTI_EXTRUDER
+
+ #include "../../module/tool_change.h"
+
+ void menu_tool_change() {
+ START_MENU();
+ BACK_ITEM(MSG_CONFIGURATION);
+ #if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
+ static constexpr float max_extrude = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 500);
+ #if ENABLED(TOOLCHANGE_PARK)
+ EDIT_ITEM(bool, MSG_FILAMENT_PARK_ENABLED, &toolchange_settings.enable_park);
+ #endif
+ EDIT_ITEM(float3, MSG_FILAMENT_SWAP_LENGTH, &toolchange_settings.swap_length, 0, max_extrude);
+ EDIT_ITEM(float41sign, MSG_FILAMENT_SWAP_EXTRA, &toolchange_settings.extra_resume, -10, 10);
+ EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_RETRACT_SPEED, &toolchange_settings.retract_speed, 10, 5400);
+ EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_UNRETRACT_SPEED, &toolchange_settings.unretract_speed, 10, 5400);
+ EDIT_ITEM(float3, MSG_FILAMENT_PURGE_LENGTH, &toolchange_settings.extra_prime, 0, max_extrude);
+ EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_PRIME_SPEED, &toolchange_settings.prime_speed, 10, 5400);
+ EDIT_ITEM_FAST(uint8, MSG_SINGLENOZZLE_FAN_SPEED, &toolchange_settings.fan_speed, 0, 255);
+ EDIT_ITEM_FAST(uint8, MSG_SINGLENOZZLE_FAN_TIME, &toolchange_settings.fan_time, 1, 30);
+ #endif
+ EDIT_ITEM(float3, MSG_TOOL_CHANGE_ZLIFT, &toolchange_settings.z_raise, 0, 10);
+ END_MENU();
+ }
+
+ #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
+
+ #include "../../module/motion.h" // for active_extruder
+ #include "../../gcode/queue.h"
+
+ void menu_toolchange_migration() {
+ FSTR_P const msg_migrate = GET_TEXT_F(MSG_TOOL_MIGRATION_SWAP);
+
+ START_MENU();
+ BACK_ITEM(MSG_CONFIGURATION);
+
+ // Auto mode ON/OFF
+ EDIT_ITEM(bool, MSG_TOOL_MIGRATION_AUTO, &migration.automode);
+ EDIT_ITEM(uint8, MSG_TOOL_MIGRATION_END, &migration.last, 0, EXTRUDERS - 1);
+
+ // Migrate to a chosen extruder
+ EXTRUDER_LOOP() {
+ if (e != active_extruder) {
+ ACTION_ITEM_N_F(e, msg_migrate, []{
+ char cmd[12];
+ sprintf_P(cmd, PSTR("M217 T%i"), int(MenuItemBase::itemIndex));
+ queue.inject(cmd);
+ });
+ }
+ }
+ END_MENU();
+ }
+ #endif
+
+#endif
+
+#if HAS_HOTEND_OFFSET
+ #include "../../module/motion.h"
+ #include "../../gcode/queue.h"
+
+ void menu_tool_offsets() {
+
+ auto _recalc_offsets = []{
+ if (active_extruder && all_axes_trusted()) { // For the 2nd extruder re-home so the next tool-change gets the new offsets.
+ queue.inject_P(G28_STR); // In future, we can babystep the 2nd extruder (if active), making homing unnecessary.
+ active_extruder = 0;
+ }
+ };
+
+ START_MENU();
+ BACK_ITEM(MSG_CONFIGURATION);
+ #if ENABLED(DUAL_X_CARRIAGE)
+ EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_HOTEND_OFFSET_A, &hotend_offset[1].x, float(X2_HOME_POS - 25), float(X2_HOME_POS + 25), _recalc_offsets);
+ #else
+ EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_HOTEND_OFFSET_A, &hotend_offset[1].x, -99.0, 99.0, _recalc_offsets);
+ #endif
+ EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_HOTEND_OFFSET_A, &hotend_offset[1].y, -99.0, 99.0, _recalc_offsets);
+ EDIT_ITEM_FAST_N(float42_52, Z_AXIS, MSG_HOTEND_OFFSET_A, &hotend_offset[1].z, Z_PROBE_LOW_POINT, 10.0, _recalc_offsets);
+ #if ENABLED(EEPROM_SETTINGS)
+ ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings);
+ #endif
+ END_MENU();
+ }
+#endif
+
+#if ENABLED(DUAL_X_CARRIAGE)
+
+ void menu_idex() {
+ const bool need_g28 = axes_should_home(_BV(Y_AXIS)|_BV(Z_AXIS));
+
+ START_MENU();
+ BACK_ITEM(MSG_CONFIGURATION);
+
+ GCODES_ITEM(MSG_IDEX_MODE_AUTOPARK, F("M605S1\nG28X\nG1X0"));
+ GCODES_ITEM(MSG_IDEX_MODE_DUPLICATE, need_g28
+ ? F("M605S1\nT0\nG28\nM605S2\nG28X\nG1X0") // If Y or Z is not homed, do a full G28 first
+ : F("M605S1\nT0\nM605S2\nG28X\nG1X0")
+ );
+ GCODES_ITEM(MSG_IDEX_MODE_MIRRORED_COPY, need_g28
+ ? F("M605S1\nT0\nG28\nM605S2\nG28X\nG1X0\nM605S3") // If Y or Z is not homed, do a full G28 first
+ : F("M605S1\nT0\nM605S2\nG28 X\nG1X0\nM605S3")
+ );
+ GCODES_ITEM(MSG_IDEX_MODE_FULL_CTRL, F("M605S0\nG28X"));
+
+ EDIT_ITEM(float42_52, MSG_IDEX_DUPE_GAP, &duplicate_extruder_x_offset, (X2_MIN_POS) - (X1_MIN_POS), (X_BED_SIZE) - 20);
+
+ END_MENU();
+ }
+
+#endif
+
+#if ENABLED(BLTOUCH)
+
+ #if ENABLED(BLTOUCH_LCD_VOLTAGE_MENU)
+ void bltouch_report() {
+ PGMSTR(mode0, "OD");
+ PGMSTR(mode1, "5V");
+ DEBUG_ECHOPGM("BLTouch Mode: ");
+ DEBUG_ECHOPGM_P(bltouch.od_5v_mode ? mode1 : mode0);
+ DEBUG_ECHOLNPGM(" (Default " TERN(BLTOUCH_SET_5V_MODE, "5V", "OD") ")");
+ char mess[21];
+ strcpy_P(mess, PSTR("BLTouch Mode: "));
+ strcpy_P(&mess[15], bltouch.od_5v_mode ? mode1 : mode0);
+ ui.set_status(mess);
+ ui.return_to_status();
+ }
+ #endif
+
+ void menu_bltouch() {
+ START_MENU();
+ BACK_ITEM(MSG_CONFIGURATION);
+ ACTION_ITEM(MSG_BLTOUCH_RESET, bltouch._reset);
+ ACTION_ITEM(MSG_BLTOUCH_SELFTEST, bltouch._selftest);
+ ACTION_ITEM(MSG_BLTOUCH_DEPLOY, bltouch._deploy);
+ ACTION_ITEM(MSG_BLTOUCH_STOW, bltouch._stow);
+ ACTION_ITEM(MSG_BLTOUCH_SW_MODE, bltouch._set_SW_mode);
+ #ifdef BLTOUCH_HS_MODE
+ EDIT_ITEM(bool, MSG_BLTOUCH_SPEED_MODE, &bltouch.high_speed_mode);
+ #endif
+ #if ENABLED(BLTOUCH_LCD_VOLTAGE_MENU)
+ CONFIRM_ITEM(MSG_BLTOUCH_5V_MODE, MSG_BLTOUCH_5V_MODE, MSG_BUTTON_CANCEL, bltouch._set_5V_mode, nullptr, GET_TEXT_F(MSG_BLTOUCH_MODE_CHANGE));
+ CONFIRM_ITEM(MSG_BLTOUCH_OD_MODE, MSG_BLTOUCH_OD_MODE, MSG_BUTTON_CANCEL, bltouch._set_OD_mode, nullptr, GET_TEXT_F(MSG_BLTOUCH_MODE_CHANGE));
+ ACTION_ITEM(MSG_BLTOUCH_MODE_STORE, bltouch._mode_store);
+ CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_5V, MSG_BLTOUCH_MODE_STORE_5V, MSG_BUTTON_CANCEL, bltouch.mode_conv_5V, nullptr, GET_TEXT_F(MSG_BLTOUCH_MODE_CHANGE));
+ CONFIRM_ITEM(MSG_BLTOUCH_MODE_STORE_OD, MSG_BLTOUCH_MODE_STORE_OD, MSG_BUTTON_CANCEL, bltouch.mode_conv_OD, nullptr, GET_TEXT_F(MSG_BLTOUCH_MODE_CHANGE));
+ ACTION_ITEM(MSG_BLTOUCH_MODE_ECHO, bltouch_report);
+ #endif
+ END_MENU();
+ }
+
+#endif
+
+#if ENABLED(TOUCH_MI_PROBE)
+
+ void menu_touchmi() {
+ ui.defer_status_screen();
+ START_MENU();
+ BACK_ITEM(MSG_CONFIGURATION);
+ GCODES_ITEM(MSG_TOUCHMI_INIT, F("M851 Z0\nG28\nG1 F200 Z0"));
+ SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset);
+ GCODES_ITEM(MSG_TOUCHMI_SAVE, F("M500\nG1 F200 Z10"));
+ GCODES_ITEM(MSG_TOUCHMI_ZTEST, F("G28\nG1 F200 Z0"));
+ END_MENU();
+ }
+
+#endif
+
+#if ENABLED(CONTROLLER_FAN_MENU)
+
+ #include "../../feature/controllerfan.h"
+
+ void menu_controller_fan() {
+ START_MENU();
+ BACK_ITEM(MSG_CONFIGURATION);
+ EDIT_ITEM_FAST(percent, MSG_CONTROLLER_FAN_IDLE_SPEED, &controllerFan.settings.idle_speed, CONTROLLERFAN_SPEED_MIN, 255);
+ EDIT_ITEM(bool, MSG_CONTROLLER_FAN_AUTO_ON, &controllerFan.settings.auto_mode);
+ if (controllerFan.settings.auto_mode) {
+ EDIT_ITEM_FAST(percent, MSG_CONTROLLER_FAN_SPEED, &controllerFan.settings.active_speed, CONTROLLERFAN_SPEED_MIN, 255);
+ EDIT_ITEM(uint16_4, MSG_CONTROLLER_FAN_DURATION, &controllerFan.settings.duration, 0, 4800);
+ }
+ END_MENU();
+ }
+
+#endif
+
+#if ENABLED(FWRETRACT)
+
+ #include "../../feature/fwretract.h"
+
+ void menu_config_retract() {
+ START_MENU();
+ BACK_ITEM(MSG_CONFIGURATION);
+ #if ENABLED(FWRETRACT_AUTORETRACT)
+ EDIT_ITEM(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract);
+ #endif
+ EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT, &fwretract.settings.retract_length, 0, 100);
+ #if HAS_MULTI_EXTRUDER
+ EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.settings.swap_retract_length, 0, 100);
+ #endif
+ EDIT_ITEM(float3, MSG_CONTROL_RETRACTF, &fwretract.settings.retract_feedrate_mm_s, 1, 999);
+ EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_ZHOP, &fwretract.settings.retract_zraise, 0, 999);
+ EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.settings.retract_recover_extra, -100, 100);
+ #if HAS_MULTI_EXTRUDER
+ EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.settings.swap_retract_recover_extra, -100, 100);
+ #endif
+ EDIT_ITEM(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.settings.retract_recover_feedrate_mm_s, 1, 999);
+ #if HAS_MULTI_EXTRUDER
+ EDIT_ITEM(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.settings.swap_retract_recover_feedrate_mm_s, 1, 999);
+ #endif
+ END_MENU();
+ }
+
+#endif
+
+#if HAS_PREHEAT && DISABLED(SLIM_LCD_MENUS)
+
+ void _menu_configuration_preheat_settings() {
+ #define _MINTEMP_ITEM(N) HEATER_##N##_MINTEMP,
+ #define _MAXTEMP_ITEM(N) HEATER_##N##_MAXTEMP,
+ #define MINTEMP_ALL _MIN(REPEAT(HOTENDS, _MINTEMP_ITEM) 999)
+ #define MAXTEMP_ALL _MAX(REPEAT(HOTENDS, _MAXTEMP_ITEM) 0)
+ const uint8_t m = MenuItemBase::itemIndex;
+ START_MENU();
+ STATIC_ITEM_F(ui.get_preheat_label(m), SS_DEFAULT|SS_INVERT);
+ BACK_ITEM(MSG_CONFIGURATION);
+ #if HAS_FAN
+ editable.uint8 = uint8_t(ui.material_preset[m].fan_speed);
+ EDIT_ITEM_N(percent, m, MSG_FAN_SPEED, &editable.uint8, 0, 255, []{ ui.material_preset[MenuItemBase::itemIndex].fan_speed = editable.uint8; });
+ #endif
+ #if HAS_TEMP_HOTEND
+ EDIT_ITEM(int3, MSG_NOZZLE, &ui.material_preset[m].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - (HOTEND_OVERSHOOT));
+ #endif
+ #if HAS_HEATED_BED
+ EDIT_ITEM(int3, MSG_BED, &ui.material_preset[m].bed_temp, BED_MINTEMP, BED_MAX_TARGET);
+ #endif
+ #if ENABLED(EEPROM_SETTINGS)
+ ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings);
+ #endif
+ END_MENU();
+ }
+
+#endif
+
+#if ENABLED(CUSTOM_MENU_CONFIG)
+
+ void _lcd_custom_menus_configuration_gcode(FSTR_P const fstr) {
+ queue.inject(fstr);
+ TERN_(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback());
+ TERN_(CUSTOM_MENU_CONFIG_SCRIPT_RETURN, ui.return_to_status());
+ }
+
+ void custom_menus_configuration() {
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ #define HAS_CUSTOM_ITEM_CONF(N) (defined(CONFIG_MENU_ITEM_##N##_DESC) && defined(CONFIG_MENU_ITEM_##N##_GCODE))
+
+ #ifdef CUSTOM_MENU_CONFIG_SCRIPT_DONE
+ #define _DONE_SCRIPT "\n" CUSTOM_MENU_CONFIG_SCRIPT_DONE
+ #else
+ #define _DONE_SCRIPT ""
+ #endif
+ #define GCODE_LAMBDA_CONF(N) []{ _lcd_custom_menus_configuration_gcode(F(CONFIG_MENU_ITEM_##N##_GCODE _DONE_SCRIPT)); }
+ #define _CUSTOM_ITEM_CONF(N) ACTION_ITEM_F(F(CONFIG_MENU_ITEM_##N##_DESC), GCODE_LAMBDA_CONF(N));
+ #define _CUSTOM_ITEM_CONF_CONFIRM(N) \
+ SUBMENU_F(F(CONFIG_MENU_ITEM_##N##_DESC), []{ \
+ MenuItem_confirm::confirm_screen( \
+ GCODE_LAMBDA_CONF(N), nullptr, \
+ F(CONFIG_MENU_ITEM_##N##_DESC "?") \
+ ); \
+ })
+
+ #define CUSTOM_ITEM_CONF(N) do{ \
+ constexpr char c = CONFIG_MENU_ITEM_##N##_GCODE[strlen(CONFIG_MENU_ITEM_##N##_GCODE) - 1]; \
+ static_assert(c != '\n' && c != '\r', "CONFIG_MENU_ITEM_" STRINGIFY(N) "_GCODE cannot have a newline at the end. Please remove it."); \
+ if (ENABLED(CONFIG_MENU_ITEM_##N##_CONFIRM)) \
+ _CUSTOM_ITEM_CONF_CONFIRM(N); \
+ else \
+ _CUSTOM_ITEM_CONF(N); \
+ }while(0)
+
+ #if HAS_CUSTOM_ITEM_CONF(1)
+ CUSTOM_ITEM_CONF(1);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(2)
+ CUSTOM_ITEM_CONF(2);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(3)
+ CUSTOM_ITEM_CONF(3);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(4)
+ CUSTOM_ITEM_CONF(4);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(5)
+ CUSTOM_ITEM_CONF(5);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(6)
+ CUSTOM_ITEM_CONF(6);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(7)
+ CUSTOM_ITEM_CONF(7);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(8)
+ CUSTOM_ITEM_CONF(8);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(9)
+ CUSTOM_ITEM_CONF(9);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(10)
+ CUSTOM_ITEM_CONF(10);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(11)
+ CUSTOM_ITEM_CONF(11);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(12)
+ CUSTOM_ITEM_CONF(12);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(13)
+ CUSTOM_ITEM_CONF(13);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(14)
+ CUSTOM_ITEM_CONF(14);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(15)
+ CUSTOM_ITEM_CONF(15);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(16)
+ CUSTOM_ITEM_CONF(16);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(17)
+ CUSTOM_ITEM_CONF(17);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(18)
+ CUSTOM_ITEM_CONF(18);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(19)
+ CUSTOM_ITEM_CONF(19);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(20)
+ CUSTOM_ITEM_CONF(20);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(21)
+ CUSTOM_ITEM_CONF(21);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(22)
+ CUSTOM_ITEM_CONF(22);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(23)
+ CUSTOM_ITEM_CONF(23);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(24)
+ CUSTOM_ITEM_CONF(24);
+ #endif
+ #if HAS_CUSTOM_ITEM_CONF(25)
+ CUSTOM_ITEM_CONF(25);
+ #endif
+ END_MENU();
+ }
+
+#endif // CUSTOM_MENU_CONFIG
+
+void menu_configuration() {
+ const bool busy = printer_busy();
+
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ //
+ // Debug Menu when certain options are enabled
+ //
+ #if HAS_DEBUG_MENU
+ SUBMENU(MSG_DEBUG_MENU, menu_debug);
+ #endif
+
+ #if ENABLED(CUSTOM_MENU_CONFIG)
+ if (TERN1(CUSTOM_MENU_CONFIG_ONLY_IDLE, !busy)) {
+ #ifdef CUSTOM_MENU_CONFIG_TITLE
+ SUBMENU_F(F(CUSTOM_MENU_CONFIG_TITLE), custom_menus_configuration);
+ #else
+ SUBMENU(MSG_CUSTOM_COMMANDS, custom_menus_configuration);
+ #endif
+ }
+ #endif
+
+ SUBMENU(MSG_ADVANCED_SETTINGS, menu_advanced_settings);
+
+ #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+ SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset);
+ #elif HAS_BED_PROBE
+ EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
+ #endif
+
+ //
+ // Set Fan Controller speed
+ //
+ #if ENABLED(CONTROLLER_FAN_MENU)
+ SUBMENU(MSG_CONTROLLER_FAN, menu_controller_fan);
+ #endif
+
+ if (!busy) {
+ #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION)
+ SUBMENU(MSG_DELTA_CALIBRATE, menu_delta_calibrate);
+ #endif
+
+ #if HAS_HOTEND_OFFSET
+ SUBMENU(MSG_OFFSETS_MENU, menu_tool_offsets);
+ #endif
+
+ #if ENABLED(DUAL_X_CARRIAGE)
+ SUBMENU(MSG_IDEX_MENU, menu_idex);
+ #endif
+
+ #if ENABLED(BLTOUCH)
+ SUBMENU(MSG_BLTOUCH, menu_bltouch);
+ #endif
+
+ #if ENABLED(TOUCH_MI_PROBE)
+ SUBMENU(MSG_TOUCHMI_PROBE, menu_touchmi);
+ #endif
+ }
+
+ //
+ // Set single nozzle filament retract and prime length
+ //
+ #if HAS_MULTI_EXTRUDER
+ SUBMENU(MSG_TOOL_CHANGE, menu_tool_change);
+ #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
+ SUBMENU(MSG_TOOL_MIGRATION, menu_toolchange_migration);
+ #endif
+ #endif
+
+ #if HAS_LCD_BRIGHTNESS
+ EDIT_ITEM_FAST(uint8, MSG_BRIGHTNESS, &ui.brightness, LCD_BRIGHTNESS_MIN, LCD_BRIGHTNESS_MAX, ui.refresh_brightness, true);
+ #endif
+ #if HAS_LCD_CONTRAST && LCD_CONTRAST_MIN < LCD_CONTRAST_MAX
+ EDIT_ITEM_FAST(uint8, MSG_CONTRAST, &ui.contrast, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX, ui.refresh_contrast, true);
+ #endif
+
+ //
+ // Set display backlight / sleep timeout
+ //
+ #if LCD_BACKLIGHT_TIMEOUT && LCD_BKL_TIMEOUT_MIN < LCD_BKL_TIMEOUT_MAX
+ EDIT_ITEM(uint16_4, MSG_LCD_TIMEOUT_SEC, &ui.lcd_backlight_timeout, LCD_BKL_TIMEOUT_MIN, LCD_BKL_TIMEOUT_MAX, ui.refresh_backlight_timeout);
+ #elif HAS_DISPLAY_SLEEP
+ EDIT_ITEM(uint8, MSG_SCREEN_TIMEOUT, &ui.sleep_timeout_minutes, SLEEP_TIMEOUT_MIN, SLEEP_TIMEOUT_MAX, ui.refresh_screen_timeout);
+ #endif
+
+ #if ENABLED(FWRETRACT)
+ SUBMENU(MSG_RETRACT, menu_config_retract);
+ #endif
+
+ #if HAS_FILAMENT_SENSOR
+ EDIT_ITEM(bool, MSG_RUNOUT_SENSOR, &runout.enabled, runout.reset);
+ #endif
+
+ #if HAS_FANCHECK
+ EDIT_ITEM(bool, MSG_FANCHECK, &fan_check.enabled);
+ #endif
+
+ #if ENABLED(POWER_LOSS_RECOVERY)
+ EDIT_ITEM(bool, MSG_OUTAGE_RECOVERY, &recovery.enabled, recovery.changed);
+ #endif
+
+ // Preheat configurations
+ #if HAS_PREHEAT && DISABLED(SLIM_LCD_MENUS)
+ LOOP_L_N(m, PREHEAT_COUNT)
+ SUBMENU_N_f(m, ui.get_preheat_label(m), MSG_PREHEAT_M_SETTINGS, _menu_configuration_preheat_settings);
+ #endif
+
+ #if ENABLED(SOUND_MENU_ITEM)
+ EDIT_ITEM(bool, MSG_SOUND, &ui.sound_on, []{ ui.chirp(); });
+ #endif
+
+ #if ENABLED(EEPROM_SETTINGS)
+ ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings);
+ if (!busy) ACTION_ITEM(MSG_LOAD_EEPROM, ui.load_settings);
+ #endif
+
+ if (!busy) ACTION_ITEM(MSG_RESTORE_DEFAULTS, ui.reset_settings);
+
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU
diff --git a/src/lcd/menu/menu_delta_calibrate.cpp b/src/lcd/menu/menu_delta_calibrate.cpp
new file mode 100644
index 0000000..ae935e5
--- /dev/null
+++ b/src/lcd/menu/menu_delta_calibrate.cpp
@@ -0,0 +1,160 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Delta Calibrate Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if HAS_MARLINUI_MENU && EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION)
+
+#include "menu_item.h"
+#include "../../module/delta.h"
+#include "../../module/motion.h"
+#include "../../module/planner.h"
+
+#if HAS_LEVELING
+ #include "../../feature/bedlevel/bedlevel.h"
+#endif
+
+#if ENABLED(EXTENSIBLE_UI)
+ #include "../extui/ui_api.h"
+#endif
+
+#if HAS_PROBE_XY_OFFSET
+ #include "../../module/probe.h"
+#endif
+
+void _man_probe_pt(const xy_pos_t &xy) {
+ if (!ui.wait_for_move) {
+ ui.wait_for_move = true;
+ do_blocking_move_to_xy_z(xy, Z_CLEARANCE_BETWEEN_PROBES);
+ ui.wait_for_move = false;
+ ui.synchronize();
+ ui.manual_move.menu_scale = _MAX(PROBE_MANUALLY_STEP, MIN_STEPS_PER_SEGMENT / planner.settings.axis_steps_per_mm[0]); // Use first axis as for delta XYZ should always match
+ ui.goto_screen([]{ lcd_move_axis(Z_AXIS); });
+ }
+}
+
+#if ENABLED(DELTA_AUTO_CALIBRATION)
+
+ #if HAS_RESUME_CONTINUE
+ #include "../../MarlinCore.h" // for wait_for_user_response()
+ #endif
+ #if ENABLED(HOST_PROMPT_SUPPORT)
+ #include "../../feature/host_actions.h" // for hostui.prompt_do
+ #endif
+
+ float lcd_probe_pt(const xy_pos_t &xy) {
+ _man_probe_pt(xy);
+ ui.defer_status_screen();
+ TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_do(PROMPT_USER_CONTINUE, F("Delta Calibration in progress"), FPSTR(CONTINUE_STR)));
+ TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(F("Delta Calibration in progress")));
+ TERN_(HAS_RESUME_CONTINUE, wait_for_user_response());
+ ui.goto_previous_screen_no_defer();
+ return current_position.z;
+ }
+
+#endif
+
+#if ENABLED(DELTA_CALIBRATION_MENU)
+
+ #include "../../gcode/queue.h"
+
+ void _lcd_calibrate_homing() {
+ _lcd_draw_homing();
+ if (all_axes_homed()) ui.goto_previous_screen();
+ }
+
+ void _lcd_delta_calibrate_home() {
+ queue.inject_P(G28_STR);
+ ui.goto_screen(_lcd_calibrate_homing);
+ }
+
+ void _goto_tower_a(const_float_t a) {
+ float dcr = DELTA_PRINTABLE_RADIUS - PROBING_MARGIN;
+ TERN_(HAS_PROBE_XY_OFFSET, dcr -= HYPOT(probe.offset_xy.x, probe.offset_xy.y));
+ TERN_(HAS_DELTA_SENSORLESS_PROBING, dcr *= sensorless_radius_factor);
+ xy_pos_t tower_vec = { cos(RADIANS(a)), sin(RADIANS(a)) };
+ _man_probe_pt(tower_vec * dcr);
+ }
+ void _goto_tower_x() { _goto_tower_a(210); }
+ void _goto_tower_y() { _goto_tower_a(330); }
+ void _goto_tower_z() { _goto_tower_a( 90); }
+ void _goto_center() { xy_pos_t ctr{0}; _man_probe_pt(ctr); }
+
+#endif
+
+void lcd_delta_settings() {
+ auto _recalc_delta_settings = []{
+ TERN_(HAS_LEVELING, reset_bed_level()); // After changing kinematics bed-level data is no longer valid
+ recalc_delta_settings();
+ };
+ START_MENU();
+ BACK_ITEM(MSG_DELTA_CALIBRATE);
+ EDIT_ITEM(float52sign, MSG_DELTA_HEIGHT, &delta_height, delta_height - 10, delta_height + 10, _recalc_delta_settings);
+ #define EDIT_ENDSTOP_ADJ(LABEL,N) EDIT_ITEM_F(float43, F(LABEL), &delta_endstop_adj.N, -5, 0, _recalc_delta_settings)
+ EDIT_ENDSTOP_ADJ("Ex", a);
+ EDIT_ENDSTOP_ADJ("Ey", b);
+ EDIT_ENDSTOP_ADJ("Ez", c);
+ EDIT_ITEM(float52sign, MSG_DELTA_RADIUS, &delta_radius, delta_radius - 5, delta_radius + 5, _recalc_delta_settings);
+ #define EDIT_ANGLE_TRIM(LABEL,N) EDIT_ITEM_F(float43, F(LABEL), &delta_tower_angle_trim.N, -5, 5, _recalc_delta_settings)
+ EDIT_ANGLE_TRIM("Tx", a);
+ EDIT_ANGLE_TRIM("Ty", b);
+ EDIT_ANGLE_TRIM("Tz", c);
+ EDIT_ITEM(float52sign, MSG_DELTA_DIAG_ROD, &delta_diagonal_rod, delta_diagonal_rod - 5, delta_diagonal_rod + 5, _recalc_delta_settings);
+ END_MENU();
+}
+
+void menu_delta_calibrate() {
+ #if ENABLED(DELTA_CALIBRATION_MENU)
+ const bool all_homed = all_axes_homed(); // Acquire ahead of loop
+ #endif
+
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ #if ENABLED(DELTA_AUTO_CALIBRATION)
+ GCODES_ITEM(MSG_DELTA_AUTO_CALIBRATE, F("G33"));
+ #if ENABLED(EEPROM_SETTINGS)
+ ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings);
+ ACTION_ITEM(MSG_LOAD_EEPROM, ui.load_settings);
+ #endif
+ #endif
+
+ SUBMENU(MSG_DELTA_SETTINGS, lcd_delta_settings);
+
+ #if ENABLED(DELTA_CALIBRATION_MENU)
+ SUBMENU(MSG_AUTO_HOME, _lcd_delta_calibrate_home);
+ if (all_homed) {
+ SUBMENU(MSG_DELTA_CALIBRATE_X, _goto_tower_x);
+ SUBMENU(MSG_DELTA_CALIBRATE_Y, _goto_tower_y);
+ SUBMENU(MSG_DELTA_CALIBRATE_Z, _goto_tower_z);
+ SUBMENU(MSG_DELTA_CALIBRATE_CENTER, _goto_center);
+ }
+ #endif
+
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU && (DELTA_CALIBRATION_MENU || DELTA_AUTO_CALIBRATION)
diff --git a/src/lcd/menu/menu_filament.cpp b/src/lcd/menu/menu_filament.cpp
new file mode 100644
index 0000000..122f0c4
--- /dev/null
+++ b/src/lcd/menu/menu_filament.cpp
@@ -0,0 +1,350 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Filament Change Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if BOTH(HAS_MARLINUI_MENU, ADVANCED_PAUSE_FEATURE)
+
+#include "menu_item.h"
+#include "../../module/temperature.h"
+#include "../../feature/pause.h"
+#include "../../gcode/queue.h"
+#if HAS_FILAMENT_SENSOR
+ #include "../../feature/runout.h"
+#endif
+#if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
+ #include "../../MarlinCore.h"
+#endif
+
+//
+// Change Filament > Change/Unload/Load Filament
+//
+static PauseMode _change_filament_mode; // = PAUSE_MODE_PAUSE_PRINT
+static int8_t _change_filament_extruder; // = 0
+
+inline FSTR_P _change_filament_command() {
+ switch (_change_filament_mode) {
+ case PAUSE_MODE_LOAD_FILAMENT: return F("M701 T%d");
+ case PAUSE_MODE_UNLOAD_FILAMENT: return _change_filament_extruder >= 0
+ ? F("M702 T%d") : F("M702 ;%d");
+ case PAUSE_MODE_CHANGE_FILAMENT:
+ case PAUSE_MODE_PAUSE_PRINT:
+ default: break;
+ }
+ return F("M600 B0 T%d");
+}
+
+// Initiate Filament Load/Unload/Change at the specified temperature
+static void _change_filament_with_temp(const uint16_t celsius) {
+ char cmd[11];
+ sprintf_P(cmd, FTOP(_change_filament_command()), _change_filament_extruder);
+ thermalManager.setTargetHotend(celsius, _change_filament_extruder);
+ queue.inject(cmd);
+}
+
+#if HAS_PREHEAT
+ static void _change_filament_with_preset() {
+ _change_filament_with_temp(ui.material_preset[MenuItemBase::itemIndex].hotend_temp);
+ }
+#endif
+
+static void _change_filament_with_custom() {
+ _change_filament_with_temp(thermalManager.degTargetHotend(MenuItemBase::itemIndex));
+}
+
+//
+// Menu to choose the temperature and start Filament Change
+//
+
+inline FSTR_P change_filament_header(const PauseMode mode) {
+ switch (mode) {
+ case PAUSE_MODE_LOAD_FILAMENT: return GET_TEXT_F(MSG_FILAMENTLOAD);
+ case PAUSE_MODE_UNLOAD_FILAMENT: return GET_TEXT_F(MSG_FILAMENTUNLOAD);
+ default: break;
+ }
+ return GET_TEXT_F(MSG_FILAMENTCHANGE);
+}
+
+void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) {
+ _change_filament_mode = mode;
+ _change_filament_extruder = extruder;
+ const int8_t old_index = MenuItemBase::itemIndex;
+ START_MENU();
+ if (LCD_HEIGHT >= 4) STATIC_ITEM_F(change_filament_header(mode), SS_DEFAULT|SS_INVERT);
+ BACK_ITEM(MSG_BACK);
+ #if HAS_PREHEAT
+ LOOP_L_N(m, PREHEAT_COUNT)
+ ACTION_ITEM_N_f(m, ui.get_preheat_label(m), MSG_PREHEAT_M, _change_filament_with_preset);
+ #endif
+ EDIT_ITEM_FAST_N(int3, extruder, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[extruder].target,
+ EXTRUDE_MINTEMP, thermalManager.hotend_max_target(extruder),
+ _change_filament_with_custom
+ );
+ END_MENU();
+ MenuItemBase::itemIndex = old_index;
+}
+
+/**
+ * "Change Filament" submenu
+ */
+#if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
+ bool printingIsPaused();
+#endif
+
+void menu_change_filament() {
+ #if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
+ // Say "filament change" when no print is active
+ editable.int8 = printingIsPaused() ? PAUSE_MODE_PAUSE_PRINT : PAUSE_MODE_CHANGE_FILAMENT;
+
+ #if E_STEPPERS > 1 && ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS)
+ bool too_cold = false;
+ for (uint8_t s = 0; !too_cold && s < E_STEPPERS; s++)
+ too_cold = thermalManager.targetTooColdToExtrude(s);
+ #endif
+
+ #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
+ const bool is_busy = printer_busy();
+ #endif
+
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ // Change filament
+ #if E_STEPPERS == 1
+ FSTR_P const fmsg = GET_TEXT_F(MSG_FILAMENTCHANGE);
+ if (thermalManager.targetTooColdToExtrude(active_extruder))
+ SUBMENU_F(fmsg, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, 0); });
+ else
+ GCODES_ITEM_F(fmsg, F("M600 B0"));
+ #else
+ FSTR_P const fmsg = GET_TEXT_F(MSG_FILAMENTCHANGE_E);
+ LOOP_L_N(s, E_STEPPERS) {
+ if (thermalManager.targetTooColdToExtrude(s))
+ SUBMENU_N_F(s, fmsg, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, MenuItemBase::itemIndex); });
+ else {
+ ACTION_ITEM_N_F(s, fmsg, []{
+ PGM_P const cmdpstr = PSTR("M600 B0 T%i");
+ char cmd[strlen_P(cmdpstr) + 3 + 1];
+ sprintf_P(cmd, cmdpstr, int(MenuItemBase::itemIndex));
+ queue.inject(cmd);
+ });
+ }
+ }
+ #endif
+
+ #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
+ if (!is_busy) {
+ // Load filament
+ #if E_STEPPERS == 1
+ FSTR_P const msg_load = GET_TEXT_F(MSG_FILAMENTLOAD);
+ if (thermalManager.targetTooColdToExtrude(active_extruder))
+ SUBMENU_F(msg_load, []{ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 0); });
+ else
+ GCODES_ITEM_F(msg_load, F("M701"));
+ #else
+ FSTR_P const msg_load = GET_TEXT_F(MSG_FILAMENTLOAD_E);
+ LOOP_L_N(s, E_STEPPERS) {
+ if (thermalManager.targetTooColdToExtrude(s))
+ SUBMENU_N_F(s, msg_load, []{ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, MenuItemBase::itemIndex); });
+ else {
+ ACTION_ITEM_N_F(s, msg_load, []{
+ char cmd[12];
+ sprintf_P(cmd, PSTR("M701 T%i"), int(MenuItemBase::itemIndex));
+ queue.inject(cmd);
+ });
+ }
+ }
+ #endif
+
+ // Unload filament
+ #if E_STEPPERS == 1
+ FSTR_P const msg_unload = GET_TEXT_F(MSG_FILAMENTUNLOAD);
+ if (thermalManager.targetTooColdToExtrude(active_extruder))
+ SUBMENU_F(msg_unload, []{ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 0); });
+ else
+ GCODES_ITEM_F(msg_unload, F("M702"));
+ #else
+ #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS)
+ if (too_cold)
+ SUBMENU(MSG_FILAMENTUNLOAD_ALL, []{ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, -1); });
+ else
+ GCODES_ITEM(MSG_FILAMENTUNLOAD_ALL, F("M702"));
+ #endif
+ FSTR_P const msg_unload = GET_TEXT_F(MSG_FILAMENTUNLOAD_E);
+ LOOP_L_N(s, E_STEPPERS) {
+ if (thermalManager.targetTooColdToExtrude(s))
+ SUBMENU_N_F(s, msg_unload, []{ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, MenuItemBase::itemIndex); });
+ else {
+ ACTION_ITEM_N_F(s, msg_unload, []{
+ char cmd[12];
+ sprintf_P(cmd, PSTR("M702 T%i"), int(MenuItemBase::itemIndex));
+ queue.inject(cmd);
+ });
+ }
+ }
+ #endif
+ } // !printer_busy
+ #endif
+
+ END_MENU();
+
+ #else
+
+ if (thermalManager.targetHotEnoughToExtrude(active_extruder))
+ queue.inject(F("M600B0"));
+ else
+ ui.goto_screen([]{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, 0); });
+
+ #endif
+}
+
+static uint8_t hotend_status_extruder = 0;
+
+static FSTR_P pause_header() {
+ switch (pause_mode) {
+ case PAUSE_MODE_CHANGE_FILAMENT: return GET_TEXT_F(MSG_FILAMENT_CHANGE_HEADER);
+ case PAUSE_MODE_LOAD_FILAMENT: return GET_TEXT_F(MSG_FILAMENT_CHANGE_HEADER_LOAD);
+ case PAUSE_MODE_UNLOAD_FILAMENT: return GET_TEXT_F(MSG_FILAMENT_CHANGE_HEADER_UNLOAD);
+ default: break;
+ }
+ return GET_TEXT_F(MSG_FILAMENT_CHANGE_HEADER_PAUSE);
+}
+
+// Portions from STATIC_ITEM...
+#define HOTEND_STATUS_ITEM() do { \
+ if (_menuLineNr == _thisItemNr) { \
+ if (ui.should_draw()) { \
+ IF_DISABLED(HAS_GRAPHICAL_TFT, MenuItem_static::draw(_lcdLineNr, GET_TEXT_F(MSG_FILAMENT_CHANGE_NOZZLE), SS_INVERT)); \
+ ui.draw_hotend_status(_lcdLineNr, hotend_status_extruder); \
+ } \
+ if (_skipStatic && encoderLine <= _thisItemNr) { \
+ ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \
+ ++encoderLine; \
+ } \
+ ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); \
+ } \
+ ++_thisItemNr; \
+}while(0)
+
+void menu_pause_option() {
+ START_MENU();
+ #if LCD_HEIGHT > 2
+ STATIC_ITEM(MSG_FILAMENT_CHANGE_OPTION_HEADER);
+ #endif
+ ACTION_ITEM(MSG_FILAMENT_CHANGE_OPTION_PURGE, []{ pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; });
+
+ #if HAS_FILAMENT_SENSOR
+ const bool still_out = runout.filament_ran_out;
+ if (still_out)
+ EDIT_ITEM(bool, MSG_RUNOUT_SENSOR, &runout.enabled, runout.reset);
+ #else
+ constexpr bool still_out = false;
+ #endif
+
+ if (!still_out)
+ ACTION_ITEM(MSG_FILAMENT_CHANGE_OPTION_RESUME, []{ pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; });
+
+ END_MENU();
+}
+
+//
+// ADVANCED_PAUSE_FEATURE message screens
+//
+// Warning: fmsg must have three null bytes to delimit lines!
+//
+void _lcd_pause_message(FSTR_P const fmsg) {
+ PGM_P const msg1 = FTOP(fmsg);
+ PGM_P const msg2 = msg1 + strlen_P(msg1) + 1;
+ PGM_P const msg3 = msg2 + strlen_P(msg2) + 1;
+ const bool has2 = msg2[0], has3 = msg3[0],
+ skip1 = !has2 && (LCD_HEIGHT) >= 5;
+
+ START_SCREEN();
+ STATIC_ITEM_F(pause_header(), SS_DEFAULT|SS_INVERT); // 1: Header
+ if (skip1) SKIP_ITEM(); // Move a single-line message down
+ STATIC_ITEM_F(FPSTR(msg1)); // 2: Message Line 1
+ if (has2) STATIC_ITEM_F(FPSTR(msg2)); // 3: Message Line 2
+ if (has3 && (LCD_HEIGHT) >= 5) STATIC_ITEM_F(FPSTR(msg3)); // 4: Message Line 3 (if LCD has 5 lines)
+ if (skip1 + 1 + has2 + has3 < (LCD_HEIGHT) - 2) SKIP_ITEM(); // Push Hotend Status down, if needed
+ HOTEND_STATUS_ITEM(); // 5: Hotend Status
+ END_SCREEN();
+}
+
+void lcd_pause_parking_message() { _lcd_pause_message(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); }
+void lcd_pause_changing_message() { _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); }
+void lcd_pause_unload_message() { _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); }
+void lcd_pause_heating_message() { _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); }
+void lcd_pause_heat_message() { _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT)); }
+void lcd_pause_insert_message() { _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT)); }
+void lcd_pause_load_message() { _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); }
+void lcd_pause_waiting_message() { _lcd_pause_message(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING)); }
+void lcd_pause_resume_message() { _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); }
+
+void lcd_pause_purge_message() {
+ #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE)
+ _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_CONT_PURGE));
+ #else
+ _lcd_pause_message(GET_TEXT_F(MSG_FILAMENT_CHANGE_PURGE));
+ #endif
+}
+
+FORCE_INLINE screenFunc_t ap_message_screen(const PauseMessage message) {
+ switch (message) {
+ case PAUSE_MESSAGE_PARKING: return lcd_pause_parking_message;
+ case PAUSE_MESSAGE_CHANGING: return lcd_pause_changing_message;
+ case PAUSE_MESSAGE_UNLOAD: return lcd_pause_unload_message;
+ case PAUSE_MESSAGE_WAITING: return lcd_pause_waiting_message;
+ case PAUSE_MESSAGE_INSERT: return lcd_pause_insert_message;
+ case PAUSE_MESSAGE_LOAD: return lcd_pause_load_message;
+ case PAUSE_MESSAGE_PURGE: return lcd_pause_purge_message;
+ case PAUSE_MESSAGE_RESUME: return lcd_pause_resume_message;
+ case PAUSE_MESSAGE_HEAT: return lcd_pause_heat_message;
+ case PAUSE_MESSAGE_HEATING: return lcd_pause_heating_message;
+ case PAUSE_MESSAGE_OPTION: pause_menu_response = PAUSE_RESPONSE_WAIT_FOR;
+ return menu_pause_option;
+ case PAUSE_MESSAGE_STATUS:
+ default: break;
+ }
+ return nullptr;
+}
+
+void MarlinUI::pause_show_message(
+ const PauseMessage message,
+ const PauseMode mode/*=PAUSE_MODE_SAME*/,
+ const uint8_t extruder/*=active_extruder*/
+) {
+ if (mode != PAUSE_MODE_SAME) pause_mode = mode;
+ hotend_status_extruder = extruder;
+ const screenFunc_t next_screen = ap_message_screen(message);
+ if (next_screen) {
+ ui.defer_status_screen();
+ ui.goto_screen(next_screen);
+ }
+ else
+ ui.return_to_status();
+}
+
+#endif // HAS_MARLINUI_MENU && ADVANCED_PAUSE_FEATURE
diff --git a/src/lcd/menu/menu_game.cpp b/src/lcd/menu/menu_game.cpp
new file mode 100644
index 0000000..fa56d7e
--- /dev/null
+++ b/src/lcd/menu/menu_game.cpp
@@ -0,0 +1,48 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if HAS_GAME_MENU
+
+#include "menu_item.h"
+#include "game/game.h"
+
+void menu_game() {
+ START_MENU();
+ BACK_ITEM(TERN(LCD_INFO_MENU, MSG_INFO_MENU, MSG_MAIN));
+ #if ENABLED(MARLIN_BRICKOUT)
+ SUBMENU(MSG_BRICKOUT, brickout.enter_game);
+ #endif
+ #if ENABLED(MARLIN_INVADERS)
+ SUBMENU(MSG_INVADERS, invaders.enter_game);
+ #endif
+ #if ENABLED(MARLIN_SNAKE)
+ SUBMENU(MSG_SNAKE, snake.enter_game);
+ #endif
+ #if ENABLED(MARLIN_MAZE)
+ SUBMENU(MSG_MAZE, maze.enter_game);
+ #endif
+ END_MENU();
+}
+
+#endif // HAS_GAME_MENU
diff --git a/src/lcd/menu/menu_info.cpp b/src/lcd/menu/menu_info.cpp
new file mode 100644
index 0000000..1018610
--- /dev/null
+++ b/src/lcd/menu/menu_info.cpp
@@ -0,0 +1,320 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Info Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if BOTH(HAS_MARLINUI_MENU, LCD_INFO_MENU)
+
+#include "menu_item.h"
+
+#if HAS_GAMES
+ #include "game/game.h"
+#endif
+
+#define VALUE_ITEM(MSG, VALUE, STYL) do{ char msg[21]; strcpy_P(msg, PSTR(": ")); strcpy(msg + 2, VALUE); STATIC_ITEM(MSG, STYL, msg); }while(0)
+#define VALUE_ITEM_F(MSG, PVALUE, STYL) do{ char msg[21]; strcpy_P(msg, PSTR(": ")); strcpy_P(msg + 2, PSTR(PVALUE)); STATIC_ITEM(MSG, STYL, msg); }while(0)
+
+#if ENABLED(PRINTCOUNTER)
+
+ #include "../../module/printcounter.h"
+
+ //
+ // About Printer > Printer Stats
+ //
+ void menu_info_stats() {
+ if (ui.use_click()) return ui.go_back();
+
+ printStatistics stats = print_job_timer.getStats();
+
+ char buffer[21];
+
+ START_SCREEN(); // 12345678901234567890
+ VALUE_ITEM(MSG_INFO_PRINT_COUNT, i16tostr3left(stats.totalPrints), SS_LEFT); // Print Count: 999
+ VALUE_ITEM(MSG_INFO_COMPLETED_PRINTS, i16tostr3left(stats.finishedPrints), SS_LEFT); // Completed : 666
+
+ STATIC_ITEM(MSG_INFO_PRINT_TIME, SS_LEFT); // Total print Time:
+ STATIC_ITEM_F(F("> "), SS_LEFT, duration_t(stats.printTime).toString(buffer)); // > 99y 364d 23h 59m 59s
+
+ STATIC_ITEM(MSG_INFO_PRINT_LONGEST, SS_LEFT); // Longest job time:
+ STATIC_ITEM_F(F("> "), SS_LEFT, duration_t(stats.longestPrint).toString(buffer)); // > 99y 364d 23h 59m 59s
+
+ STATIC_ITEM(MSG_INFO_PRINT_FILAMENT, SS_LEFT); // Extruded total:
+ sprintf_P(buffer, PSTR("%ld.%im")
+ , long(stats.filamentUsed / 1000)
+ , int16_t(stats.filamentUsed / 100) % 10
+ );
+ STATIC_ITEM_F(F("> "), SS_LEFT, buffer); // > 125m
+
+ #if SERVICE_INTERVAL_1 > 0 || SERVICE_INTERVAL_2 > 0 || SERVICE_INTERVAL_3 > 0
+ strcpy_P(buffer, GET_TEXT(MSG_SERVICE_IN));
+ #endif
+
+ #if SERVICE_INTERVAL_1 > 0
+ STATIC_ITEM_F(F(SERVICE_NAME_1 " "), SS_LEFT, buffer); // Service X in:
+ STATIC_ITEM_F(F("> "), SS_LEFT, duration_t(stats.nextService1).toString(buffer)); // > 7d 12h 11m 10s
+ #endif
+
+ #if SERVICE_INTERVAL_2 > 0
+ STATIC_ITEM_F(F(SERVICE_NAME_2 " "), SS_LEFT, buffer);
+ STATIC_ITEM_F(F("> "), SS_LEFT, duration_t(stats.nextService2).toString(buffer));
+ #endif
+
+ #if SERVICE_INTERVAL_3 > 0
+ STATIC_ITEM_F(F(SERVICE_NAME_3 " "), SS_LEFT, buffer);
+ STATIC_ITEM_F(F("> "), SS_LEFT, duration_t(stats.nextService3).toString(buffer));
+ #endif
+
+ END_SCREEN();
+ }
+
+#endif
+
+//
+// About Printer > Thermistors
+//
+void menu_info_thermistors() {
+ if (ui.use_click()) return ui.go_back();
+
+ START_SCREEN();
+
+ #if HAS_EXTRUDERS
+ #define THERMISTOR_ID TEMP_SENSOR_0
+ #include "../thermistornames.h"
+ STATIC_ITEM_F(F(STR_E0 ": " THERMISTOR_NAME), SS_INVERT);
+ PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_0_MINTEMP), SS_LEFT);
+ PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_0_MAXTEMP), SS_LEFT);
+ STATIC_ITEM(TERN(WATCH_HOTENDS, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT);
+ #endif
+
+ #if TEMP_SENSOR_1 != 0
+ #undef THERMISTOR_ID
+ #define THERMISTOR_ID TEMP_SENSOR_1
+ #include "../thermistornames.h"
+ STATIC_ITEM_F(F(STR_E1 ": " THERMISTOR_NAME), SS_INVERT);
+ PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_1_MINTEMP), SS_LEFT);
+ PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_1_MAXTEMP), SS_LEFT);
+ STATIC_ITEM(TERN(WATCH_HOTENDS, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT);
+ #endif
+
+ #if TEMP_SENSOR_2 != 0
+ #undef THERMISTOR_ID
+ #define THERMISTOR_ID TEMP_SENSOR_2
+ #include "../thermistornames.h"
+ STATIC_ITEM_F(F(STR_E2 ": " THERMISTOR_NAME), SS_INVERT);
+ PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_2_MINTEMP), SS_LEFT);
+ PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_2_MAXTEMP), SS_LEFT);
+ STATIC_ITEM(TERN(WATCH_HOTENDS, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT);
+ #endif
+
+ #if TEMP_SENSOR_3 != 0
+ #undef THERMISTOR_ID
+ #define THERMISTOR_ID TEMP_SENSOR_3
+ #include "../thermistornames.h"
+ STATIC_ITEM_F(F(STR_E3 ": " THERMISTOR_NAME), SS_INVERT);
+ PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_3_MINTEMP), SS_LEFT);
+ PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_3_MAXTEMP), SS_LEFT);
+ STATIC_ITEM(TERN(WATCH_HOTENDS, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT);
+ #endif
+
+ #if TEMP_SENSOR_4 != 0
+ #undef THERMISTOR_ID
+ #define THERMISTOR_ID TEMP_SENSOR_4
+ #include "../thermistornames.h"
+ STATIC_ITEM_F(F(STR_E4 ": " THERMISTOR_NAME), SS_INVERT);
+ PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_4_MINTEMP), SS_LEFT);
+ PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_4_MAXTEMP), SS_LEFT);
+ STATIC_ITEM(TERN(WATCH_HOTENDS, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT);
+ #endif
+
+ #if TEMP_SENSOR_5 != 0
+ #undef THERMISTOR_ID
+ #define THERMISTOR_ID TEMP_SENSOR_5
+ #include "../thermistornames.h"
+ STATIC_ITEM_F(F(STR_E5 ": " THERMISTOR_NAME), SS_INVERT);
+ PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_5_MINTEMP), SS_LEFT);
+ PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_5_MAXTEMP), SS_LEFT);
+ STATIC_ITEM(TERN(WATCH_HOTENDS, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT);
+ #endif
+
+ #if TEMP_SENSOR_6 != 0
+ #undef THERMISTOR_ID
+ #define THERMISTOR_ID TEMP_SENSOR_6
+ #include "../thermistornames.h"
+ STATIC_ITEM_F(F(STR_E6 ": " THERMISTOR_NAME), SS_INVERT);
+ PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_6_MINTEMP), SS_LEFT);
+ PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_6_MAXTEMP), SS_LEFT);
+ STATIC_ITEM(TERN(WATCH_HOTENDS, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT);
+ #endif
+
+ #if TEMP_SENSOR_7 != 0
+ #undef THERMISTOR_ID
+ #define THERMISTOR_ID TEMP_SENSOR_7
+ #include "../thermistornames.h"
+ STATIC_ITEM_F(F(STR_E7 ": " THERMISTOR_NAME), SS_INVERT);
+ PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(HEATER_7_MINTEMP), SS_LEFT);
+ PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(HEATER_7_MAXTEMP), SS_LEFT);
+ STATIC_ITEM(TERN(WATCH_HOTENDS, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT);
+ #endif
+
+ #if HAS_HEATED_BED
+ #undef THERMISTOR_ID
+ #define THERMISTOR_ID TEMP_SENSOR_BED
+ #include "../thermistornames.h"
+ STATIC_ITEM_F(F("BED: " THERMISTOR_NAME), SS_INVERT);
+ PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(BED_MINTEMP), SS_LEFT);
+ PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(BED_MAXTEMP), SS_LEFT);
+ STATIC_ITEM(TERN(WATCH_BED, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT);
+ #endif
+
+ #if HAS_HEATED_CHAMBER
+ #undef THERMISTOR_ID
+ #define THERMISTOR_ID TEMP_SENSOR_CHAMBER
+ #include "../thermistornames.h"
+ STATIC_ITEM_F(F("CHAM: " THERMISTOR_NAME), SS_INVERT);
+ PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(CHAMBER_MINTEMP), SS_LEFT);
+ PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(CHAMBER_MAXTEMP), SS_LEFT);
+ STATIC_ITEM(TERN(WATCH_CHAMBER, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT);
+ #endif
+
+ #if HAS_COOLER
+ #undef THERMISTOR_ID
+ #define THERMISTOR_ID TEMP_SENSOR_COOLER
+ #include "../thermistornames.h"
+ STATIC_ITEM_F(F("COOL: " THERMISTOR_NAME), SS_INVERT);
+ PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(COOLER_MINTEMP), SS_LEFT);
+ PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(COOLER_MAXTEMP), SS_LEFT);
+ STATIC_ITEM(TERN(WATCH_COOLER, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT);
+ #endif
+
+ END_SCREEN();
+}
+
+//
+// About Printer > Board Info
+//
+void menu_info_board() {
+ if (ui.use_click()) return ui.go_back();
+
+ START_SCREEN();
+ STATIC_ITEM_F(F(BOARD_INFO_NAME), SS_DEFAULT|SS_INVERT); // MyPrinterController
+ #ifdef BOARD_WEBSITE_URL
+ STATIC_ITEM_F(F(BOARD_WEBSITE_URL), SS_LEFT); // www.my3dprinter.com
+ #endif
+ PSTRING_ITEM(MSG_INFO_BAUDRATE, STRINGIFY(BAUDRATE), SS_CENTER); // Baud: 250000
+ PSTRING_ITEM(MSG_INFO_PROTOCOL, PROTOCOL_VERSION, SS_CENTER); // Protocol: 1.0
+ PSTRING_ITEM(MSG_INFO_PSU, PSU_NAME, SS_CENTER);
+ END_SCREEN();
+}
+
+//
+// About Printer > Printer Info
+//
+#if ENABLED(LCD_PRINTER_INFO_IS_BOOTSCREEN)
+
+ void menu_show_marlin_bootscreen() {
+ if (ui.use_click()) { ui.goto_previous_screen_no_defer(); }
+ ui.draw_marlin_bootscreen();
+ }
+
+ #if ENABLED(SHOW_CUSTOM_BOOTSCREEN)
+ void menu_show_custom_bootscreen() {
+ if (ui.use_click()) { ui.goto_screen(menu_show_marlin_bootscreen); }
+ ui.draw_custom_bootscreen();
+ }
+ #endif
+
+#else
+
+ void menu_info_printer() {
+ if (ui.use_click()) return ui.go_back();
+ START_SCREEN();
+ STATIC_ITEM(MSG_MARLIN, SS_DEFAULT|SS_INVERT); // Marlin
+ STATIC_ITEM_F(F(SHORT_BUILD_VERSION)); // x.x.x-Branch
+ STATIC_ITEM_F(F(STRING_DISTRIBUTION_DATE)); // YYYY-MM-DD HH:MM
+ STATIC_ITEM_F(F(MACHINE_NAME), SS_DEFAULT|SS_INVERT); // My3DPrinter
+ STATIC_ITEM_F(F(WEBSITE_URL)); // www.my3dprinter.com
+ PSTRING_ITEM(MSG_INFO_EXTRUDERS, STRINGIFY(EXTRUDERS), SS_CENTER); // Extruders: 2
+ #if HAS_LEVELING
+ STATIC_ITEM(
+ TERN_(AUTO_BED_LEVELING_3POINT, MSG_3POINT_LEVELING) // 3-Point Leveling
+ TERN_(AUTO_BED_LEVELING_LINEAR, MSG_LINEAR_LEVELING) // Linear Leveling
+ TERN_(AUTO_BED_LEVELING_BILINEAR, MSG_BILINEAR_LEVELING) // Bi-linear Leveling
+ TERN_(AUTO_BED_LEVELING_UBL, MSG_UBL_LEVELING) // Unified Bed Leveling
+ TERN_(MESH_BED_LEVELING, MSG_MESH_LEVELING) // Mesh Leveling
+ );
+ #endif
+ END_SCREEN();
+ }
+
+#endif
+
+//
+// "About Printer" submenu
+//
+void menu_info() {
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+ #if ENABLED(LCD_PRINTER_INFO_IS_BOOTSCREEN)
+ SUBMENU(MSG_INFO_PRINTER_MENU, TERN(SHOW_CUSTOM_BOOTSCREEN, menu_show_custom_bootscreen, menu_show_marlin_bootscreen));
+ #else
+ SUBMENU(MSG_INFO_PRINTER_MENU, menu_info_printer); // Printer Info >
+ SUBMENU(MSG_INFO_BOARD_MENU, menu_info_board); // Board Info >
+ #if HAS_EXTRUDERS
+ SUBMENU(MSG_INFO_THERMISTOR_MENU, menu_info_thermistors); // Thermistors >
+ #endif
+ #endif
+
+ #if ENABLED(PRINTCOUNTER)
+ SUBMENU(MSG_INFO_STATS_MENU, menu_info_stats); // Printer Stats >
+ #endif
+
+ #if HAS_GAMES
+ {
+ #if ENABLED(GAMES_EASTER_EGG)
+ SKIP_ITEM(); SKIP_ITEM(); SKIP_ITEM();
+ #endif
+
+ // Game sub-menu or the individual game
+ SUBMENU(
+ #if HAS_GAME_MENU
+ MSG_GAMES, menu_game
+ #elif ENABLED(MARLIN_BRICKOUT)
+ MSG_BRICKOUT, brickout.enter_game
+ #elif ENABLED(MARLIN_INVADERS)
+ MSG_INVADERS, invaders.enter_game
+ #elif ENABLED(MARLIN_SNAKE)
+ MSG_SNAKE, snake.enter_game
+ #elif ENABLED(MARLIN_MAZE)
+ MSG_MAZE, maze.enter_game
+ #endif
+ );
+ }
+ #endif
+
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU && LCD_INFO_MENU
diff --git a/src/lcd/menu/menu_item.h b/src/lcd/menu/menu_item.h
new file mode 100644
index 0000000..b0eab65
--- /dev/null
+++ b/src/lcd/menu/menu_item.h
@@ -0,0 +1,574 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "menu.h"
+#include "../marlinui.h"
+#include "../../gcode/queue.h" // for inject
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if ENABLED(LASER_SYNCHRONOUS_M106_M107)
+ #include "../../module/planner.h"
+#endif
+
+////////////////////////////////////////////
+///////////// Base Menu Items //////////////
+////////////////////////////////////////////
+
+// SUBMENU(LABEL, screen_handler)
+class MenuItem_submenu : public MenuItemBase {
+ public:
+ FORCE_INLINE static void draw(const bool sel, const uint8_t row, FSTR_P const fstr, ...) {
+ _draw(sel, row, fstr, '>', LCD_STR_ARROW_RIGHT[0]);
+ }
+ static void action(FSTR_P const, const screenFunc_t func) { ui.push_current_screen(); ui.goto_screen(func); }
+};
+
+// Any menu item that invokes an immediate action
+class MenuItem_button : public MenuItemBase {
+ public:
+ // Button-y Items are selectable lines with no other indicator
+ static void draw(const bool sel, const uint8_t row, FSTR_P const fstr, ...) {
+ _draw(sel, row, fstr, '>', ' ');
+ }
+};
+
+// ACTION_ITEM(LABEL, FUNC)
+class MenuItem_function : public MenuItem_button {
+ public:
+ //static void action(FSTR_P const, const uint8_t, const menuAction_t func) { (*func)(); };
+ static void action(FSTR_P const, const menuAction_t func) { if (func) (*func)(); };
+};
+
+// GCODES_ITEM(LABEL, GCODES)
+class MenuItem_gcode : public MenuItem_button {
+ public:
+ FORCE_INLINE static void draw(const bool sel, const uint8_t row, FSTR_P const fstr, ...) {
+ _draw(sel, row, fstr, '>', ' ');
+ }
+ static void action(FSTR_P const, FSTR_P const fgcode) { queue.inject(fgcode); }
+ static void action(FSTR_P const fstr, const uint8_t, FSTR_P const fgcode) { action(fstr, fgcode); }
+};
+
+////////////////////////////////////////////
+///////////// Edit Menu Items //////////////
+////////////////////////////////////////////
+
+// Template for specific Menu Edit Item Types
+template
+class TMenuEditItem : MenuEditItemBase {
+ private:
+ typedef typename NAME::type_t type_t;
+ static float scale(const_float_t value) { return NAME::scale(value); }
+ static float unscale(const_float_t value) { return NAME::unscale(value); }
+ static const char* to_string(const int32_t value) { return NAME::strfunc(unscale(value)); }
+ static void load(void *ptr, const int32_t value) { *((type_t*)ptr) = unscale(value); }
+ public:
+ FORCE_INLINE static void draw(const bool sel, const uint8_t row, FSTR_P const fstr, type_t * const data, ...) {
+ MenuEditItemBase::draw(sel, row, fstr, NAME::strfunc(*(data)));
+ }
+ FORCE_INLINE static void draw(const bool sel, const uint8_t row, FSTR_P const fstr, type_t (*pget)(), ...) {
+ MenuEditItemBase::draw(sel, row, fstr, NAME::strfunc(pget()));
+ }
+ // Edit screen for this type of item
+ static void edit_screen() { MenuEditItemBase::edit_screen(to_string, load); }
+ static void action(
+ FSTR_P const fstr, // Edit label
+ type_t * const ptr, // Value pointer
+ const type_t minValue, // Value range
+ const type_t maxValue,
+ const screenFunc_t callback=nullptr, // Value update callback
+ const bool live=false // Callback during editing
+ ) {
+ // Make sure minv and maxv fit within int32_t
+ const int32_t minv = _MAX(scale(minValue), INT32_MIN),
+ maxv = _MIN(scale(maxValue), INT32_MAX);
+ goto_edit_screen(fstr, ptr, minv, maxv - minv, scale(*ptr) - minv,
+ edit_screen, callback, live);
+ }
+};
+
+/**
+ * DEFINE_MENU_EDIT_ITEM_TYPE(int3, int16_t, i16tostr3rj, 1)
+ *
+ * Define struct types for use by EDIT_ITEM(...) macros, which encompass
+ * a primitive storage type, a string function, and a scale factor for edit / display.
+ * The EDIT_ITEM macros take care of calling action and draw methods as needed.
+ *
+ * For example, DEFINE_MENU_EDIT_ITEM_TYPE(percent, uint8_t, ui8tostr4pctrj, 100.f/255.f, +0.5f) expands into:
+ *
+ * struct MenuEditItemInfo_percent {
+ * typedef uint8_t type_t;
+ * static float scale(const_float_t value) { return value * (100.f/255.f) +0.5f; }
+ * static float unscale(const_float_t value) { return value / (100.f/255.f) +0.5f; }
+ * static const char* strfunc(const_float_t value) { return ui8tostr4pctrj(_DOFIX(uint8_t,value)); }
+ * };
+ * typedef TMenuEditItem MenuItem_percent
+ */
+#define __DOFIXfloat PROBE()
+#define _DOFIX(TYPE,V) TYPE(TERN(IS_PROBE(__DOFIX##TYPE),FIXFLOAT(V),(V)))
+#define DEFINE_MENU_EDIT_ITEM_TYPE(NAME, TYPE, STRFUNC, SCALE, ETC...) \
+ struct MenuEditItemInfo_##NAME { \
+ typedef TYPE type_t; \
+ static float scale(const_float_t value) { return value * (SCALE) ETC; } \
+ static float unscale(const_float_t value) { return value / (SCALE) ETC; } \
+ static const char* strfunc(const_float_t value) { return STRFUNC(_DOFIX(TYPE,value)); } \
+ }; \
+ typedef TMenuEditItem MenuItem_##NAME
+
+// NAME TYPE STRFUNC SCALE ROUND
+DEFINE_MENU_EDIT_ITEM_TYPE(percent ,uint8_t ,ui8tostr4pctrj , 100.f/255.f, +0.5f); // 100% right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(percent_3 ,uint8_t ,pcttostrpctrj , 1 ); // 100% right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(int3 ,int16_t ,i16tostr3rj , 1 ); // 123, -12 right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(int4 ,int16_t ,i16tostr4signrj , 1 ); // 1234, -123 right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(int8 ,int8_t ,i8tostr3rj , 1 ); // 123, -12 right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(uint8 ,uint8_t ,ui8tostr3rj , 1 ); // 123 right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(uint16_3 ,uint16_t ,ui16tostr3rj , 1 ); // 123 right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(uint16_4 ,uint16_t ,ui16tostr4rj , 0.1f ); // 1234 right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(uint16_5 ,uint16_t ,ui16tostr5rj , 0.01f ); // 12345 right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(float3 ,float ,ftostr3 , 1 ); // 123 right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(float42_52 ,float ,ftostr42_52 , 100 ); // _2.34, 12.34, -2.34 or 123.45, -23.45
+DEFINE_MENU_EDIT_ITEM_TYPE(float43 ,float ,ftostr43sign ,1000 ); // -1.234, _1.234, +1.234
+DEFINE_MENU_EDIT_ITEM_TYPE(float4 ,float ,ftostr4sign , 1 ); // 1234 right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(float5 ,float ,ftostr5rj , 1 ); // 12345 right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(float5_25 ,float ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment)
+DEFINE_MENU_EDIT_ITEM_TYPE(float61 ,float ,ftostr61rj , 10 ); // 12345.6 right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(float31sign ,float ,ftostr31sign , 10 ); // +12.3
+DEFINE_MENU_EDIT_ITEM_TYPE(float41sign ,float ,ftostr41sign , 10 ); // +123.4
+DEFINE_MENU_EDIT_ITEM_TYPE(float51sign ,float ,ftostr51sign , 10 ); // +1234.5
+DEFINE_MENU_EDIT_ITEM_TYPE(float52sign ,float ,ftostr52sign , 100 ); // +123.45
+DEFINE_MENU_EDIT_ITEM_TYPE(long5 ,uint32_t ,ftostr5rj , 0.01f ); // 12345 right-justified
+DEFINE_MENU_EDIT_ITEM_TYPE(long5_25 ,uint32_t ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment)
+
+#if HAS_BED_PROBE
+ #if Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9
+ #define LCD_Z_OFFSET_TYPE float43 // Values from -9.000 to +9.000
+ #else
+ #define LCD_Z_OFFSET_TYPE float42_52 // Values from -99.99 to 99.99
+ #endif
+#endif
+
+class MenuItem_bool : public MenuEditItemBase {
+ public:
+ FORCE_INLINE static void draw(const bool sel, const uint8_t row, FSTR_P const fstr, const bool onoff) {
+ MenuEditItemBase::draw(sel, row, fstr, onoff ? GET_TEXT_F(MSG_LCD_ON) : GET_TEXT_F(MSG_LCD_OFF));
+ }
+ FORCE_INLINE static void draw(const bool sel, const uint8_t row, FSTR_P const fstr, bool * const data, ...) {
+ draw(sel, row, fstr, *data);
+ }
+ FORCE_INLINE static void draw(const bool sel, const uint8_t row, FSTR_P const fstr, FSTR_P const, bool (*pget)(), ...) {
+ draw(sel, row, fstr, pget());
+ }
+ static void action(FSTR_P const fstr, bool * const ptr, const screenFunc_t callbackFunc=nullptr) {
+ *ptr ^= true; ui.refresh();
+ if (callbackFunc) (*callbackFunc)();
+ }
+};
+
+/**
+ * ////////////////////////////////////////////
+ * //////////// Menu System Macros ////////////
+ * ////////////////////////////////////////////
+ *
+ * Marlin's native menu screens work by running a loop from the top visible line index
+ * to the bottom visible line index (according to how much the screen has been scrolled).
+ * This complete loop is done on every menu screen call.
+ *
+ * The menu system is highly dynamic, so it doesn't know ahead of any menu loop which
+ * items will be visible or hidden, so menu items don't have a fixed index number.
+ *
+ * During the loop, each menu item checks to see if its line is the current one. If it is,
+ * then it checks to see if a click has arrived so it can run its action. If the action
+ * doesn't redirect to another screen then the menu item calls its draw method.
+ *
+ * Menu item add-ons can do whatever they like.
+ *
+ * This mixture of drawing and processing inside a loop has the advantage that a single
+ * line can be used to represent a menu item, and that is the rationale for this design.
+ *
+ * One of the pitfalls of this method is that DOGM displays call the screen handler 2x,
+ * 4x, or 8x per screen update to draw just one segment of the screen. As a result, any
+ * menu item that exists in two screen segments is drawn and processed twice per screen
+ * update. With each item processed 5, 10, 20, or 40 times the logic has to be simple.
+ *
+ * To avoid repetition and side-effects, function calls for testing menu item conditions
+ * should be done before the menu loop (START_MENU / START_SCREEN).
+ */
+
+/**
+ * SCREEN_OR_MENU_LOOP generates header code for a screen or menu
+ *
+ * encoderTopLine is the top menu line to display
+ * _lcdLineNr is the index of the LCD line (e.g., 0-3)
+ * _menuLineNr is the menu item to draw and process
+ * _thisItemNr is the index of each MENU_ITEM or STATIC_ITEM
+ */
+#define SCREEN_OR_MENU_LOOP(IS_MENU) \
+ scroll_screen(IS_MENU ? 1 : LCD_HEIGHT, IS_MENU); \
+ int8_t _menuLineNr = encoderTopLine, _thisItemNr = 0; \
+ bool _skipStatic = IS_MENU; UNUSED(_thisItemNr); \
+ for (int8_t _lcdLineNr = 0; _lcdLineNr < LCD_HEIGHT; _lcdLineNr++, _menuLineNr++) { \
+ _thisItemNr = 0
+
+/**
+ * START_SCREEN Opening code for a screen having only static items.
+ * Do simplified scrolling of the entire screen.
+ *
+ * START_MENU Opening code for a screen with menu items.
+ * Scroll as-needed to keep the selected line in view.
+ */
+#define START_SCREEN() SCREEN_OR_MENU_LOOP(false)
+#define START_MENU() SCREEN_OR_MENU_LOOP(true)
+#define NEXT_ITEM() (++_thisItemNr)
+#define SKIP_ITEM() NEXT_ITEM()
+#define END_SCREEN() } screen_items = _thisItemNr
+#define END_MENU() END_SCREEN(); UNUSED(_skipStatic)
+
+/**
+ * MENU_ITEM generates draw & handler code for a menu item, potentially calling:
+ *
+ * MenuItem_::draw(sel, row, label, arg3...)
+ * MenuItem_::action(arg3...)
+ *
+ * Examples:
+ * BACK_ITEM(MSG_INFO_SCREEN)
+ * MenuItem_back::action(flabel, ...)
+ * MenuItem_back::draw(sel, row, flabel, ...)
+ *
+ * ACTION_ITEM(MSG_PAUSE_PRINT, lcd_sdcard_pause)
+ * MenuItem_function::action(flabel, lcd_sdcard_pause)
+ * MenuItem_function::draw(sel, row, flabel, lcd_sdcard_pause)
+ *
+ * EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999)
+ * MenuItem_int3::action(flabel, &feedrate_percentage, 10, 999)
+ * MenuItem_int3::draw(sel, row, flabel, &feedrate_percentage, 10, 999)
+ */
+
+#if ENABLED(ENCODER_RATE_MULTIPLIER)
+ #define _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER) do{ if (USE_MULTIPLIER) ui.enable_encoder_multiplier(true); }while(0)
+#else
+ #define _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER)
+#endif
+
+#define _MENU_INNER_F(TYPE, USE_MULTIPLIER, FLABEL, V...) do { \
+ FSTR_P const flabel = FLABEL; \
+ if (encoderLine == _thisItemNr && ui.use_click()) { \
+ _MENU_ITEM_MULTIPLIER_CHECK(USE_MULTIPLIER); \
+ MenuItem_##TYPE::action(flabel, ##V); \
+ if (ui.screen_changed) return; \
+ } \
+ if (ui.should_draw()) \
+ MenuItem_##TYPE::draw \
+ (encoderLine == _thisItemNr, _lcdLineNr, flabel, ##V); \
+}while(0)
+
+// Item with optional data
+#define _MENU_ITEM_F(TYPE, V...) do { \
+ if (_menuLineNr == _thisItemNr) { \
+ _skipStatic = false; \
+ _MENU_INNER_F(TYPE, ##V); \
+ } \
+ NEXT_ITEM(); \
+}while(0)
+
+// Item with index value, C-string, and optional data
+#define _MENU_ITEM_N_S_F(TYPE, N, S, V...) do{ \
+ if (_menuLineNr == _thisItemNr) { \
+ _skipStatic = false; \
+ MenuItemBase::init(N, S); \
+ _MENU_INNER_F(TYPE, ##V); \
+ } \
+ NEXT_ITEM(); \
+}while(0)
+
+// Item with index value and F-string
+#define _MENU_ITEM_N_f_F(TYPE, N, f, V...) do{ \
+ if (_menuLineNr == _thisItemNr) { \
+ _skipStatic = false; \
+ MenuItemBase::init(N, f); \
+ _MENU_INNER_F(TYPE, ##V); \
+ } \
+ NEXT_ITEM(); \
+}while(0)
+
+// Item with index value
+#define _MENU_ITEM_N_F(TYPE, N, V...) do{ \
+ if (_menuLineNr == _thisItemNr) { \
+ _skipStatic = false; \
+ MenuItemBase::init(N); \
+ _MENU_INNER_F(TYPE, ##V); \
+ } \
+ NEXT_ITEM(); \
+}while(0)
+
+// Items with a unique string
+#define _MENU_ITEM_S_F(TYPE, S, V...) do{ \
+ if (_menuLineNr == _thisItemNr) { \
+ _skipStatic = false; \
+ MenuItemBase::init(0, S); \
+ _MENU_INNER_F(TYPE, ##V); \
+ } \
+ NEXT_ITEM(); \
+}while(0)
+
+// Items with a unique F-string
+#define _MENU_ITEM_f_F(TYPE, f, V...) do{ \
+ if (_menuLineNr == _thisItemNr) { \
+ _skipStatic = false; \
+ MenuItemBase::init(0, f); \
+ _MENU_INNER_F(TYPE, ##V); \
+ } \
+ NEXT_ITEM(); \
+}while(0)
+
+// STATIC_ITEM draws a styled string with no highlight.
+// Parameters: label [, style [, char *value] ]
+
+#define STATIC_ITEM_INNER_F(FLABEL, V...) do{ \
+ if (_skipStatic && encoderLine <= _thisItemNr) { \
+ ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \
+ ++encoderLine; \
+ } \
+ if (ui.should_draw()) \
+ MenuItem_static::draw(_lcdLineNr, FLABEL, ##V); \
+} while(0)
+
+#define STATIC_ITEM_F(FLABEL, V...) do{ \
+ if (_menuLineNr == _thisItemNr) \
+ STATIC_ITEM_INNER_F(FLABEL, ##V); \
+ NEXT_ITEM(); \
+} while(0)
+
+#define STATIC_ITEM_N_F(N, FLABEL, V...) do{ \
+ if (_menuLineNr == _thisItemNr) { \
+ MenuItemBase::init(N); \
+ STATIC_ITEM_INNER_F(FLABEL, ##V); \
+ } \
+ NEXT_ITEM(); \
+}while(0)
+
+// PSTRING_ITEM is like STATIC_ITEM but it takes
+// two PSTRs with the style as the last parameter.
+
+#define PSTRING_ITEM_F(FLABEL, PVAL, STYL) do{ \
+ constexpr int m = 20; \
+ char msg[m+1]; \
+ msg[0] = ':'; msg[1] = ' '; \
+ strncpy_P(msg+2, PSTR(PVAL), m-2); \
+ if (msg[m-1] & 0x80) msg[m-1] = '\0'; \
+ STATIC_ITEM_F(FLABEL, STYL, msg); \
+}while(0)
+
+#define PSTRING_ITEM(LABEL, V...) PSTRING_ITEM_F(GET_TEXT_F(LABEL), ##V)
+
+#define STATIC_ITEM(LABEL, V...) STATIC_ITEM_F(GET_TEXT_F(LABEL), ##V)
+#define STATIC_ITEM_N(N, LABEL, V...) STATIC_ITEM_N_F(N, GET_TEXT_F(LABEL), ##V)
+
+// Menu item with index and composed C-string substitution
+#define MENU_ITEM_N_S_F(TYPE, N, S, FLABEL, V...) _MENU_ITEM_N_S_F(TYPE, N, S, false, FLABEL, ##V)
+#define MENU_ITEM_N_S(TYPE, N, S, LABEL, V...) MENU_ITEM_N_S_F(TYPE, N, S, GET_TEXT_F(LABEL), ##V)
+
+// Menu item with composed C-string substitution
+#define MENU_ITEM_S_F(TYPE, S, FLABEL, V...) _MENU_ITEM_S_F(TYPE, S, false, FLABEL, ##V)
+#define MENU_ITEM_S(TYPE, S, LABEL, V...) MENU_ITEM_S_F(TYPE, S, GET_TEXT_F(LABEL), ##V)
+
+// Menu item substitution, indexed
+#define MENU_ITEM_N_F(TYPE, N, FLABEL, V...) _MENU_ITEM_N_F(TYPE, N, false, FLABEL, ##V)
+#define MENU_ITEM_N(TYPE, N, LABEL, V...) MENU_ITEM_N_F(TYPE, N, GET_TEXT_F(LABEL), ##V)
+
+// Basic menu items, no substitution
+#define MENU_ITEM_F(TYPE, FLABEL, V...) _MENU_ITEM_F(TYPE, false, FLABEL, ##V)
+#define MENU_ITEM(TYPE, LABEL, V...) MENU_ITEM_F(TYPE, GET_TEXT_F(LABEL), ##V)
+
+// Predefined menu item types //
+
+#define BACK_ITEM_F(FLABEL) MENU_ITEM_F(back, FLABEL)
+#define BACK_ITEM(LABEL) MENU_ITEM(back, LABEL)
+
+#define ACTION_ITEM_N_S_F(N, S, FLABEL, ACTION) MENU_ITEM_N_S_F(function, N, S, FLABEL, ACTION)
+#define ACTION_ITEM_N_S(N, S, LABEL, ACTION) ACTION_ITEM_N_S_F(N, S, GET_TEXT_F(LABEL), ACTION)
+#define ACTION_ITEM_S_F(S, FLABEL, ACTION) MENU_ITEM_S_F(function, S, FLABEL, ACTION)
+#define ACTION_ITEM_S(S, LABEL, ACTION) ACTION_ITEM_S_F(S, GET_TEXT_F(LABEL), ACTION)
+#define ACTION_ITEM_N_F(N, FLABEL, ACTION) MENU_ITEM_N_F(function, N, FLABEL, ACTION)
+#define ACTION_ITEM_N(N, LABEL, ACTION) ACTION_ITEM_N_F(N, GET_TEXT_F(LABEL), ACTION)
+#define ACTION_ITEM_F(FLABEL, ACTION) MENU_ITEM_F(function, FLABEL, ACTION)
+#define ACTION_ITEM(LABEL, ACTION) ACTION_ITEM_F(GET_TEXT_F(LABEL), ACTION)
+
+#define GCODES_ITEM_N_S_F(N, S, FLABEL, GCODES) MENU_ITEM_N_S_F(gcode, N, S, FLABEL, GCODES)
+#define GCODES_ITEM_N_S(N, S, LABEL, GCODES) GCODES_ITEM_N_S_F(N, S, GET_TEXT_F(LABEL), GCODES)
+#define GCODES_ITEM_S_F(S, FLABEL, GCODES) MENU_ITEM_S_F(gcode, S, FLABEL, GCODES)
+#define GCODES_ITEM_S(S, LABEL, GCODES) GCODES_ITEM_S_F(S, GET_TEXT_F(LABEL), GCODES)
+#define GCODES_ITEM_N_F(N, FLABEL, GCODES) MENU_ITEM_N_F(gcode, N, FLABEL, GCODES)
+#define GCODES_ITEM_N(N, LABEL, GCODES) GCODES_ITEM_N_F(N, GET_TEXT_F(LABEL), GCODES)
+#define GCODES_ITEM_F(FLABEL, GCODES) MENU_ITEM_F(gcode, FLABEL, GCODES)
+#define GCODES_ITEM(LABEL, GCODES) GCODES_ITEM_F(GET_TEXT_F(LABEL), GCODES)
+
+#define SUBMENU_N_S_F(N, S, FLABEL, DEST) MENU_ITEM_N_S_F(submenu, N, S, FLABEL, DEST)
+#define SUBMENU_N_S(N, S, LABEL, DEST) SUBMENU_N_S_F(N, S, GET_TEXT_F(LABEL), DEST)
+#define SUBMENU_S_F(S, FLABEL, DEST) MENU_ITEM_S_F(submenu, S, FLABEL, DEST)
+#define SUBMENU_S(S, LABEL, DEST) SUBMENU_S_F(S, GET_TEXT_F(LABEL), DEST)
+#define SUBMENU_N_F(N, FLABEL, DEST) MENU_ITEM_N_F(submenu, N, FLABEL, DEST)
+#define SUBMENU_N(N, LABEL, DEST) SUBMENU_N_F(N, GET_TEXT_F(LABEL), DEST)
+#define SUBMENU_F(FLABEL, DEST) MENU_ITEM_F(submenu, FLABEL, DEST)
+#define SUBMENU(LABEL, DEST) SUBMENU_F(GET_TEXT_F(LABEL), DEST)
+
+#define EDIT_ITEM_N_S_F(TYPE, N, S, FLABEL, V...) MENU_ITEM_N_S_F(TYPE, N, S, FLABEL, ##V)
+#define EDIT_ITEM_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_N_S_F(TYPE, N, S, GET_TEXT_F(LABEL), ##V)
+#define EDIT_ITEM_S_F(TYPE, S, FLABEL, V...) MENU_ITEM_S_F(TYPE, S, FLABEL, ##V)
+#define EDIT_ITEM_S(TYPE, S, LABEL, V...) EDIT_ITEM_S_F(TYPE, S, GET_TEXT_F(LABEL), ##V)
+#define EDIT_ITEM_N_F(TYPE, N, FLABEL, V...) MENU_ITEM_N_F(TYPE, N, FLABEL, ##V)
+#define EDIT_ITEM_N(TYPE, N, LABEL, V...) EDIT_ITEM_N_F(TYPE, N, GET_TEXT_F(LABEL), ##V)
+#define EDIT_ITEM_F(TYPE, FLABEL, V...) MENU_ITEM_F(TYPE, FLABEL, ##V)
+#define EDIT_ITEM(TYPE, LABEL, V...) EDIT_ITEM_F(TYPE, GET_TEXT_F(LABEL), ##V)
+
+#define EDIT_ITEM_FAST_N_S_F(TYPE, N, S, FLABEL, V...) _MENU_ITEM_N_S_F(TYPE, N, S, true, FLABEL, ##V)
+#define EDIT_ITEM_FAST_N_S(TYPE, N, S, LABEL, V...) EDIT_ITEM_FAST_N_S_F(TYPE, N, S, true, GET_TEXT_F(LABEL), ##V)
+#define EDIT_ITEM_FAST_S_F(TYPE, S, FLABEL, V...) _MENU_ITEM_S_F(TYPE, S, true, FLABEL, ##V)
+#define EDIT_ITEM_FAST_S(TYPE, S, LABEL, V...) EDIT_ITEM_FAST_S_F(TYPE, S, GET_TEXT_F(LABEL), ##V)
+#define EDIT_ITEM_FAST_N_F(TYPE, N, FLABEL, V...) _MENU_ITEM_N_F(TYPE, N, true, FLABEL, ##V)
+#define EDIT_ITEM_FAST_N(TYPE, N, LABEL, V...) EDIT_ITEM_FAST_N_F(TYPE, N, GET_TEXT_F(LABEL), ##V)
+#define EDIT_ITEM_FAST_F(TYPE, FLABEL, V...) _MENU_ITEM_F(TYPE, true, FLABEL, ##V)
+#define EDIT_ITEM_FAST(TYPE, LABEL, V...) EDIT_ITEM_FAST_F(TYPE, GET_TEXT_F(LABEL), ##V)
+
+// F-string substitution instead of C-string //
+
+#define MENU_ITEM_N_f_F(TYPE, N, f, FLABEL, V...) _MENU_ITEM_N_f_F(TYPE, N, f, false, FLABEL, ##V)
+#define MENU_ITEM_N_f(TYPE, N, f, LABEL, V...) MENU_ITEM_N_f_F(TYPE, N, f, GET_TEXT_F(LABEL), ##V)
+#define MENU_ITEM_f_F(TYPE, f, FLABEL, V...) _MENU_ITEM_f_F(TYPE, f, false, FLABEL, ##V)
+#define MENU_ITEM_f(TYPE, f, LABEL, V...) MENU_ITEM_f_F(TYPE, f, GET_TEXT_F(LABEL), ##V)
+
+#define ACTION_ITEM_N_f_F(N, f, FLABEL, ACTION) MENU_ITEM_N_f_F(function, N, f, FLABEL, ACTION)
+#define ACTION_ITEM_N_f(N, f, LABEL, ACTION) ACTION_ITEM_N_f_F(N, f, GET_TEXT_F(LABEL), ACTION)
+#define ACTION_ITEM_f_F(f, FLABEL, ACTION) MENU_ITEM_f_F(function, f, FLABEL, ACTION)
+#define ACTION_ITEM_f(f, LABEL, ACTION) ACTION_ITEM_f_F(f, GET_TEXT_F(LABEL), ACTION)
+
+#define GCODES_ITEM_N_f_F(N, f, FLABEL, GCODES) MENU_ITEM_N_f_F(gcode, N, f, FLABEL, GCODES)
+#define GCODES_ITEM_N_f(N, f, LABEL, GCODES) GCODES_ITEM_N_f_F(N, f, GET_TEXT_F(LABEL), GCODES)
+#define GCODES_ITEM_f_F(f, FLABEL, GCODES) MENU_ITEM_f_F(gcode, f, FLABEL, GCODES)
+#define GCODES_ITEM_f(f, LABEL, GCODES) GCODES_ITEM_f_F(f, GET_TEXT_F(LABEL), GCODES)
+
+#define SUBMENU_N_f_F(N, f, FLABEL, DEST) MENU_ITEM_N_f_F(submenu, N, f, FLABEL, DEST)
+#define SUBMENU_N_f(N, f, LABEL, DEST) SUBMENU_N_f_F(N, f, GET_TEXT_F(LABEL), DEST)
+#define SUBMENU_f_F(f, FLABEL, DEST) MENU_ITEM_f_F(submenu, f, FLABEL, DEST)
+#define SUBMENU_f(f, LABEL, DEST) SUBMENU_f_F(f, GET_TEXT_F(LABEL), DEST)
+
+#define EDIT_ITEM_N_f_F(TYPE, N, f, FLABEL, V...) MENU_ITEM_N_f_F(TYPE, N, f, FLABEL, ##V)
+#define EDIT_ITEM_N_f(TYPE, N, f, LABEL, V...) EDIT_ITEM_N_f_F(TYPE, N, f, GET_TEXT_F(LABEL), ##V)
+#define EDIT_ITEM_f_F(TYPE, f, FLABEL, V...) MENU_ITEM_f_F(TYPE, f, FLABEL, ##V)
+#define EDIT_ITEM_f(TYPE, f, LABEL, V...) EDIT_ITEM_f_F(TYPE, f, GET_TEXT_F(LABEL), ##V)
+
+#define EDIT_ITEM_FAST_N_f_F(TYPE, N, f, FLABEL, V...) _MENU_ITEM_N_f_F(TYPE, N, f, true, FLABEL, ##V)
+#define EDIT_ITEM_FAST_N_f(TYPE, N, f, LABEL, V...) EDIT_ITEM_FAST_N_f_F(TYPE, N, f, true, GET_TEXT_F(LABEL), ##V)
+#define EDIT_ITEM_FAST_f_F(TYPE, f, FLABEL, V...) _MENU_ITEM_f_F(TYPE, f, true, FLABEL, ##V)
+#define EDIT_ITEM_FAST_f(TYPE, f, LABEL, V...) EDIT_ITEM_FAST_f_F(TYPE, f, GET_TEXT_F(LABEL), ##V)
+
+#define _CONFIRM_ITEM_INNER_F(FLABEL, V...) do { \
+ if (encoderLine == _thisItemNr && ui.use_click()) { \
+ ui.push_current_screen(); \
+ ui.goto_screen([]{MenuItem_confirm::select_screen(V);}); \
+ return; \
+ } \
+ if (ui.should_draw()) MenuItem_confirm::draw \
+ (encoderLine == _thisItemNr, _lcdLineNr, FLABEL, ##V); \
+}while(0)
+
+// Indexed items set a global index value and optional data
+#define _CONFIRM_ITEM_F(FLABEL, V...) do { \
+ if (_menuLineNr == _thisItemNr) { \
+ _skipStatic = false; \
+ _CONFIRM_ITEM_INNER_F(FLABEL, ##V); \
+ } \
+ NEXT_ITEM(); \
+}while(0)
+
+// Indexed items set a global index value
+#define _CONFIRM_ITEM_N_S_F(N, S, V...) do{ \
+ if (_menuLineNr == _thisItemNr) { \
+ _skipStatic = false; \
+ MenuItemBase::init(N, S); \
+ _CONFIRM_ITEM_INNER_F(TYPE, ##V); \
+ } \
+ NEXT_ITEM(); \
+}while(0)
+
+// Indexed items set a global index value
+#define _CONFIRM_ITEM_N_F(N, V...) _CONFIRM_ITEM_N_S_F(N, nullptr, V)
+
+#define CONFIRM_ITEM_F(FLABEL,A,B,V...) _CONFIRM_ITEM_F(FLABEL, GET_TEXT_F(A), GET_TEXT_F(B), ##V)
+#define CONFIRM_ITEM(LABEL, V...) CONFIRM_ITEM_F(GET_TEXT_F(LABEL), ##V)
+
+#define YESNO_ITEM_F(FLABEL, V...) CONFIRM_ITEM_F(FLABEL, MSG_YES, MSG_NO, ##V)
+#define YESNO_ITEM(LABEL, V...) YESNO_ITEM_F(GET_TEXT_F(LABEL), ##V)
+
+#define CONFIRM_ITEM_N_S_F(N,S,FLABEL,A,B,V...) _CONFIRM_ITEM_N_S_F(N, S, FLABEL, GET_TEXT_F(A), GET_TEXT_F(B), ##V)
+#define CONFIRM_ITEM_N_S(N,S,LABEL,V...) CONFIRM_ITEM_N_S_F(N, S, GET_TEXT_F(LABEL), ##V)
+#define CONFIRM_ITEM_N_F(N,FLABEL,A,B,V...) _CONFIRM_ITEM_N_F(N, FLABEL, GET_TEXT_F(A), GET_TEXT_F(B), ##V)
+#define CONFIRM_ITEM_N(N,LABEL, V...) CONFIRM_ITEM_N_F(N, GET_TEXT_F(LABEL), ##V)
+
+#define YESNO_ITEM_N_S_F(N,S,FLABEL, V...) _CONFIRM_ITEM_N_S_F(N, S, FLABEL, MSG_YES, MSG_NO, ##V)
+#define YESNO_ITEM_N_S(N,S,LABEL, V...) YESNO_ITEM_N_S_F(N, S, GET_TEXT_F(LABEL), ##V)
+#define YESNO_ITEM_N_F(N,FLABEL, V...) CONFIRM_ITEM_N_F(N, FLABEL, MSG_YES, MSG_NO, ##V)
+#define YESNO_ITEM_N(N,LABEL, V...) YESNO_ITEM_N_F(N, GET_TEXT_F(LABEL), ##V)
+
+#if ENABLED(LCD_BED_TRAMMING)
+ void _lcd_level_bed_corners();
+#endif
+
+#if HAS_FAN
+
+ #include "../../module/temperature.h"
+
+ inline void on_fan_update() {
+ thermalManager.set_fan_speed(MenuItemBase::itemIndex, editable.uint8);
+ TERN_(LASER_SYNCHRONOUS_M106_M107, planner.buffer_sync_block(BLOCK_BIT_SYNC_FANS));
+ }
+
+ #if ENABLED(EXTRA_FAN_SPEED)
+ #define EDIT_EXTRA_FAN_SPEED(V...) EDIT_ITEM_FAST_N(V)
+ #else
+ #define EDIT_EXTRA_FAN_SPEED(...)
+ #endif
+
+ #define _FAN_EDIT_ITEMS(F,L) do{ \
+ editable.uint8 = thermalManager.fan_speed[F]; \
+ EDIT_ITEM_FAST_N(percent, F, MSG_##L, &editable.uint8, 0, 255, on_fan_update); \
+ EDIT_EXTRA_FAN_SPEED(percent, F, MSG_EXTRA_##L, &thermalManager.extra_fan_speed[F].speed, 3, 255); \
+ }while(0)
+
+ #if FAN_COUNT > 1
+ #define FAN_EDIT_ITEMS(F) _FAN_EDIT_ITEMS(F,FAN_SPEED_N)
+ #endif
+
+ #define SNFAN(N) (ENABLED(SINGLENOZZLE_STANDBY_FAN) && !HAS_FAN##N && EXTRUDERS > N)
+
+ #if SNFAN(1) || SNFAN(2) || SNFAN(3) || SNFAN(4) || SNFAN(5) || SNFAN(6) || SNFAN(7)
+ #define DEFINE_SINGLENOZZLE_ITEM() \
+ auto singlenozzle_item = [&](const uint8_t f) { \
+ editable.uint8 = thermalManager.singlenozzle_fan_speed[f]; \
+ EDIT_ITEM_FAST_N(percent, f, MSG_STORED_FAN_N, &editable.uint8, 0, 255, on_fan_update); \
+ }
+ #else
+ #define DEFINE_SINGLENOZZLE_ITEM() NOOP
+ #endif
+
+#endif // HAS_FAN
diff --git a/src/lcd/menu/menu_job_recovery.cpp b/src/lcd/menu/menu_job_recovery.cpp
new file mode 100644
index 0000000..6329c58
--- /dev/null
+++ b/src/lcd/menu/menu_job_recovery.cpp
@@ -0,0 +1,57 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Job Recovery Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if BOTH(HAS_MARLINUI_MENU, POWER_LOSS_RECOVERY)
+
+#include "menu_item.h"
+#include "../../gcode/queue.h"
+#include "../../sd/cardreader.h"
+#include "../../feature/powerloss.h"
+
+static void lcd_power_loss_recovery_resume() {
+ ui.return_to_status();
+ queue.inject(F("M1000"));
+}
+
+void lcd_power_loss_recovery_cancel() {
+ recovery.cancel();
+ ui.return_to_status();
+}
+
+// TODO: Display long filename with Cancel/Resume buttons
+// Requires supporting methods in PLR class.
+void menu_job_recovery() {
+ ui.defer_status_screen();
+ START_MENU();
+ STATIC_ITEM(MSG_OUTAGE_RECOVERY);
+ ACTION_ITEM(MSG_RESUME_PRINT, lcd_power_loss_recovery_resume);
+ ACTION_ITEM(MSG_STOP_PRINT, lcd_power_loss_recovery_cancel);
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU && POWER_LOSS_RECOVERY
diff --git a/src/lcd/menu/menu_language.cpp b/src/lcd/menu/menu_language.cpp
new file mode 100644
index 0000000..2ea4359
--- /dev/null
+++ b/src/lcd/menu/menu_language.cpp
@@ -0,0 +1,59 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Language Selection Menu
+//
+
+#include "../../inc/MarlinConfig.h"
+
+#if HAS_MULTI_LANGUAGE
+
+#include "menu_item.h"
+#include "../../MarlinCore.h"
+#include "../../module/settings.h"
+
+static void set_lcd_language(const uint8_t inlang) {
+ ui.set_language(inlang);
+ TERN_(LCD_LANGUAGE_AUTO_SAVE, (void)settings.save());
+}
+
+void menu_language() {
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ MENU_ITEM_F(function, FPSTR(GET_LANGUAGE_NAME(1)), []{ set_lcd_language(0); });
+ MENU_ITEM_F(function, FPSTR(GET_LANGUAGE_NAME(2)), []{ set_lcd_language(1); });
+ #if NUM_LANGUAGES > 2
+ MENU_ITEM_F(function, FPSTR(GET_LANGUAGE_NAME(3)), []{ set_lcd_language(2); });
+ #if NUM_LANGUAGES > 3
+ MENU_ITEM_F(function, FPSTR(GET_LANGUAGE_NAME(4)), []{ set_lcd_language(3); });
+ #if NUM_LANGUAGES > 4
+ MENU_ITEM_F(function, FPSTR(GET_LANGUAGE_NAME(5)), []{ set_lcd_language(4); });
+ #endif
+ #endif
+ #endif
+
+ END_MENU();
+}
+
+#endif // HAS_MULTI_LANGUAGE
diff --git a/src/lcd/menu/menu_led.cpp b/src/lcd/menu/menu_led.cpp
new file mode 100644
index 0000000..867e4da
--- /dev/null
+++ b/src/lcd/menu/menu_led.cpp
@@ -0,0 +1,172 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// LED Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if HAS_MARLINUI_MENU && EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU)
+
+#include "menu_item.h"
+
+#if ENABLED(PSU_CONTROL)
+ #include "../../feature/power.h"
+#endif
+
+#if ENABLED(LED_CONTROL_MENU)
+ #include "../../feature/leds/leds.h"
+
+ #if ENABLED(LED_COLOR_PRESETS)
+
+ void menu_led_presets() {
+ START_MENU();
+ #if LCD_HEIGHT > 2
+ STATIC_ITEM(MSG_LED_PRESETS, SS_DEFAULT|SS_INVERT);
+ #endif
+ BACK_ITEM(MSG_LED_CONTROL);
+ ACTION_ITEM(MSG_SET_LEDS_WHITE, leds.set_white);
+ ACTION_ITEM(MSG_SET_LEDS_RED, leds.set_red);
+ ACTION_ITEM(MSG_SET_LEDS_ORANGE, leds.set_orange);
+ ACTION_ITEM(MSG_SET_LEDS_YELLOW, leds.set_yellow);
+ ACTION_ITEM(MSG_SET_LEDS_GREEN, leds.set_green);
+ ACTION_ITEM(MSG_SET_LEDS_BLUE, leds.set_blue);
+ ACTION_ITEM(MSG_SET_LEDS_INDIGO, leds.set_indigo);
+ ACTION_ITEM(MSG_SET_LEDS_VIOLET, leds.set_violet);
+ END_MENU();
+ }
+
+ #endif
+
+ #if ENABLED(NEO2_COLOR_PRESETS)
+
+ void menu_leds2_presets() {
+ START_MENU();
+ #if LCD_HEIGHT > 2
+ STATIC_ITEM(MSG_NEO2_PRESETS, SS_DEFAULT|SS_INVERT);
+ #endif
+ BACK_ITEM(MSG_LED_CONTROL);
+ ACTION_ITEM(MSG_SET_LEDS_WHITE, leds2.set_white);
+ ACTION_ITEM(MSG_SET_LEDS_RED, leds2.set_red);
+ ACTION_ITEM(MSG_SET_LEDS_ORANGE, leds2.set_orange);
+ ACTION_ITEM(MSG_SET_LEDS_YELLOW, leds2.set_yellow);
+ ACTION_ITEM(MSG_SET_LEDS_GREEN, leds2.set_green);
+ ACTION_ITEM(MSG_SET_LEDS_BLUE, leds2.set_blue);
+ ACTION_ITEM(MSG_SET_LEDS_INDIGO, leds2.set_indigo);
+ ACTION_ITEM(MSG_SET_LEDS_VIOLET, leds2.set_violet);
+ END_MENU();
+ }
+
+ #endif
+
+ void menu_led_custom() {
+ START_MENU();
+ BACK_ITEM(MSG_LED_CONTROL);
+ #if ENABLED(NEOPIXEL2_SEPARATE)
+ STATIC_ITEM_N(1, MSG_LED_CHANNEL_N, SS_DEFAULT|SS_INVERT);
+ #endif
+ EDIT_ITEM(uint8, MSG_INTENSITY_R, &leds.color.r, 0, 255, leds.update, true);
+ EDIT_ITEM(uint8, MSG_INTENSITY_G, &leds.color.g, 0, 255, leds.update, true);
+ EDIT_ITEM(uint8, MSG_INTENSITY_B, &leds.color.b, 0, 255, leds.update, true);
+ #if HAS_WHITE_LED
+ EDIT_ITEM(uint8, MSG_INTENSITY_W, &leds.color.w, 0, 255, leds.update, true);
+ #endif
+ #if ENABLED(NEOPIXEL_LED)
+ EDIT_ITEM(uint8, MSG_LED_BRIGHTNESS, &leds.color.i, 0, 255, leds.update, true);
+ #endif
+ #if ENABLED(NEOPIXEL2_SEPARATE)
+ STATIC_ITEM_N(2, MSG_LED_CHANNEL_N, SS_DEFAULT|SS_INVERT);
+ EDIT_ITEM(uint8, MSG_INTENSITY_R, &leds2.color.r, 0, 255, leds2.update, true);
+ EDIT_ITEM(uint8, MSG_INTENSITY_G, &leds2.color.g, 0, 255, leds2.update, true);
+ EDIT_ITEM(uint8, MSG_INTENSITY_B, &leds2.color.b, 0, 255, leds2.update, true);
+ #if HAS_WHITE_LED2
+ EDIT_ITEM(uint8, MSG_INTENSITY_W, &leds2.color.w, 0, 255, leds2.update, true);
+ #endif
+ EDIT_ITEM(uint8, MSG_NEO2_BRIGHTNESS, &leds2.color.i, 0, 255, leds2.update, true);
+ #endif
+ END_MENU();
+ }
+#endif
+
+#if ENABLED(CASE_LIGHT_MENU)
+ #include "../../feature/caselight.h"
+
+ #define CASELIGHT_TOGGLE_ITEM() EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled)
+
+ #if CASELIGHT_USES_BRIGHTNESS
+ void menu_case_light() {
+ START_MENU();
+ BACK_ITEM(MSG_CONFIGURATION);
+ EDIT_ITEM(percent, MSG_CASE_LIGHT_BRIGHTNESS, &caselight.brightness, 0, 255, caselight.update_brightness, true);
+ CASELIGHT_TOGGLE_ITEM();
+ END_MENU();
+ }
+ #endif
+#endif
+
+void menu_led() {
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ #if ENABLED(LED_CONTROL_MENU)
+ if (TERN1(PSU_CONTROL, powerManager.psu_on)) {
+ editable.state = leds.lights_on;
+ EDIT_ITEM(bool, MSG_LEDS, &editable.state, leds.toggle);
+ }
+
+ #if ENABLED(LED_COLOR_PRESETS)
+ ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds.set_default);
+ #endif
+
+ #if ENABLED(NEOPIXEL2_SEPARATE)
+ editable.state = leds2.lights_on;
+ EDIT_ITEM(bool, MSG_LEDS2, &editable.state, leds2.toggle);
+ #if ENABLED(NEO2_COLOR_PRESETS)
+ ACTION_ITEM(MSG_SET_LEDS_DEFAULT, leds2.set_default);
+ #endif
+ #endif
+ #if ENABLED(LED_COLOR_PRESETS)
+ SUBMENU(MSG_LED_PRESETS, menu_led_presets);
+ #endif
+ #if ENABLED(NEO2_COLOR_PRESETS)
+ SUBMENU(MSG_NEO2_PRESETS, menu_leds2_presets);
+ #endif
+ SUBMENU(MSG_CUSTOM_LEDS, menu_led_custom);
+ #endif
+
+ //
+ // Set Case light on/off/brightness
+ //
+ #if ENABLED(CASE_LIGHT_MENU)
+ #if CASELIGHT_USES_BRIGHTNESS
+ if (caselight.has_brightness())
+ SUBMENU(MSG_CASE_LIGHT, menu_case_light);
+ else
+ #endif
+ CASELIGHT_TOGGLE_ITEM();
+ #endif
+
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU && LED_CONTROL_MENU
diff --git a/src/lcd/menu/menu_main.cpp b/src/lcd/menu/menu_main.cpp
new file mode 100644
index 0000000..518f1e0
--- /dev/null
+++ b/src/lcd/menu/menu_main.cpp
@@ -0,0 +1,464 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Main Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if HAS_MARLINUI_MENU
+
+#include "menu_item.h"
+#include "../../module/temperature.h"
+#include "../../gcode/queue.h"
+#include "../../module/printcounter.h"
+#include "../../module/stepper.h"
+#include "../../sd/cardreader.h"
+
+#if ENABLED(PSU_CONTROL)
+ #include "../../feature/power.h"
+#endif
+
+#if HAS_GAMES && DISABLED(LCD_INFO_MENU)
+ #include "game/game.h"
+#endif
+
+#if EITHER(SDSUPPORT, HOST_PROMPT_SUPPORT) || defined(ACTION_ON_CANCEL)
+ #define MACHINE_CAN_STOP 1
+#endif
+#if ANY(SDSUPPORT, HOST_PROMPT_SUPPORT, PARK_HEAD_ON_PAUSE) || defined(ACTION_ON_PAUSE)
+ #define MACHINE_CAN_PAUSE 1
+#endif
+
+#if ENABLED(MMU2_MENUS)
+ #include "menu_mmu2.h"
+#endif
+
+#if ENABLED(PASSWORD_FEATURE)
+ #include "../../feature/password/password.h"
+#endif
+
+#if (ENABLED(HOST_START_MENU_ITEM) && defined(ACTION_ON_START)) || (ENABLED(HOST_SHUTDOWN_MENU_ITEM) && defined(SHUTDOWN_ACTION))
+ #include "../../feature/host_actions.h"
+#endif
+
+#if ENABLED(GCODE_REPEAT_MARKERS)
+ #include "../../feature/repeat.h"
+#endif
+
+void menu_tune();
+void menu_cancelobject();
+void menu_motion();
+void menu_temperature();
+void menu_configuration();
+
+#if HAS_POWER_MONITOR
+ void menu_power_monitor();
+#endif
+
+#if ENABLED(MIXING_EXTRUDER)
+ void menu_mixer();
+#endif
+
+#if ENABLED(ADVANCED_PAUSE_FEATURE)
+ void menu_change_filament();
+#endif
+
+#if ENABLED(LCD_INFO_MENU)
+ void menu_info();
+#endif
+
+#if EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU)
+ void menu_led();
+#endif
+
+#if HAS_CUTTER
+ void menu_spindle_laser();
+#endif
+
+#if ENABLED(PREHEAT_SHORTCUT_MENU_ITEM)
+ void menu_preheat_only();
+#endif
+
+#if HAS_MULTI_LANGUAGE
+ void menu_language();
+#endif
+
+#if ENABLED(CUSTOM_MENU_MAIN)
+
+ void _lcd_custom_menu_main_gcode(FSTR_P const fstr) {
+ queue.inject(fstr);
+ TERN_(CUSTOM_MENU_MAIN_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback());
+ TERN_(CUSTOM_MENU_MAIN_SCRIPT_RETURN, ui.return_to_status());
+ }
+
+ void custom_menus_main() {
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ #define HAS_CUSTOM_ITEM_MAIN(N) (defined(MAIN_MENU_ITEM_##N##_DESC) && defined(MAIN_MENU_ITEM_##N##_GCODE))
+
+ #ifdef CUSTOM_MENU_MAIN_SCRIPT_DONE
+ #define _DONE_SCRIPT "\n" CUSTOM_MENU_MAIN_SCRIPT_DONE
+ #else
+ #define _DONE_SCRIPT ""
+ #endif
+ #define GCODE_LAMBDA_MAIN(N) []{ _lcd_custom_menu_main_gcode(F(MAIN_MENU_ITEM_##N##_GCODE _DONE_SCRIPT)); }
+ #define _CUSTOM_ITEM_MAIN(N) ACTION_ITEM_F(F(MAIN_MENU_ITEM_##N##_DESC), GCODE_LAMBDA_MAIN(N));
+ #define _CUSTOM_ITEM_MAIN_CONFIRM(N) \
+ SUBMENU_F(F(MAIN_MENU_ITEM_##N##_DESC), []{ \
+ MenuItem_confirm::confirm_screen( \
+ GCODE_LAMBDA_MAIN(N), nullptr, \
+ F(MAIN_MENU_ITEM_##N##_DESC "?") \
+ ); \
+ })
+
+ #define CUSTOM_ITEM_MAIN(N) do{ \
+ constexpr char c = MAIN_MENU_ITEM_##N##_GCODE[strlen(MAIN_MENU_ITEM_##N##_GCODE) - 1]; \
+ static_assert(c != '\n' && c != '\r', "MAIN_MENU_ITEM_" STRINGIFY(N) "_GCODE cannot have a newline at the end. Please remove it."); \
+ if (ENABLED(MAIN_MENU_ITEM_##N##_CONFIRM)) \
+ _CUSTOM_ITEM_MAIN_CONFIRM(N); \
+ else \
+ _CUSTOM_ITEM_MAIN(N); \
+ }while(0)
+
+ #if HAS_CUSTOM_ITEM_MAIN(1)
+ CUSTOM_ITEM_MAIN(1);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(2)
+ CUSTOM_ITEM_MAIN(2);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(3)
+ CUSTOM_ITEM_MAIN(3);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(4)
+ CUSTOM_ITEM_MAIN(4);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(5)
+ CUSTOM_ITEM_MAIN(5);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(6)
+ CUSTOM_ITEM_MAIN(6);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(7)
+ CUSTOM_ITEM_MAIN(7);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(8)
+ CUSTOM_ITEM_MAIN(8);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(9)
+ CUSTOM_ITEM_MAIN(9);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(10)
+ CUSTOM_ITEM_MAIN(10);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(11)
+ CUSTOM_ITEM_MAIN(11);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(12)
+ CUSTOM_ITEM_MAIN(12);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(13)
+ CUSTOM_ITEM_MAIN(13);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(14)
+ CUSTOM_ITEM_MAIN(14);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(15)
+ CUSTOM_ITEM_MAIN(15);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(16)
+ CUSTOM_ITEM_MAIN(16);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(17)
+ CUSTOM_ITEM_MAIN(17);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(18)
+ CUSTOM_ITEM_MAIN(18);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(19)
+ CUSTOM_ITEM_MAIN(19);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(20)
+ CUSTOM_ITEM_MAIN(20);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(21)
+ CUSTOM_ITEM_MAIN(21);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(22)
+ CUSTOM_ITEM_MAIN(22);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(23)
+ CUSTOM_ITEM_MAIN(23);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(24)
+ CUSTOM_ITEM_MAIN(24);
+ #endif
+ #if HAS_CUSTOM_ITEM_MAIN(25)
+ CUSTOM_ITEM_MAIN(25);
+ #endif
+ END_MENU();
+ }
+
+#endif // CUSTOM_MENU_MAIN
+
+void menu_main() {
+ const bool busy = printingIsActive()
+ #if ENABLED(SDSUPPORT)
+ , card_detected = card.isMounted()
+ , card_open = card_detected && card.isFileOpen()
+ #endif
+ ;
+
+ START_MENU();
+ BACK_ITEM(MSG_INFO_SCREEN);
+
+ #if ENABLED(SDSUPPORT)
+
+ #if !defined(MEDIA_MENU_AT_TOP) && !HAS_ENCODER_WHEEL
+ #define MEDIA_MENU_AT_TOP
+ #endif
+
+ auto sdcard_menu_items = [&]{
+ #if ENABLED(MENU_ADDAUTOSTART)
+ ACTION_ITEM(MSG_RUN_AUTO_FILES, card.autofile_begin); // Run Auto Files
+ #endif
+
+ if (card_detected) {
+ if (!card_open) {
+ #if HAS_SD_DETECT
+ GCODES_ITEM(MSG_CHANGE_MEDIA, F("M21")); // M21 Change Media
+ #else // - or -
+ ACTION_ITEM(MSG_RELEASE_MEDIA, []{ // M22 Release Media
+ queue.inject(F("M22"));
+ #if ENABLED(TFT_COLOR_UI)
+ // Menu display issue on item removal with multi language selection menu
+ if (encoderTopLine > 0) encoderTopLine--;
+ ui.refresh(LCDVIEW_CALL_REDRAW_NEXT);
+ #endif
+ });
+ #endif
+ SUBMENU(MSG_MEDIA_MENU, MEDIA_MENU_GATEWAY); // Media Menu (or Password First)
+ }
+ }
+ else {
+ #if HAS_SD_DETECT
+ ACTION_ITEM(MSG_NO_MEDIA, nullptr); // "No Media"
+ #else
+ GCODES_ITEM(MSG_ATTACH_MEDIA, F("M21")); // M21 Attach Media
+ #endif
+ }
+ };
+
+ #endif
+
+ if (busy) {
+ #if MACHINE_CAN_PAUSE
+ ACTION_ITEM(MSG_PAUSE_PRINT, ui.pause_print);
+ #endif
+ #if MACHINE_CAN_STOP
+ SUBMENU(MSG_STOP_PRINT, []{
+ MenuItem_confirm::select_screen(
+ GET_TEXT_F(MSG_BUTTON_STOP), GET_TEXT_F(MSG_BACK),
+ ui.abort_print, nullptr,
+ GET_TEXT_F(MSG_STOP_PRINT), (const char *)nullptr, F("?")
+ );
+ });
+ #endif
+
+ #if ENABLED(GCODE_REPEAT_MARKERS)
+ if (repeat.is_active())
+ ACTION_ITEM(MSG_END_LOOPS, repeat.cancel);
+ #endif
+
+ SUBMENU(MSG_TUNE, menu_tune);
+
+ #if ENABLED(CANCEL_OBJECTS) && DISABLED(SLIM_LCD_MENUS)
+ SUBMENU(MSG_CANCEL_OBJECT, []{ editable.int8 = -1; ui.goto_screen(menu_cancelobject); });
+ #endif
+ }
+ else {
+
+ #if BOTH(SDSUPPORT, MEDIA_MENU_AT_TOP)
+ sdcard_menu_items();
+ #endif
+
+ if (TERN0(MACHINE_CAN_PAUSE, printingIsPaused()))
+ ACTION_ITEM(MSG_RESUME_PRINT, ui.resume_print);
+
+ #if ENABLED(HOST_START_MENU_ITEM) && defined(ACTION_ON_START)
+ ACTION_ITEM(MSG_HOST_START_PRINT, hostui.start);
+ #endif
+
+ #if ENABLED(PREHEAT_SHORTCUT_MENU_ITEM)
+ SUBMENU(MSG_PREHEAT_CUSTOM, menu_preheat_only);
+ #endif
+
+ SUBMENU(MSG_MOTION, menu_motion);
+ }
+
+ #if HAS_CUTTER
+ SUBMENU(MSG_CUTTER(MENU), STICKY_SCREEN(menu_spindle_laser));
+ #endif
+
+ #if HAS_TEMPERATURE
+ SUBMENU(MSG_TEMPERATURE, menu_temperature);
+ #endif
+
+ #if HAS_POWER_MONITOR
+ SUBMENU(MSG_POWER_MONITOR, menu_power_monitor);
+ #endif
+
+ #if ENABLED(MIXING_EXTRUDER)
+ SUBMENU(MSG_MIXER, menu_mixer);
+ #endif
+
+ #if ENABLED(MMU2_MENUS)
+ if (!busy) SUBMENU(MSG_MMU2_MENU, menu_mmu2);
+ #endif
+
+ SUBMENU(MSG_CONFIGURATION, menu_configuration);
+
+ #if ENABLED(CUSTOM_MENU_MAIN)
+ if (TERN1(CUSTOM_MENU_MAIN_ONLY_IDLE, !busy)) {
+ #ifdef CUSTOM_MENU_MAIN_TITLE
+ SUBMENU_F(F(CUSTOM_MENU_MAIN_TITLE), custom_menus_main);
+ #else
+ SUBMENU(MSG_CUSTOM_COMMANDS, custom_menus_main);
+ #endif
+ }
+ #endif
+
+ #if ENABLED(ADVANCED_PAUSE_FEATURE)
+ #if E_STEPPERS == 1 && DISABLED(FILAMENT_LOAD_UNLOAD_GCODES)
+ YESNO_ITEM(MSG_FILAMENTCHANGE,
+ menu_change_filament, nullptr,
+ GET_TEXT_F(MSG_FILAMENTCHANGE), (const char *)nullptr, F("?")
+ );
+ #else
+ SUBMENU(MSG_FILAMENTCHANGE, menu_change_filament);
+ #endif
+ #endif
+
+ #if ENABLED(LCD_INFO_MENU)
+ SUBMENU(MSG_INFO_MENU, menu_info);
+ #endif
+
+ #if EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU)
+ SUBMENU(MSG_LEDS, menu_led);
+ #endif
+
+ //
+ // Switch power on/off
+ //
+ #if ENABLED(PSU_CONTROL)
+ if (powerManager.psu_on)
+ #if ENABLED(PS_OFF_CONFIRM)
+ CONFIRM_ITEM(MSG_SWITCH_PS_OFF,
+ MSG_YES, MSG_NO,
+ ui.poweroff, nullptr,
+ GET_TEXT_F(MSG_SWITCH_PS_OFF), (const char *)nullptr, F("?")
+ );
+ #else
+ ACTION_ITEM(MSG_SWITCH_PS_OFF, ui.poweroff);
+ #endif
+ else
+ GCODES_ITEM(MSG_SWITCH_PS_ON, F("M80"));
+ #endif
+
+ #if ENABLED(SDSUPPORT) && DISABLED(MEDIA_MENU_AT_TOP)
+ sdcard_menu_items();
+ #endif
+
+ #if HAS_SERVICE_INTERVALS
+ static auto _service_reset = [](const int index) {
+ print_job_timer.resetServiceInterval(index);
+ ui.completion_feedback();
+ ui.reset_status();
+ ui.return_to_status();
+ };
+ #if SERVICE_INTERVAL_1 > 0
+ CONFIRM_ITEM_F(F(SERVICE_NAME_1),
+ MSG_BUTTON_RESET, MSG_BUTTON_CANCEL,
+ []{ _service_reset(1); }, nullptr,
+ GET_TEXT_F(MSG_SERVICE_RESET), F(SERVICE_NAME_1), F("?")
+ );
+ #endif
+ #if SERVICE_INTERVAL_2 > 0
+ CONFIRM_ITEM_F(F(SERVICE_NAME_2),
+ MSG_BUTTON_RESET, MSG_BUTTON_CANCEL,
+ []{ _service_reset(2); }, nullptr,
+ GET_TEXT_F(MSG_SERVICE_RESET), F(SERVICE_NAME_2), F("?")
+ );
+ #endif
+ #if SERVICE_INTERVAL_3 > 0
+ CONFIRM_ITEM_F(F(SERVICE_NAME_3),
+ MSG_BUTTON_RESET, MSG_BUTTON_CANCEL,
+ []{ _service_reset(3); }, nullptr,
+ GET_TEXT_F(MSG_SERVICE_RESET), F(SERVICE_NAME_3), F("?")
+ );
+ #endif
+ #endif
+
+ #if HAS_GAMES && DISABLED(LCD_INFO_MENU)
+ #if ENABLED(GAMES_EASTER_EGG)
+ SKIP_ITEM();
+ SKIP_ITEM();
+ SKIP_ITEM();
+ #endif
+ // Game sub-menu or the individual game
+ {
+ SUBMENU(
+ #if HAS_GAME_MENU
+ MSG_GAMES, menu_game
+ #elif ENABLED(MARLIN_BRICKOUT)
+ MSG_BRICKOUT, brickout.enter_game
+ #elif ENABLED(MARLIN_INVADERS)
+ MSG_INVADERS, invaders.enter_game
+ #elif ENABLED(MARLIN_SNAKE)
+ MSG_SNAKE, snake.enter_game
+ #elif ENABLED(MARLIN_MAZE)
+ MSG_MAZE, maze.enter_game
+ #endif
+ );
+ }
+ #endif
+
+ #if HAS_MULTI_LANGUAGE
+ SUBMENU(LANGUAGE, menu_language);
+ #endif
+
+ #if ENABLED(HOST_SHUTDOWN_MENU_ITEM) && defined(SHUTDOWN_ACTION)
+ SUBMENU(MSG_HOST_SHUTDOWN, []{
+ MenuItem_confirm::select_screen(
+ GET_TEXT_F(MSG_BUTTON_PROCEED), GET_TEXT_F(MSG_BUTTON_CANCEL),
+ []{ ui.return_to_status(); hostui.shutdown(); }, nullptr,
+ GET_TEXT_F(MSG_HOST_SHUTDOWN), (const char *)nullptr, F("?")
+ );
+ });
+ #endif
+
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU
diff --git a/src/lcd/menu/menu_media.cpp b/src/lcd/menu/menu_media.cpp
new file mode 100644
index 0000000..20ef6e3
--- /dev/null
+++ b/src/lcd/menu/menu_media.cpp
@@ -0,0 +1,164 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// SD Card Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if BOTH(HAS_MARLINUI_MENU, SDSUPPORT)
+
+#include "menu_item.h"
+#include "../../sd/cardreader.h"
+
+void lcd_sd_updir() {
+ ui.encoderPosition = card.cdup() ? ENCODER_STEPS_PER_MENU_ITEM : 0;
+ encoderTopLine = 0;
+ ui.screen_changed = true;
+ ui.refresh();
+}
+
+#if ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
+
+ uint16_t sd_encoder_position = 0xFFFF;
+ int8_t sd_top_line, sd_items;
+
+ void MarlinUI::reselect_last_file() {
+ if (sd_encoder_position == 0xFFFF) return;
+ goto_screen(menu_media, sd_encoder_position, sd_top_line, sd_items);
+ sd_encoder_position = 0xFFFF;
+ defer_status_screen();
+ TERN_(HAS_TOUCH_SLEEP, ui.wakeup_screen());
+ }
+
+#endif
+
+inline void sdcard_start_selected_file() {
+ card.openAndPrintFile(card.filename);
+ ui.return_to_status();
+ ui.reset_status();
+}
+
+class MenuItem_sdfile : public MenuItem_sdbase {
+ public:
+ static inline void draw(const bool sel, const uint8_t row, FSTR_P const fstr, CardReader &theCard) {
+ MenuItem_sdbase::draw(sel, row, fstr, theCard, false);
+ }
+ static void action(FSTR_P const fstr, CardReader &) {
+ #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
+ // Save menu state for the selected file
+ sd_encoder_position = ui.encoderPosition;
+ sd_top_line = encoderTopLine;
+ sd_items = screen_items;
+ #endif
+ #if ENABLED(SD_MENU_CONFIRM_START)
+ MenuItem_submenu::action(fstr, []{
+ char * const longest = card.longest_filename();
+ char buffer[strlen(longest) + 2];
+ buffer[0] = ' ';
+ strcpy(buffer + 1, longest);
+ MenuItem_confirm::select_screen(
+ GET_TEXT_F(MSG_BUTTON_PRINT), GET_TEXT_F(MSG_BUTTON_CANCEL),
+ sdcard_start_selected_file, nullptr,
+ GET_TEXT_F(MSG_START_PRINT), buffer, F("?")
+ );
+ });
+ #else
+ sdcard_start_selected_file();
+ UNUSED(fstr);
+ #endif
+ }
+};
+
+class MenuItem_sdfolder : public MenuItem_sdbase {
+ public:
+ static inline void draw(const bool sel, const uint8_t row, FSTR_P const fstr, CardReader &theCard) {
+ MenuItem_sdbase::draw(sel, row, fstr, theCard, true);
+ }
+ static void action(FSTR_P const, CardReader &theCard) {
+ card.cd(theCard.filename);
+ encoderTopLine = 0;
+ ui.encoderPosition = 2 * (ENCODER_STEPS_PER_MENU_ITEM);
+ ui.screen_changed = true;
+ TERN_(HAS_MARLINUI_U8GLIB, ui.drawing_screen = false);
+ ui.refresh();
+ }
+};
+
+void menu_media_filelist() {
+ ui.encoder_direction_menus();
+
+ #if HAS_MARLINUI_U8GLIB
+ static uint16_t fileCnt;
+ if (ui.first_page) fileCnt = card.get_num_Files();
+ #else
+ const uint16_t fileCnt = card.get_num_Files();
+ #endif
+
+ START_MENU();
+ #if ENABLED(MULTI_VOLUME)
+ ACTION_ITEM(MSG_BACK, []{ ui.goto_screen(menu_media); });
+ #else
+ BACK_ITEM_F(TERN1(BROWSE_MEDIA_ON_INSERT, screen_history_depth) ? GET_TEXT_F(MSG_MAIN) : GET_TEXT_F(MSG_BACK));
+ #endif
+ if (card.flag.workDirIsRoot) {
+ #if !HAS_SD_DETECT
+ ACTION_ITEM(MSG_REFRESH, []{ encoderTopLine = 0; card.mount(); });
+ #endif
+ }
+ else if (card.isMounted())
+ ACTION_ITEM_F(F(LCD_STR_FOLDER " .."), lcd_sd_updir);
+
+ if (ui.should_draw()) for (uint16_t i = 0; i < fileCnt; i++) {
+ if (_menuLineNr == _thisItemNr) {
+ card.getfilename_sorted(SD_ORDER(i, fileCnt));
+ if (card.flag.filenameIsDir)
+ MENU_ITEM(sdfolder, MSG_MEDIA_MENU, card);
+ else
+ MENU_ITEM(sdfile, MSG_MEDIA_MENU, card);
+ }
+ else
+ SKIP_ITEM();
+ }
+ END_MENU();
+}
+
+#if ENABLED(MULTI_VOLUME)
+ void menu_media_select() {
+ START_MENU();
+ BACK_ITEM_F(TERN1(BROWSE_MEDIA_ON_INSERT, screen_history_depth) ? GET_TEXT_F(MSG_MAIN) : GET_TEXT_F(MSG_BACK));
+ #if ENABLED(VOLUME_SD_ONBOARD)
+ ACTION_ITEM(MSG_SD_CARD, []{ card.changeMedia(&card.media_driver_sdcard); card.mount(); ui.goto_screen(menu_media_filelist); });
+ #endif
+ #if ENABLED(VOLUME_USB_FLASH_DRIVE)
+ ACTION_ITEM(MSG_USB_DISK, []{ card.changeMedia(&card.media_driver_usbFlash); card.mount(); ui.goto_screen(menu_media_filelist); });
+ #endif
+ END_MENU();
+ }
+#endif
+
+void menu_media() {
+ TERN(MULTI_VOLUME, menu_media_select, menu_media_filelist)();
+}
+
+#endif // HAS_MARLINUI_MENU && SDSUPPORT
diff --git a/src/lcd/menu/menu_mixer.cpp b/src/lcd/menu/menu_mixer.cpp
new file mode 100644
index 0000000..feb4c59
--- /dev/null
+++ b/src/lcd/menu/menu_mixer.cpp
@@ -0,0 +1,278 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Mixer Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if BOTH(HAS_MARLINUI_MENU, MIXING_EXTRUDER)
+
+#include "menu_item.h"
+#include "menu_addon.h"
+
+#include "../../feature/mixing.h"
+
+#if HAS_GRAPHICAL_TFT
+ #include "../tft/tft.h"
+#endif
+
+#define CHANNEL_MIX_EDITING !HAS_DUAL_MIXING
+
+#if ENABLED(GRADIENT_MIX)
+
+ void _lcd_mixer_gradient_z_edit(const bool isend) {
+ ui.defer_status_screen();
+ ENCODER_RATE_MULTIPLY(true);
+
+ float &zvar = isend ? mixer.gradient.end_z : mixer.gradient.start_z;
+
+ if (ui.encoderPosition) {
+ zvar += float(int32_t(ui.encoderPosition)) * 0.1;
+ ui.encoderPosition = 0;
+ NOLESS(zvar, 0);
+ NOMORE(zvar, Z_MAX_POS);
+ }
+
+ if (ui.should_draw()) {
+ char tmp[16];
+ SETCURSOR(1, (LCD_HEIGHT - 1) / 2);
+ lcd_put_u8str(isend ? GET_TEXT_F(MSG_END_Z) : GET_TEXT_F(MSG_START_Z));
+ sprintf_P(tmp, PSTR("%4d.%d mm"), int(zvar), int(zvar * 10) % 10);
+ SETCURSOR_RJ(9, (LCD_HEIGHT - 1) / 2);
+ lcd_put_u8str(tmp);
+ }
+
+ if (ui.lcd_clicked) {
+ if (isend && zvar < mixer.gradient.start_z)
+ mixer.gradient.start_z = zvar;
+ else if (!isend && zvar > mixer.gradient.end_z)
+ mixer.gradient.end_z = zvar;
+ mixer.refresh_gradient();
+ ui.goto_previous_screen();
+ }
+ else {
+ TERN_(HAS_GRAPHICAL_TFT, tft.draw_edit_screen_buttons());
+ }
+ }
+
+ void lcd_mixer_edit_gradient_menu() {
+ START_MENU();
+ BACK_ITEM(MSG_MIXER);
+
+ EDIT_ITEM(int8, MSG_START_VTOOL, &mixer.gradient.start_vtool, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient);
+ EDIT_ITEM(int8, MSG_END_VTOOL, &mixer.gradient.end_vtool, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient);
+
+ #if ENABLED(GRADIENT_VTOOL)
+ EDIT_ITEM(int8, MSG_GRADIENT_ALIAS, &mixer.gradient.vtool_index, -1, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient);
+ #endif
+
+ char tmp[18];
+
+ FSTR_P const slabel = GET_TEXT_F(MSG_START_Z);
+ SUBMENU_F(slabel, []{ _lcd_mixer_gradient_z_edit(false); });
+ MENU_ITEM_ADDON_START_RJ(11);
+ sprintf_P(tmp, PSTR("%4d.%d mm"), int(mixer.gradient.start_z), int(mixer.gradient.start_z * 10) % 10);
+ lcd_put_u8str(tmp);
+ MENU_ITEM_ADDON_END();
+
+ FSTR_P const elabel = GET_TEXT_F(MSG_END_Z);
+ SUBMENU_F(elabel, []{ _lcd_mixer_gradient_z_edit(true); });
+ MENU_ITEM_ADDON_START_RJ(11);
+ sprintf_P(tmp, PSTR("%4d.%d mm"), int(mixer.gradient.end_z), int(mixer.gradient.end_z * 10) % 10);
+ lcd_put_u8str(tmp);
+ MENU_ITEM_ADDON_END();
+
+ END_MENU();
+ }
+
+#endif // GRADIENT_MIX
+
+static uint8_t v_index;
+
+#if HAS_DUAL_MIXING
+ void _lcd_draw_mix(const uint8_t y) {
+ char tmp[20]; // "100%_100%"
+ sprintf_P(tmp, PSTR("%3d%% %3d%%"), int(mixer.mix[0]), int(mixer.mix[1]));
+ SETCURSOR(2, y); lcd_put_u8str(GET_TEXT_F(MSG_MIX));
+ SETCURSOR_RJ(10, y); lcd_put_u8str(tmp);
+ }
+#endif
+
+void _lcd_mixer_select_vtool() {
+ mixer.T(v_index);
+ TERN_(HAS_DUAL_MIXING, _lcd_draw_mix(LCD_HEIGHT - 1));
+}
+
+#if CHANNEL_MIX_EDITING
+
+ void _lcd_mixer_cycle_mix() {
+ uint16_t bits = 0;
+ MIXER_STEPPER_LOOP(i) if (mixer.collector[i]) SBI(bits, i);
+ bits = (bits + 1) & (_BV(MIXING_STEPPERS) - 1);
+ if (!bits) ++bits;
+ MIXER_STEPPER_LOOP(i) mixer.collector[i] = TEST(bits, i) ? 10.0f : 0.0f;
+ ui.refresh();
+ }
+
+ void _lcd_mixer_commit_vtool() {
+ mixer.normalize();
+ ui.goto_previous_screen();
+ }
+
+#endif
+
+void lcd_mixer_mix_edit() {
+
+ #if HAS_DUAL_MIXING && !CHANNEL_MIX_EDITING
+
+ // Adjust 2-channel mix from the encoder
+ if (ui.encoderPosition) {
+ mixer.mix[0] += int32_t(ui.encoderPosition);
+ ui.encoderPosition = 0;
+ if (mixer.mix[0] < 0) mixer.mix[0] += 101;
+ if (mixer.mix[0] > 100) mixer.mix[0] -= 101;
+ mixer.mix[1] = 100 - mixer.mix[0];
+ }
+ _lcd_draw_mix((LCD_HEIGHT - 1) / 2);
+
+ // Click to commit the change
+ if (ui.lcd_clicked) {
+ mixer.update_vtool_from_mix();
+ ui.goto_previous_screen();
+ }
+
+ TERN_(HAS_GRAPHICAL_TFT, tft.draw_edit_screen_buttons());
+
+ #else
+
+ START_MENU();
+ BACK_ITEM(MSG_MIXER);
+
+ #if CHANNEL_MIX_EDITING
+
+ LOOP_S_LE_N(n, 1, MIXING_STEPPERS)
+ EDIT_ITEM_FAST_N(float42_52, n, MSG_MIX_COMPONENT_N, &mixer.collector[n-1], 0, 10);
+
+ ACTION_ITEM(MSG_CYCLE_MIX, _lcd_mixer_cycle_mix);
+ ACTION_ITEM(MSG_COMMIT_VTOOL, _lcd_mixer_commit_vtool);
+
+ #endif
+
+ END_MENU();
+
+ #endif
+}
+
+#if HAS_DUAL_MIXING
+
+ //
+ // Toggle Dual-Mix
+ //
+ inline void _lcd_mixer_toggle_mix() {
+ mixer.mix[0] = mixer.mix[0] == 100 ? 0 : 100;
+ mixer.mix[1] = 100 - mixer.mix[0];
+ mixer.update_vtool_from_mix();
+ ui.refresh(LCDVIEW_CALL_REDRAW_NEXT);
+ }
+
+#endif
+
+#if CHANNEL_MIX_EDITING
+
+ //
+ // Prepare and Edit Mix
+ //
+ inline void _lcd_goto_mix_edit() {
+ mixer.refresh_collector(10, v_index);
+ ui.goto_screen(lcd_mixer_mix_edit);
+ lcd_mixer_mix_edit();
+ }
+
+#endif
+
+#if ENABLED(GRADIENT_MIX)
+ //
+ // Reverse Gradient
+ //
+ inline void _lcd_mixer_reverse_gradient() {
+ const uint8_t sv = mixer.gradient.start_vtool;
+ mixer.gradient.start_vtool = mixer.gradient.end_vtool;
+ mixer.gradient.end_vtool = sv;
+ mixer.refresh_gradient();
+ ui.refresh(LCDVIEW_CALL_REDRAW_NEXT);
+ }
+#endif
+
+void menu_mixer() {
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ v_index = mixer.get_current_vtool();
+ EDIT_ITEM(uint8, MSG_ACTIVE_VTOOL, &v_index, 0, MIXING_VIRTUAL_TOOLS - 1, _lcd_mixer_select_vtool, ENABLED(HAS_DUAL_MIXING));
+
+ #if HAS_DUAL_MIXING
+ {
+ char tmp[11];
+ SUBMENU(MSG_MIX, lcd_mixer_mix_edit);
+ MENU_ITEM_ADDON_START_RJ(9);
+ mixer.update_mix_from_vtool();
+ sprintf_P(tmp, PSTR("%3d;%3d%%"), int(mixer.mix[0]), int(mixer.mix[1]));
+ lcd_put_u8str(tmp);
+ MENU_ITEM_ADDON_END();
+ ACTION_ITEM(MSG_TOGGLE_MIX, _lcd_mixer_toggle_mix);
+ }
+ #else
+ SUBMENU(MSG_MIX, _lcd_goto_mix_edit);
+ #endif
+
+ //
+ // Reset All V-Tools
+ //
+ CONFIRM_ITEM(MSG_RESET_VTOOLS,
+ MSG_BUTTON_RESET, MSG_BUTTON_CANCEL,
+ []{
+ mixer.reset_vtools();
+ LCD_MESSAGE(MSG_VTOOLS_RESET);
+ ui.return_to_status();
+ },
+ nullptr,
+ GET_TEXT_F(MSG_RESET_VTOOLS), (const char *)nullptr, F("?")
+ );
+
+ #if ENABLED(GRADIENT_MIX)
+ {
+ char tmp[13];
+ SUBMENU(MSG_GRADIENT, lcd_mixer_edit_gradient_menu);
+ MENU_ITEM_ADDON_START_RJ(9);
+ sprintf_P(tmp, PSTR("T%i->T%i"), mixer.gradient.start_vtool, mixer.gradient.end_vtool);
+ lcd_put_u8str(tmp);
+ MENU_ITEM_ADDON_END();
+ ACTION_ITEM(MSG_REVERSE_GRADIENT, _lcd_mixer_reverse_gradient);
+ }
+ #endif
+
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU && MIXING_EXTRUDER
diff --git a/src/lcd/menu/menu_mmu2.cpp b/src/lcd/menu/menu_mmu2.cpp
new file mode 100644
index 0000000..a2412b0
--- /dev/null
+++ b/src/lcd/menu/menu_mmu2.cpp
@@ -0,0 +1,170 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../../inc/MarlinConfig.h"
+
+#if BOTH(HAS_MARLINUI_MENU, MMU2_MENUS)
+
+#include "../../MarlinCore.h"
+#include "../../feature/mmu/mmu2.h"
+#include "menu_mmu2.h"
+#include "menu_item.h"
+
+//
+// Load Filament
+//
+
+inline void action_mmu2_load_filament_to_nozzle(const uint8_t tool) {
+ ui.reset_status();
+ ui.return_to_status();
+ ui.status_printf(0, GET_TEXT_F(MSG_MMU2_LOADING_FILAMENT), int(tool + 1));
+ if (mmu2.load_filament_to_nozzle(tool)) ui.reset_status();
+ ui.return_to_status();
+}
+
+void _mmu2_load_filament(uint8_t index) {
+ ui.return_to_status();
+ ui.status_printf(0, GET_TEXT_F(MSG_MMU2_LOADING_FILAMENT), int(index + 1));
+ mmu2.load_filament(index);
+ ui.reset_status();
+}
+void action_mmu2_load_all() {
+ EXTRUDER_LOOP() _mmu2_load_filament(e);
+ ui.return_to_status();
+}
+
+void menu_mmu2_load_filament() {
+ START_MENU();
+ BACK_ITEM(MSG_MMU2_MENU);
+ ACTION_ITEM(MSG_MMU2_ALL, action_mmu2_load_all);
+ EXTRUDER_LOOP() ACTION_ITEM_N(e, MSG_MMU2_FILAMENT_N, []{ _mmu2_load_filament(MenuItemBase::itemIndex); });
+ END_MENU();
+}
+
+void menu_mmu2_load_to_nozzle() {
+ START_MENU();
+ BACK_ITEM(MSG_MMU2_MENU);
+ EXTRUDER_LOOP() ACTION_ITEM_N(e, MSG_MMU2_FILAMENT_N, []{ action_mmu2_load_filament_to_nozzle(MenuItemBase::itemIndex); });
+ END_MENU();
+}
+
+//
+// Eject Filament
+//
+
+void _mmu2_eject_filament(uint8_t index) {
+ ui.reset_status();
+ ui.return_to_status();
+ ui.status_printf(0, GET_TEXT_F(MSG_MMU2_EJECTING_FILAMENT), int(index + 1));
+ if (mmu2.eject_filament(index, true)) ui.reset_status();
+}
+
+void action_mmu2_unload_filament() {
+ ui.reset_status();
+ ui.return_to_status();
+ LCD_MESSAGE(MSG_MMU2_UNLOADING_FILAMENT);
+ idle();
+ if (mmu2.unload()) ui.reset_status();
+}
+
+void menu_mmu2_eject_filament() {
+ START_MENU();
+ BACK_ITEM(MSG_MMU2_MENU);
+ EXTRUDER_LOOP() ACTION_ITEM_N(e, MSG_MMU2_FILAMENT_N, []{ _mmu2_eject_filament(MenuItemBase::itemIndex); });
+ END_MENU();
+}
+
+//
+// MMU2 Menu
+//
+
+void action_mmu2_reset() {
+ mmu2.init();
+ ui.reset_status();
+}
+
+void menu_mmu2() {
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+ SUBMENU(MSG_MMU2_LOAD_FILAMENT, menu_mmu2_load_filament);
+ SUBMENU(MSG_MMU2_LOAD_TO_NOZZLE, menu_mmu2_load_to_nozzle);
+ SUBMENU(MSG_MMU2_EJECT_FILAMENT, menu_mmu2_eject_filament);
+ ACTION_ITEM(MSG_MMU2_UNLOAD_FILAMENT, action_mmu2_unload_filament);
+ ACTION_ITEM(MSG_MMU2_RESET, action_mmu2_reset);
+ END_MENU();
+}
+
+//
+// T* Choose Filament
+//
+
+uint8_t feeder_index;
+bool wait_for_mmu_menu;
+
+inline void action_mmu2_chosen(const uint8_t index) {
+ feeder_index = index;
+ wait_for_mmu_menu = false;
+}
+
+void menu_mmu2_choose_filament() {
+ START_MENU();
+ #if LCD_HEIGHT > 2
+ STATIC_ITEM(MSG_MMU2_CHOOSE_FILAMENT_HEADER, SS_DEFAULT|SS_INVERT);
+ #endif
+ EXTRUDER_LOOP() ACTION_ITEM_N(e, MSG_MMU2_FILAMENT_N, []{ action_mmu2_chosen(MenuItemBase::itemIndex); });
+ END_MENU();
+}
+
+//
+// MMU2 Filament Runout
+//
+
+void menu_mmu2_pause() {
+ feeder_index = mmu2.get_current_tool();
+ START_MENU();
+ #if LCD_HEIGHT > 2
+ STATIC_ITEM(MSG_FILAMENT_CHANGE_HEADER, SS_DEFAULT|SS_INVERT);
+ #endif
+ ACTION_ITEM(MSG_MMU2_RESUME, []{ wait_for_mmu_menu = false; });
+ ACTION_ITEM(MSG_MMU2_UNLOAD_FILAMENT, []{ mmu2.unload(); });
+ ACTION_ITEM(MSG_MMU2_LOAD_FILAMENT, []{ mmu2.load_filament(feeder_index); });
+ ACTION_ITEM(MSG_MMU2_LOAD_TO_NOZZLE, []{ mmu2.load_filament_to_nozzle(feeder_index); });
+ END_MENU();
+}
+
+void mmu2_M600() {
+ ui.defer_status_screen();
+ ui.goto_screen(menu_mmu2_pause);
+ wait_for_mmu_menu = true;
+ while (wait_for_mmu_menu) idle();
+}
+
+uint8_t mmu2_choose_filament() {
+ ui.defer_status_screen();
+ ui.goto_screen(menu_mmu2_choose_filament);
+ wait_for_mmu_menu = true;
+ while (wait_for_mmu_menu) idle();
+ ui.return_to_status();
+ return feeder_index;
+}
+
+#endif // HAS_MARLINUI_MENU && MMU2_MENUS
diff --git a/src/lcd/menu/menu_mmu2.h b/src/lcd/menu/menu_mmu2.h
new file mode 100644
index 0000000..4230c01
--- /dev/null
+++ b/src/lcd/menu/menu_mmu2.h
@@ -0,0 +1,28 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include
+
+void menu_mmu2();
+void mmu2_M600();
+uint8_t mmu2_choose_filament();
diff --git a/src/lcd/menu/menu_motion.cpp b/src/lcd/menu/menu_motion.cpp
new file mode 100644
index 0000000..e795ea6
--- /dev/null
+++ b/src/lcd/menu/menu_motion.cpp
@@ -0,0 +1,409 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Motion Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if HAS_MARLINUI_MENU
+
+#define LARGE_AREA_TEST ((X_BED_SIZE) >= 1000 || (Y_BED_SIZE) >= 1000 || (Z_MAX_POS) >= 1000)
+
+#include "menu_item.h"
+#include "menu_addon.h"
+
+#include "../../module/motion.h"
+#include "../../gcode/parser.h" // for inch support
+
+#if ENABLED(DELTA)
+ #include "../../module/delta.h"
+#endif
+
+#if ENABLED(PREVENT_COLD_EXTRUSION)
+ #include "../../module/temperature.h"
+#endif
+
+#if HAS_LEVELING
+ #include "../../module/planner.h"
+ #include "../../feature/bedlevel/bedlevel.h"
+#endif
+
+//
+// "Motion" > "Move Axis" submenu
+//
+
+void lcd_move_axis(const AxisEnum axis) {
+ if (ui.use_click()) return ui.goto_previous_screen_no_defer();
+ if (ui.encoderPosition && !ui.manual_move.processing) {
+ // Get motion limit from software endstops, if any
+ float min, max;
+ soft_endstop.get_manual_axis_limits(axis, min, max);
+
+ // Delta limits XY based on the current offset from center
+ // This assumes the center is 0,0
+ #if ENABLED(DELTA)
+ if (axis != Z_AXIS) {
+ max = SQRT(sq((float)(DELTA_PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis
+ min = -max;
+ }
+ #endif
+
+ // Get the new position
+ const float diff = float(int32_t(ui.encoderPosition)) * ui.manual_move.menu_scale;
+ (void)ui.manual_move.apply_diff(axis, diff, min, max);
+ ui.manual_move.soon(axis);
+ ui.refresh(LCDVIEW_REDRAW_NOW);
+ }
+ ui.encoderPosition = 0;
+ if (ui.should_draw()) {
+ MenuEditItemBase::itemIndex = axis;
+ const float pos = ui.manual_move.axis_value(axis);
+ if (parser.using_inch_units()) {
+ const float imp_pos = LINEAR_UNIT(pos);
+ MenuEditItemBase::draw_edit_screen(GET_TEXT_F(MSG_MOVE_N), ftostr63(imp_pos));
+ }
+ else
+ MenuEditItemBase::draw_edit_screen(GET_TEXT_F(MSG_MOVE_N), ui.manual_move.menu_scale >= 0.1f ? (LARGE_AREA_TEST ? ftostr51sign(pos) : ftostr41sign(pos)) : ftostr63(pos));
+ }
+}
+
+#if E_MANUAL
+
+ static void lcd_move_e(TERN_(MULTI_E_MANUAL, const int8_t eindex=active_extruder)) {
+ if (ui.use_click()) return ui.goto_previous_screen_no_defer();
+ if (ui.encoderPosition) {
+ if (!ui.manual_move.processing) {
+ const float diff = float(int32_t(ui.encoderPosition)) * ui.manual_move.menu_scale;
+ TERN(IS_KINEMATIC, ui.manual_move.offset, current_position.e) += diff;
+ ui.manual_move.soon(E_AXIS OPTARG(MULTI_E_MANUAL, eindex));
+ ui.refresh(LCDVIEW_REDRAW_NOW);
+ }
+ ui.encoderPosition = 0;
+ }
+ if (ui.should_draw()) {
+ TERN_(MULTI_E_MANUAL, MenuItemBase::init(eindex));
+ MenuEditItemBase::draw_edit_screen(
+ GET_TEXT_F(TERN(MULTI_E_MANUAL, MSG_MOVE_EN, MSG_MOVE_E)),
+ ftostr41sign(current_position.e
+ PLUS_TERN0(IS_KINEMATIC, ui.manual_move.offset)
+ MINUS_TERN0(MANUAL_E_MOVES_RELATIVE, ui.manual_move.e_origin)
+ )
+ );
+ } // should_draw
+ }
+
+#endif // E_MANUAL
+
+#if EITHER(PROBE_OFFSET_WIZARD, X_AXIS_TWIST_COMPENSATION)
+
+ void _goto_manual_move_z(const_float_t scale) {
+ ui.manual_move.menu_scale = scale;
+ ui.goto_screen([]{ lcd_move_axis(Z_AXIS); });
+ }
+
+#endif
+
+//
+// "Motion" > "Move Xmm" > "Move XYZ" submenu
+//
+
+#ifndef FINE_MANUAL_MOVE
+ #define FINE_MANUAL_MOVE 0.025
+#endif
+
+void _goto_manual_move(const_float_t scale) {
+ ui.defer_status_screen();
+ ui.manual_move.menu_scale = scale;
+ ui.goto_screen(ui.manual_move.screen_ptr);
+ thermalManager.set_menu_cold_override(true);
+}
+
+void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int8_t eindex=active_extruder) {
+ ui.manual_move.screen_ptr = func;
+ START_MENU();
+
+ if (LCD_HEIGHT >= 4) {
+ if (axis < NUM_AXES)
+ STATIC_ITEM_N(axis, MSG_MOVE_N, SS_DEFAULT|SS_INVERT);
+ else {
+ TERN_(MANUAL_E_MOVES_RELATIVE, ui.manual_move.e_origin = current_position.e);
+ STATIC_ITEM_N(eindex, MSG_MOVE_EN, SS_DEFAULT|SS_INVERT);
+ }
+ }
+
+ BACK_ITEM(MSG_MOVE_AXIS);
+ if (parser.using_inch_units()) {
+ if (LARGE_AREA_TEST) SUBMENU(MSG_MOVE_1IN, []{ _goto_manual_move(IN_TO_MM(1.000f)); });
+ SUBMENU(MSG_MOVE_01IN, []{ _goto_manual_move(IN_TO_MM(0.100f)); });
+ SUBMENU(MSG_MOVE_001IN, []{ _goto_manual_move(IN_TO_MM(0.010f)); });
+ SUBMENU(MSG_MOVE_0001IN, []{ _goto_manual_move(IN_TO_MM(0.001f)); });
+ }
+ else {
+ if (LARGE_AREA_TEST) SUBMENU(MSG_MOVE_100MM, []{ _goto_manual_move(100); });
+ SUBMENU(MSG_MOVE_10MM, []{ _goto_manual_move(10); });
+ SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move( 1); });
+ SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move( 0.1f); });
+ if (axis == Z_AXIS && (FINE_MANUAL_MOVE) > 0.0f && (FINE_MANUAL_MOVE) < 0.1f)
+ SUBMENU_f(F(STRINGIFY(FINE_MANUAL_MOVE)), MSG_MOVE_N_MM, []{ _goto_manual_move(float(FINE_MANUAL_MOVE)); });
+ }
+ END_MENU();
+}
+
+#if E_MANUAL
+
+ inline void _goto_menu_move_distance_e() {
+ ui.goto_screen([]{ _menu_move_distance(E_AXIS, []{ lcd_move_e(); }); });
+ }
+
+ inline void _menu_move_distance_e_maybe() {
+ #if ENABLED(PREVENT_COLD_EXTRUSION)
+ const bool too_cold = thermalManager.tooColdToExtrude(active_extruder);
+ if (too_cold) {
+ ui.goto_screen([]{
+ MenuItem_confirm::select_screen(
+ GET_TEXT_F(MSG_BUTTON_PROCEED), GET_TEXT_F(MSG_BACK),
+ _goto_menu_move_distance_e, nullptr,
+ GET_TEXT_F(MSG_HOTEND_TOO_COLD), (const char *)nullptr, F("!")
+ );
+ });
+ return;
+ }
+ #endif
+ _goto_menu_move_distance_e();
+ }
+
+#endif // E_MANUAL
+
+void menu_move() {
+ START_MENU();
+ BACK_ITEM(MSG_MOTION);
+
+ #if BOTH(HAS_SOFTWARE_ENDSTOPS, SOFT_ENDSTOPS_MENU_ITEM)
+ EDIT_ITEM(bool, MSG_LCD_SOFT_ENDSTOPS, &soft_endstop._enabled);
+ #endif
+
+ // Move submenu for each axis
+ if (NONE(IS_KINEMATIC, NO_MOTION_BEFORE_HOMING) || all_axes_homed()) {
+ if (TERN1(DELTA, current_position.z <= delta_clip_start_height)) {
+ SUBMENU_N(X_AXIS, MSG_MOVE_N, []{ _menu_move_distance(X_AXIS, []{ lcd_move_axis(X_AXIS); }); });
+ #if HAS_Y_AXIS
+ SUBMENU_N(Y_AXIS, MSG_MOVE_N, []{ _menu_move_distance(Y_AXIS, []{ lcd_move_axis(Y_AXIS); }); });
+ #endif
+ }
+ else {
+ #if ENABLED(DELTA)
+ ACTION_ITEM(MSG_FREE_XY, []{ line_to_z(delta_clip_start_height); ui.synchronize(); });
+ #endif
+ }
+ #if HAS_Z_AXIS
+ #define _AXIS_MOVE(N) SUBMENU_N(N, MSG_MOVE_N, []{ _menu_move_distance(AxisEnum(N), []{ lcd_move_axis(AxisEnum(N)); }); });
+ REPEAT_S(2, NUM_AXES, _AXIS_MOVE);
+ #endif
+ }
+ else
+ GCODES_ITEM(MSG_AUTO_HOME, FPSTR(G28_STR));
+
+ #if ANY(SWITCHING_EXTRUDER, SWITCHING_NOZZLE, MAGNETIC_SWITCHING_TOOLHEAD)
+
+ #if EXTRUDERS >= 4
+ switch (active_extruder) {
+ case 0: GCODES_ITEM_N(1, MSG_SELECT_E, F("T1")); break;
+ case 1: GCODES_ITEM_N(0, MSG_SELECT_E, F("T0")); break;
+ case 2: GCODES_ITEM_N(3, MSG_SELECT_E, F("T3")); break;
+ case 3: GCODES_ITEM_N(2, MSG_SELECT_E, F("T2")); break;
+ #if EXTRUDERS == 6
+ case 4: GCODES_ITEM_N(5, MSG_SELECT_E, F("T5")); break;
+ case 5: GCODES_ITEM_N(4, MSG_SELECT_E, F("T4")); break;
+ #endif
+ }
+ #elif EXTRUDERS == 3
+ if (active_extruder < 2) {
+ if (active_extruder)
+ GCODES_ITEM_N(0, MSG_SELECT_E, F("T0"));
+ else
+ GCODES_ITEM_N(1, MSG_SELECT_E, F("T1"));
+ }
+ #else
+ if (active_extruder)
+ GCODES_ITEM_N(0, MSG_SELECT_E, F("T0"));
+ else
+ GCODES_ITEM_N(1, MSG_SELECT_E, F("T1"));
+ #endif
+
+ #elif ENABLED(DUAL_X_CARRIAGE)
+
+ if (active_extruder)
+ GCODES_ITEM_N(0, MSG_SELECT_E, F("T0"));
+ else
+ GCODES_ITEM_N(1, MSG_SELECT_E, F("T1"));
+
+ #endif
+
+ #if E_MANUAL
+
+ // The current extruder
+ SUBMENU(MSG_MOVE_E, _menu_move_distance_e_maybe);
+
+ #define SUBMENU_MOVE_E(N) SUBMENU_N(N, MSG_MOVE_EN, []{ _menu_move_distance(E_AXIS, []{ lcd_move_e(N); }, N); });
+
+ #if EITHER(SWITCHING_EXTRUDER, SWITCHING_NOZZLE)
+
+ // ...and the non-switching
+ #if E_MANUAL == 7 || E_MANUAL == 5 || E_MANUAL == 3
+ SUBMENU_MOVE_E(E_MANUAL - 1);
+ #endif
+
+ #elif MULTI_E_MANUAL
+
+ // Independent extruders with one E stepper per hotend
+ REPEAT(E_MANUAL, SUBMENU_MOVE_E);
+
+ #endif
+
+ #endif // E_MANUAL
+
+ END_MENU();
+}
+
+#define _HOME_ITEM(N) GCODES_ITEM_N(N##_AXIS, MSG_AUTO_HOME_A, F("G28" STR_##N));
+
+#if ENABLED(INDIVIDUAL_AXIS_HOMING_SUBMENU)
+ //
+ // "Motion" > "Homing" submenu
+ //
+ void menu_home() {
+ START_MENU();
+ BACK_ITEM(MSG_MOTION);
+
+ GCODES_ITEM(MSG_AUTO_HOME, FPSTR(G28_STR));
+ MAIN_AXIS_MAP(_HOME_ITEM);
+
+ END_MENU();
+ }
+#endif
+
+#if ENABLED(AUTO_BED_LEVELING_UBL)
+ void _lcd_ubl_level_bed();
+#elif ENABLED(LCD_BED_LEVELING)
+ void menu_bed_leveling();
+#endif
+
+#if ENABLED(ASSISTED_TRAMMING_WIZARD)
+ void goto_tramming_wizard();
+#endif
+
+void menu_motion() {
+ START_MENU();
+
+ //
+ // ^ Main
+ //
+ BACK_ITEM(MSG_MAIN);
+
+ //
+ // Move Axis
+ //
+ if (TERN1(DELTA, all_axes_homed()))
+ SUBMENU(MSG_MOVE_AXIS, menu_move);
+
+ //
+ // Auto Home
+ //
+ #if ENABLED(INDIVIDUAL_AXIS_HOMING_SUBMENU)
+ SUBMENU(MSG_HOMING, menu_home);
+ #else
+ GCODES_ITEM(MSG_AUTO_HOME, FPSTR(G28_STR));
+ #if ENABLED(INDIVIDUAL_AXIS_HOMING_MENU)
+ MAIN_AXIS_MAP(_HOME_ITEM);
+ #endif
+ #endif
+
+ //
+ // Auto-calibration
+ //
+ #if ENABLED(CALIBRATION_GCODE)
+ GCODES_ITEM(MSG_AUTO_CALIBRATE, F("G425"));
+ #endif
+
+ //
+ // Auto Z-Align
+ //
+ #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION)
+ GCODES_ITEM(MSG_AUTO_Z_ALIGN, F("G34"));
+ #endif
+
+ //
+ // Assisted Bed Tramming
+ //
+ #if ENABLED(ASSISTED_TRAMMING_WIZARD)
+ SUBMENU(MSG_TRAMMING_WIZARD, goto_tramming_wizard);
+ #endif
+
+ //
+ // Level Bed
+ //
+ #if ENABLED(AUTO_BED_LEVELING_UBL)
+
+ SUBMENU(MSG_UBL_LEVEL_BED, _lcd_ubl_level_bed);
+
+ #elif ENABLED(LCD_BED_LEVELING)
+
+ if (!g29_in_progress)
+ SUBMENU(MSG_BED_LEVELING, menu_bed_leveling);
+
+ #elif HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)
+
+ #if DISABLED(PROBE_MANUALLY)
+ GCODES_ITEM(MSG_LEVEL_BED, F("G29N"));
+ #endif
+
+ if (all_axes_homed() && leveling_is_valid()) {
+ bool show_state = planner.leveling_active;
+ EDIT_ITEM(bool, MSG_BED_LEVELING, &show_state, _lcd_toggle_bed_leveling);
+ }
+
+ #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
+ editable.decimal = planner.z_fade_height;
+ EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, []{ set_z_fade_height(editable.decimal); });
+ #endif
+
+ #endif
+
+ #if ENABLED(LCD_BED_TRAMMING) && DISABLED(LCD_BED_LEVELING)
+ SUBMENU(MSG_BED_TRAMMING, _lcd_level_bed_corners);
+ #endif
+
+ #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST)
+ GCODES_ITEM(MSG_M48_TEST, F("G28O\nM48 P10"));
+ #endif
+
+ //
+ // Disable Steppers
+ //
+ GCODES_ITEM(MSG_DISABLE_STEPPERS, F("M84"));
+
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU
diff --git a/src/lcd/menu/menu_password.cpp b/src/lcd/menu/menu_password.cpp
new file mode 100644
index 0000000..d29b773
--- /dev/null
+++ b/src/lcd/menu/menu_password.cpp
@@ -0,0 +1,187 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Advanced Settings Menus
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if BOTH(HAS_MARLINUI_MENU, PASSWORD_FEATURE)
+
+#include "../../feature/password/password.h"
+
+#include "menu_item.h"
+#include "menu_addon.h"
+
+void menu_advanced_settings();
+
+screenFunc_t success_screen, fail_screen;
+bool authenticating; // = false
+char string[(PASSWORD_LENGTH) + 1];
+static uint8_t digit_no;
+
+//
+// Screen for both editing and setting the password
+//
+void Password::menu_password_entry() {
+ ui.defer_status_screen(!did_first_run); // No timeout to status before first auth
+
+ START_MENU();
+
+ // "Login" or "New Code"
+ STATIC_ITEM_F(authenticating ? GET_TEXT_F(MSG_LOGIN_REQUIRED) : GET_TEXT_F(MSG_EDIT_PASSWORD), SS_CENTER|SS_INVERT);
+
+ STATIC_ITEM_F(FPSTR(NUL_STR), SS_CENTER, string);
+
+ #if HAS_MARLINUI_U8GLIB
+ STATIC_ITEM_F(FPSTR(NUL_STR), SS_CENTER, "");
+ #endif
+
+ // Make the digit edit item look like a sub-menu
+ FSTR_P const label = GET_TEXT_F(MSG_ENTER_DIGIT);
+ EDIT_ITEM_F(uint8, label, &editable.uint8, 0, 9, digit_entered);
+ MENU_ITEM_ADDON_START(utf8_strlen(label) + 1);
+ lcd_put_lchar(' ');
+ lcd_put_lchar('1' + digit_no);
+ SETCURSOR_X(LCD_WIDTH - 2);
+ lcd_put_lchar('>');
+ MENU_ITEM_ADDON_END();
+
+ ACTION_ITEM(MSG_START_OVER, start_over);
+
+ if (!authenticating) BACK_ITEM(MSG_BUTTON_CANCEL);
+
+ END_MENU();
+}
+
+//
+// Authentication check
+//
+void Password::authentication_done() {
+ ui.goto_screen(is_locked ? fail_screen : success_screen);
+ ui.completion_feedback(!is_locked);
+}
+
+// A single digit was completed
+void Password::digit_entered() {
+ uint32_t multiplier = CAT(1e, PASSWORD_LENGTH); // 1e5 = 100000
+ LOOP_LE_N(i, digit_no) multiplier /= 10;
+ value_entry += editable.uint8 * multiplier;
+ string[digit_no++] = '0' + editable.uint8;
+
+ // Exit edit screen menu and go to another screen
+ ui.goto_previous_screen();
+ ui.use_click();
+ ui.goto_screen(menu_password_entry);
+
+ // After password has been keyed in
+ if (digit_no == PASSWORD_LENGTH) {
+ if (authenticating)
+ authentication_check();
+ else
+ set_password_done();
+ }
+}
+
+//
+// Set/Change Password
+//
+void Password::screen_password_entry() {
+ value_entry = 0;
+ digit_no = 0;
+ editable.uint8 = 0;
+ memset(string, '_', PASSWORD_LENGTH);
+ string[PASSWORD_LENGTH] = '\0';
+ menu_password_entry();
+}
+
+void Password::screen_set_password() {
+ authenticating = false;
+ screen_password_entry();
+}
+
+void Password::authenticate_user(const screenFunc_t in_succ_scr, const screenFunc_t in_fail_scr) {
+ success_screen = in_succ_scr;
+ fail_screen = in_fail_scr;
+ if (is_set) {
+ authenticating = true;
+ ui.goto_screen(screen_password_entry);
+ ui.update();
+ }
+ else {
+ ui.goto_screen(in_succ_scr);
+ is_locked = false;
+ }
+}
+
+void Password::access_menu_password() {
+ authenticate_user(menu_password, menu_advanced_settings);
+}
+
+#if ENABLED(PASSWORD_ON_SD_PRINT_MENU)
+ void Password::media_gatekeeper() {
+ authenticate_user(menu_media, menu_main);
+ }
+#endif
+
+void Password::start_over() {
+ ui.goto_previous_screen(); // Goto previous screen, if any
+ ui.goto_screen(screen_password_entry);
+}
+
+void Password::menu_password_report() {
+ START_SCREEN();
+ BACK_ITEM(MSG_PASSWORD_SETTINGS);
+ STATIC_ITEM(MSG_PASSWORD_SET, SS_LEFT, string);
+ STATIC_ITEM(MSG_REMINDER_SAVE_SETTINGS, SS_LEFT);
+ END_SCREEN();
+}
+
+void Password::set_password_done(const bool with_set/*=true*/) {
+ is_set = with_set;
+ value = value_entry;
+ ui.completion_feedback(true);
+ ui.goto_screen(menu_password_report);
+}
+
+void Password::remove_password() {
+ string[0] = '0';
+ string[1] = '\0';
+ set_password_done(false);
+}
+
+//
+// Password Menu
+//
+void Password::menu_password() {
+ START_MENU();
+ BACK_ITEM(MSG_ADVANCED_SETTINGS);
+ SUBMENU(MSG_CHANGE_PASSWORD, screen_set_password);
+ ACTION_ITEM(MSG_REMOVE_PASSWORD, []{ ui.push_current_screen(); remove_password(); } );
+ #if ENABLED(EEPROM_SETTINGS)
+ ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings);
+ #endif
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU && PASSWORD_FEATURE
diff --git a/src/lcd/menu/menu_power_monitor.cpp b/src/lcd/menu/menu_power_monitor.cpp
new file mode 100644
index 0000000..3cd9909
--- /dev/null
+++ b/src/lcd/menu/menu_power_monitor.cpp
@@ -0,0 +1,62 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Power Monitor Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if HAS_MARLINUI_MENU && HAS_POWER_MONITOR
+
+#include "menu_item.h"
+#include "../../feature/power_monitor.h"
+
+void menu_power_monitor() {
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ #if ENABLED(POWER_MONITOR_CURRENT)
+ {
+ bool ena = power_monitor.current_display_enabled();
+ EDIT_ITEM(bool, MSG_CURRENT, &ena, power_monitor.toggle_current_display);
+ }
+ #endif
+
+ #if ENABLED(POWER_MONITOR_VOLTAGE)
+ {
+ bool ena = power_monitor.voltage_display_enabled();
+ EDIT_ITEM(bool, MSG_VOLTAGE, &ena, power_monitor.toggle_voltage_display);
+ }
+ #endif
+
+ #if HAS_POWER_MONITOR_WATTS
+ {
+ bool ena = power_monitor.power_display_enabled();
+ EDIT_ITEM(bool, MSG_POWER, &ena, power_monitor.toggle_power_display);
+ }
+ #endif
+
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU && HAS_POWER_MONITOR
diff --git a/src/lcd/menu/menu_probe_offset.cpp b/src/lcd/menu/menu_probe_offset.cpp
new file mode 100644
index 0000000..c7cbeba
--- /dev/null
+++ b/src/lcd/menu/menu_probe_offset.cpp
@@ -0,0 +1,164 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Calibrate Probe offset menu.
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if ENABLED(PROBE_OFFSET_WIZARD)
+
+#include "menu_item.h"
+#include "menu_addon.h"
+#include "../../gcode/queue.h"
+#include "../../module/motion.h"
+#include "../../module/planner.h"
+#include "../../module/probe.h"
+
+#if HAS_LEVELING
+ #include "../../feature/bedlevel/bedlevel.h"
+#endif
+
+void _goto_manual_move_z(const_float_t);
+
+// Global storage
+float z_offset_backup, calculated_z_offset, z_offset_ref;
+
+inline void z_clearance_move() {
+ do_z_clearance(Z_POST_CLEARANCE);
+}
+
+void set_offset_and_go_back(const_float_t z) {
+ probe.offset.z = z;
+ SET_SOFT_ENDSTOP_LOOSE(false);
+ TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active));
+ ui.goto_previous_screen_no_defer();
+}
+
+void probe_offset_wizard_menu() {
+ START_MENU();
+ calculated_z_offset = probe.offset.z + current_position.z - z_offset_ref;
+
+ if (LCD_HEIGHT >= 4)
+ STATIC_ITEM(MSG_MOVE_NOZZLE_TO_BED, SS_CENTER|SS_INVERT);
+
+ STATIC_ITEM_F(F("Z"), SS_CENTER, ftostr42_52(current_position.z));
+ STATIC_ITEM(MSG_ZPROBE_ZOFFSET, SS_LEFT, ftostr42_52(calculated_z_offset));
+
+ SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move_z( 1); });
+ SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move_z( 0.1f); });
+
+ if ((FINE_MANUAL_MOVE) > 0.0f && (FINE_MANUAL_MOVE) < 0.1f)
+ SUBMENU_f(F(STRINGIFY(FINE_MANUAL_MOVE)), MSG_MOVE_N_MM, []{ _goto_manual_move_z(float(FINE_MANUAL_MOVE)); });
+
+ ACTION_ITEM(MSG_BUTTON_DONE, []{
+ set_offset_and_go_back(calculated_z_offset);
+ current_position.z = z_offset_ref; // Set Z to z_offset_ref, as we can expect it is at probe height
+ sync_plan_position();
+ z_clearance_move(); // Raise Z as if it was homed
+ });
+
+ ACTION_ITEM(MSG_BUTTON_CANCEL, []{
+ set_offset_and_go_back(z_offset_backup);
+ // If wizard-homing was done by probe with PROBE_OFFSET_WIZARD_START_Z
+ #if HOMING_Z_WITH_PROBE && defined(PROBE_OFFSET_WIZARD_START_Z)
+ set_axis_never_homed(Z_AXIS); // On cancel the Z position needs correction
+ queue.inject(F("G28Z"));
+ #else // Otherwise do a Z clearance move like after Homing
+ z_clearance_move();
+ #endif
+ });
+
+ END_MENU();
+}
+
+void prepare_for_probe_offset_wizard() {
+ #if defined(PROBE_OFFSET_WIZARD_XY_POS) || !HOMING_Z_WITH_PROBE
+ if (ui.should_draw()) MenuItem_static::draw(1, GET_TEXT_F(MSG_PROBE_WIZARD_PROBING));
+
+ if (ui.wait_for_move) return;
+
+ #ifndef PROBE_OFFSET_WIZARD_XY_POS
+ #define PROBE_OFFSET_WIZARD_XY_POS XY_CENTER
+ #endif
+ // Get X and Y from configuration, or use center
+ constexpr xy_pos_t wizard_pos = PROBE_OFFSET_WIZARD_XY_POS;
+
+ // Probe for Z reference
+ ui.wait_for_move = true;
+ z_offset_ref = probe.probe_at_point(wizard_pos, PROBE_PT_RAISE, 0, true);
+ ui.wait_for_move = false;
+
+ // Stow the probe, as the last call to probe.probe_at_point(...) left
+ // the probe deployed if it was successful.
+ probe.stow();
+ #else
+ if (ui.wait_for_move) return;
+ #endif
+
+ // Move Nozzle to Probing/Homing Position
+ ui.wait_for_move = true;
+ current_position += probe.offset_xy;
+ line_to_current_position(MMM_TO_MMS(XY_PROBE_FEEDRATE));
+ ui.synchronize(GET_TEXT_F(MSG_PROBE_WIZARD_MOVING));
+ ui.wait_for_move = false;
+
+ SET_SOFT_ENDSTOP_LOOSE(true); // Disable soft endstops for free Z movement
+
+ // Go to Calibration Menu
+ ui.goto_screen(probe_offset_wizard_menu);
+ ui.defer_status_screen();
+}
+
+void goto_probe_offset_wizard() {
+ ui.defer_status_screen();
+ set_all_unhomed();
+
+ // Store probe.offset.z for Case: Cancel
+ z_offset_backup = probe.offset.z;
+
+ #ifdef PROBE_OFFSET_WIZARD_START_Z
+ probe.offset.z = PROBE_OFFSET_WIZARD_START_Z;
+ #endif
+
+ // Store Bed-Leveling-State and disable
+ #if HAS_LEVELING
+ leveling_was_active = planner.leveling_active;
+ set_bed_leveling_enabled(false);
+ #endif
+
+ // Home all axes
+ queue.inject_P(G28_STR);
+
+ ui.goto_screen([]{
+ _lcd_draw_homing();
+ if (all_axes_homed()) {
+ z_offset_ref = 0; // Set Z Value for Wizard Position to 0
+ ui.goto_screen(prepare_for_probe_offset_wizard);
+ ui.defer_status_screen();
+ }
+ });
+
+}
+
+#endif // PROBE_OFFSET_WIZARD
diff --git a/src/lcd/menu/menu_spindle_laser.cpp b/src/lcd/menu/menu_spindle_laser.cpp
new file mode 100644
index 0000000..bef86a6
--- /dev/null
+++ b/src/lcd/menu/menu_spindle_laser.cpp
@@ -0,0 +1,88 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Spindle / Laser Menu
+//
+
+#include "../../inc/MarlinConfig.h"
+
+#if HAS_MARLINUI_MENU && HAS_CUTTER
+
+ #include "menu_item.h"
+
+ #include "../../feature/spindle_laser.h"
+
+ void menu_spindle_laser() {
+ bool is_enabled = cutter.enabled();
+ #if ENABLED(SPINDLE_CHANGE_DIR)
+ bool is_rev = cutter.is_reverse();
+ #endif
+
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
+ // Change the cutter's "current power" value without turning the cutter on or off
+ // Power is displayed and set in units and range according to CUTTER_POWER_UNIT
+ EDIT_ITEM_FAST(CUTTER_MENU_POWER_TYPE, MSG_CUTTER(POWER), &cutter.menuPower,
+ cutter.mpower_min(), cutter.mpower_max(), cutter.update_from_mpower);
+ #endif
+
+ editable.state = is_enabled;
+ EDIT_ITEM(bool, MSG_CUTTER(TOGGLE), &is_enabled, []{
+ #if ENABLED(SPINDLE_FEATURE)
+ if (editable.state) cutter.disable(); else cutter.enable_same_dir();
+ #else
+ cutter.laser_menu_toggle(!editable.state);
+ #endif
+ });
+
+ #if ENABLED(AIR_EVACUATION)
+ bool evac_state = cutter.air_evac_state();
+ EDIT_ITEM(bool, MSG_CUTTER(EVAC_TOGGLE), &evac_state, cutter.air_evac_toggle);
+ #endif
+
+ #if ENABLED(AIR_ASSIST)
+ bool air_assist_state = cutter.air_assist_state();
+ EDIT_ITEM(bool, MSG_CUTTER(ASSIST_TOGGLE), &air_assist_state, cutter.air_assist_toggle);
+ #endif
+
+ #if ENABLED(SPINDLE_CHANGE_DIR)
+ if (!is_enabled) {
+ editable.state = is_rev;
+ ACTION_ITEM_F(is_rev ? GET_TEXT_F(MSG_CUTTER(REVERSE)) : GET_TEXT_F(MSG_CUTTER(FORWARD)), []{ cutter.set_reverse(!editable.state); });
+ }
+ #endif
+
+ #if ENABLED(LASER_FEATURE)
+ // Setup and fire a test pulse using the current PWM power level for for a duration of test_pulse_min to test_pulse_max ms.
+ EDIT_ITEM_FAST(CUTTER_MENU_PULSE_TYPE, MSG_LASER_PULSE_MS, &cutter.testPulse, LASER_TEST_PULSE_MIN, LASER_TEST_PULSE_MAX);
+ ACTION_ITEM(MSG_LASER_FIRE_PULSE, cutter.test_fire_pulse);
+ #if ENABLED(HAL_CAN_SET_PWM_FREQ) && SPINDLE_LASER_FREQUENCY
+ EDIT_ITEM_FAST(CUTTER_MENU_FREQUENCY_TYPE, MSG_CUTTER_FREQUENCY, &cutter.frequency, 2000, 80000, cutter.refresh_frequency);
+ #endif
+ #endif
+ END_MENU();
+ }
+
+#endif // HAS_MARLINUI_MENU && HAS_CUTTER
diff --git a/src/lcd/menu/menu_temperature.cpp b/src/lcd/menu/menu_temperature.cpp
new file mode 100644
index 0000000..2e5b8f1
--- /dev/null
+++ b/src/lcd/menu/menu_temperature.cpp
@@ -0,0 +1,310 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Temperature Menu
+//
+
+#include "../../inc/MarlinConfig.h"
+
+#if HAS_MARLINUI_MENU && HAS_TEMPERATURE
+
+#include "menu_item.h"
+#include "../../module/temperature.h"
+
+#if HAS_FAN || ENABLED(SINGLENOZZLE)
+ #include "../../module/motion.h"
+#endif
+
+#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER)
+ #include "../../feature/cooler.h"
+#endif
+
+#if ENABLED(SINGLENOZZLE_STANDBY_TEMP)
+ #include "../../module/tool_change.h"
+#endif
+
+//
+// "Temperature" submenu items
+//
+
+#if HAS_PREHEAT
+
+ void Temperature::lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb) {
+ UNUSED(e); UNUSED(indh); UNUSED(indb);
+ #if HAS_HOTEND
+ if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0)
+ setTargetHotend(_MIN(thermalManager.hotend_max_target(e), ui.material_preset[indh].hotend_temp), e);
+ #endif
+ #if HAS_HEATED_BED
+ if (indb >= 0 && ui.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp);
+ #endif
+ #if HAS_FAN
+ if (indh >= 0) {
+ const uint8_t fan_index = active_extruder < (FAN_COUNT) ? active_extruder : 0;
+ if (true
+ #if REDUNDANT_PART_COOLING_FAN
+ && fan_index != REDUNDANT_PART_COOLING_FAN
+ #endif
+ ) set_fan_speed(fan_index, ui.material_preset[indh].fan_speed);
+ }
+ #endif
+ ui.return_to_status();
+ }
+
+ #if HAS_TEMP_HOTEND
+ inline void _preheat_end(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); }
+ void do_preheat_end_m() { _preheat_end(editable.int8, 0); }
+ #endif
+ #if HAS_HEATED_BED
+ inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(0, -1, m); }
+ #endif
+ #if HAS_COOLER
+ inline void _precool_laser(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); }
+ void do_precool_laser_m() { _precool_laser(editable.int8, thermalManager.temp_cooler.target); }
+ #endif
+
+ #if HAS_TEMP_HOTEND && HAS_HEATED_BED
+ inline void _preheat_both(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, m); }
+
+ // Indexed "Preheat ABC" and "Heat Bed" items
+ #define PREHEAT_ITEMS(M,E) do{ \
+ ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_both(M, MenuItemBase::itemIndex); }); \
+ ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_END_E, []{ _preheat_end(M, MenuItemBase::itemIndex); }); \
+ }while(0)
+
+ #elif HAS_MULTI_HOTEND
+
+ // No heated bed, so just indexed "Preheat ABC" items
+ #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_end(M, MenuItemBase::itemIndex); })
+
+ #endif
+
+ #if HAS_MULTI_HOTEND || HAS_HEATED_BED
+
+ // Set editable.int8 to the Material index before entering this menu
+ // because MenuItemBase::itemIndex will be re-used by PREHEAT_ITEMS
+ void menu_preheat_m() {
+ const uint8_t m = editable.int8; // Don't re-use 'editable' in this menu
+
+ START_MENU();
+ BACK_ITEM(MSG_TEMPERATURE);
+
+ #if HOTENDS == 1
+
+ #if HAS_HEATED_BED
+ ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_both(editable.int8, 0); });
+ ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_END, do_preheat_end_m);
+ #else
+ ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m);
+ #endif
+
+ #elif HAS_MULTI_HOTEND
+
+ HOTEND_LOOP() PREHEAT_ITEMS(editable.int8, e);
+ ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_ALL, []() {
+ const celsius_t t = ui.material_preset[editable.int8].hotend_temp;
+ HOTEND_LOOP() thermalManager.setTargetHotend(t, e);
+ TERN(HAS_HEATED_BED, _preheat_bed(editable.int8), ui.return_to_status());
+ });
+
+ #endif
+
+ #if HAS_HEATED_BED
+ ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_BEDONLY, []{ _preheat_bed(editable.int8); });
+ #endif
+
+ END_MENU();
+ }
+
+ #endif // HAS_MULTI_HOTEND || HAS_HEATED_BED
+
+#endif // HAS_PREHEAT
+
+#if HAS_TEMP_HOTEND || HAS_HEATED_BED
+
+ void lcd_cooldown() {
+ thermalManager.cooldown();
+ ui.return_to_status();
+ }
+
+#endif // HAS_TEMP_HOTEND || HAS_HEATED_BED
+
+void menu_temperature() {
+ #if HAS_TEMP_HOTEND || HAS_HEATED_BED
+ bool has_heat = false;
+ #if HAS_TEMP_HOTEND
+ HOTEND_LOOP() if (thermalManager.degTargetHotend(HOTEND_INDEX)) { has_heat = true; break; }
+ #endif
+ #endif
+
+ #if HAS_COOLER
+ if (thermalManager.temp_cooler.target == 0) thermalManager.temp_cooler.target = COOLER_DEFAULT_TEMP;
+ #endif
+
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ //
+ // Nozzle:
+ // Nozzle [1-5]:
+ //
+ #if HOTENDS == 1
+ editable.celsius = thermalManager.temp_hotend[0].target;
+ EDIT_ITEM_FAST(int3, MSG_NOZZLE, &editable.celsius, 0, thermalManager.hotend_max_target(0), []{ thermalManager.setTargetHotend(editable.celsius, 0); });
+ #elif HAS_MULTI_HOTEND
+ HOTEND_LOOP() {
+ editable.celsius = thermalManager.temp_hotend[e].target;
+ EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &editable.celsius, 0, thermalManager.hotend_max_target(e), []{ thermalManager.setTargetHotend(editable.celsius, MenuItemBase::itemIndex); });
+ }
+ #endif
+
+ #if ENABLED(SINGLENOZZLE_STANDBY_TEMP)
+ LOOP_S_L_N(e, 1, EXTRUDERS)
+ EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.hotend_max_target(0));
+ #endif
+
+ //
+ // Bed:
+ //
+ #if HAS_HEATED_BED
+ EDIT_ITEM_FAST(int3, MSG_BED, &thermalManager.temp_bed.target, 0, BED_MAX_TARGET, thermalManager.start_watching_bed);
+ #endif
+
+ //
+ // Chamber:
+ //
+ #if HAS_HEATED_CHAMBER
+ EDIT_ITEM_FAST(int3, MSG_CHAMBER, &thermalManager.temp_chamber.target, 0, CHAMBER_MAX_TARGET, thermalManager.start_watching_chamber);
+ #endif
+
+ //
+ // Cooler:
+ //
+ #if HAS_COOLER
+ bool cstate = cooler.enabled;
+ EDIT_ITEM(bool, MSG_COOLER_TOGGLE, &cstate, cooler.toggle);
+ EDIT_ITEM_FAST(int3, MSG_COOLER, &thermalManager.temp_cooler.target, COOLER_MIN_TARGET, COOLER_MAX_TARGET, thermalManager.start_watching_cooler);
+ #endif
+
+ //
+ // Flow Meter Safety Shutdown:
+ //
+ #if ENABLED(FLOWMETER_SAFETY)
+ bool fstate = cooler.flowsafety_enabled;
+ EDIT_ITEM(bool, MSG_FLOWMETER_SAFETY, &fstate, cooler.flowsafety_toggle);
+ #endif
+
+ //
+ // Fan Speed:
+ //
+ #if HAS_FAN
+
+ DEFINE_SINGLENOZZLE_ITEM();
+
+ #if HAS_FAN0
+ _FAN_EDIT_ITEMS(0,FIRST_FAN_SPEED);
+ #endif
+ #if HAS_FAN1 && REDUNDANT_PART_COOLING_FAN != 1
+ FAN_EDIT_ITEMS(1);
+ #elif SNFAN(1)
+ singlenozzle_item(1);
+ #endif
+ #if HAS_FAN2 && REDUNDANT_PART_COOLING_FAN != 2
+ FAN_EDIT_ITEMS(2);
+ #elif SNFAN(2)
+ singlenozzle_item(2);
+ #endif
+ #if HAS_FAN3 && REDUNDANT_PART_COOLING_FAN != 3
+ FAN_EDIT_ITEMS(3);
+ #elif SNFAN(3)
+ singlenozzle_item(3);
+ #endif
+ #if HAS_FAN4 && REDUNDANT_PART_COOLING_FAN != 4
+ FAN_EDIT_ITEMS(4);
+ #elif SNFAN(4)
+ singlenozzle_item(4);
+ #endif
+ #if HAS_FAN5 && REDUNDANT_PART_COOLING_FAN != 5
+ FAN_EDIT_ITEMS(5);
+ #elif SNFAN(5)
+ singlenozzle_item(5);
+ #endif
+ #if HAS_FAN6 && REDUNDANT_PART_COOLING_FAN != 6
+ FAN_EDIT_ITEMS(6);
+ #elif SNFAN(6)
+ singlenozzle_item(6);
+ #endif
+ #if HAS_FAN7 && REDUNDANT_PART_COOLING_FAN != 7
+ FAN_EDIT_ITEMS(7);
+ #elif SNFAN(7)
+ singlenozzle_item(7);
+ #endif
+
+ #endif // HAS_FAN
+
+ #if HAS_PREHEAT
+ //
+ // Preheat for all Materials
+ //
+ LOOP_L_N(m, PREHEAT_COUNT) {
+ editable.int8 = m;
+ #if HAS_MULTI_HOTEND || HAS_HEATED_BED
+ SUBMENU_f(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m);
+ #elif HAS_HOTEND
+ ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m);
+ #endif
+ }
+ #endif
+
+ #if HAS_TEMP_HOTEND || HAS_HEATED_BED
+ //
+ // Cooldown
+ //
+ if (TERN0(HAS_HEATED_BED, thermalManager.degTargetBed())) has_heat = true;
+ if (has_heat) ACTION_ITEM(MSG_COOLDOWN, lcd_cooldown);
+ #endif
+
+ END_MENU();
+}
+
+#if ENABLED(PREHEAT_SHORTCUT_MENU_ITEM)
+
+ void menu_preheat_only() {
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ LOOP_L_N(m, PREHEAT_COUNT) {
+ editable.int8 = m;
+ #if HAS_MULTI_HOTEND || HAS_HEATED_BED
+ SUBMENU_f(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m);
+ #else
+ ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m);
+ #endif
+ }
+
+ END_MENU();
+ }
+
+#endif
+
+#endif // HAS_MARLINUI_MENU && HAS_TEMPERATURE
diff --git a/src/lcd/menu/menu_tmc.cpp b/src/lcd/menu/menu_tmc.cpp
new file mode 100644
index 0000000..00d77d1
--- /dev/null
+++ b/src/lcd/menu/menu_tmc.cpp
@@ -0,0 +1,181 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// TMC Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if HAS_MARLINUI_MENU && HAS_TRINAMIC_CONFIG
+
+#include "menu_item.h"
+#include "../../module/stepper/indirection.h"
+#include "../../feature/tmc_util.h"
+
+#define TMC_EDIT_STORED_I_RMS(ST,STR) EDIT_ITEM_F(uint16_4, F(STR), &stepper##ST.val_mA, 100, 3000, []{ stepper##ST.refresh_stepper_current(); })
+
+void menu_tmc_current() {
+ START_MENU();
+ BACK_ITEM(MSG_TMC_DRIVERS);
+ #if AXIS_IS_TMC(X)
+ TMC_EDIT_STORED_I_RMS(X, STR_A);
+ #endif
+ #if AXIS_IS_TMC(Y)
+ TMC_EDIT_STORED_I_RMS(Y, STR_B);
+ #endif
+ #if AXIS_IS_TMC(Z)
+ TMC_EDIT_STORED_I_RMS(Z, STR_C);
+ #endif
+ #if AXIS_IS_TMC(X2)
+ TMC_EDIT_STORED_I_RMS(X2, STR_X2);
+ #endif
+ #if AXIS_IS_TMC(Y2)
+ TMC_EDIT_STORED_I_RMS(Y2, STR_Y2);
+ #endif
+ #if AXIS_IS_TMC(Z2)
+ TMC_EDIT_STORED_I_RMS(Z2, STR_Z2);
+ #endif
+ #if AXIS_IS_TMC(Z3)
+ TMC_EDIT_STORED_I_RMS(Z3, STR_Z3);
+ #endif
+ #if AXIS_IS_TMC(Z4)
+ TMC_EDIT_STORED_I_RMS(Z4, STR_Z4);
+ #endif
+ #if AXIS_IS_TMC(E0)
+ TMC_EDIT_STORED_I_RMS(E0, STR_E0);
+ #endif
+ #if AXIS_IS_TMC(E1)
+ TMC_EDIT_STORED_I_RMS(E1, STR_E1);
+ #endif
+ #if AXIS_IS_TMC(E2)
+ TMC_EDIT_STORED_I_RMS(E2, STR_E2);
+ #endif
+ #if AXIS_IS_TMC(E3)
+ TMC_EDIT_STORED_I_RMS(E3, STR_E3);
+ #endif
+ #if AXIS_IS_TMC(E4)
+ TMC_EDIT_STORED_I_RMS(E4, STR_E4);
+ #endif
+ #if AXIS_IS_TMC(E5)
+ TMC_EDIT_STORED_I_RMS(E5, STR_E5);
+ #endif
+ #if AXIS_IS_TMC(E6)
+ TMC_EDIT_STORED_I_RMS(E6, STR_E6);
+ #endif
+ #if AXIS_IS_TMC(E7)
+ TMC_EDIT_STORED_I_RMS(E7, STR_E7);
+ #endif
+ END_MENU();
+}
+
+#if ENABLED(HYBRID_THRESHOLD)
+
+ #define TMC_EDIT_STORED_HYBRID_THRS(ST, STR) EDIT_ITEM_F(uint8, F(STR), &stepper##ST.stored.hybrid_thrs, 0, 255, []{ stepper##ST.refresh_hybrid_thrs(); });
+
+ void menu_tmc_hybrid_thrs() {
+ START_MENU();
+ BACK_ITEM(MSG_TMC_DRIVERS);
+ TERN_(X_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(X, STR_X));
+ TERN_(Y_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Y, STR_Y));
+ TERN_(Z_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z, STR_Z));
+ TERN_(X2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(X2, STR_X2));
+ TERN_(Y2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Y2, STR_Y2));
+ TERN_(Z2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z2, STR_Z2));
+ TERN_(Z3_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z3, STR_Z3));
+ TERN_(Z4_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z4, STR_Z4));
+ TERN_(E0_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(E0, STR_E0));
+ TERN_(E1_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(E1, STR_E1));
+ TERN_(E2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(E2, STR_E2));
+ TERN_(E3_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(E3, STR_E3));
+ TERN_(E4_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(E4, STR_E4));
+ TERN_(E5_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(E5, STR_E5));
+ TERN_(E6_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(E6, STR_E6));
+ TERN_(E7_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(E7, STR_E7));
+ END_MENU();
+ }
+
+#endif
+
+#if ENABLED(SENSORLESS_HOMING)
+
+ #define TMC_EDIT_STORED_SGT(ST) EDIT_ITEM_F(int4, F(STR_##ST), &stepper##ST.stored.homing_thrs, stepper##ST.sgt_min, stepper##ST.sgt_max, []{ stepper##ST.refresh_homing_thrs(); });
+
+ void menu_tmc_homing_thrs() {
+ START_MENU();
+ BACK_ITEM(MSG_TMC_DRIVERS);
+ TERN_( X_SENSORLESS, TMC_EDIT_STORED_SGT(X));
+ TERN_(X2_SENSORLESS, TMC_EDIT_STORED_SGT(X2));
+ TERN_( Y_SENSORLESS, TMC_EDIT_STORED_SGT(Y));
+ TERN_(Y2_SENSORLESS, TMC_EDIT_STORED_SGT(Y2));
+ TERN_( Z_SENSORLESS, TMC_EDIT_STORED_SGT(Z));
+ TERN_(Z2_SENSORLESS, TMC_EDIT_STORED_SGT(Z2));
+ TERN_(Z3_SENSORLESS, TMC_EDIT_STORED_SGT(Z3));
+ TERN_(Z4_SENSORLESS, TMC_EDIT_STORED_SGT(Z4));
+ TERN_( I_SENSORLESS, TMC_EDIT_STORED_SGT(I));
+ TERN_( J_SENSORLESS, TMC_EDIT_STORED_SGT(J));
+ TERN_( K_SENSORLESS, TMC_EDIT_STORED_SGT(K));
+ END_MENU();
+ }
+
+#endif
+
+#if HAS_STEALTHCHOP
+
+ #define TMC_EDIT_STEP_MODE(ST, STR) EDIT_ITEM_F(bool, F(STR), &stepper##ST.stored.stealthChop_enabled, []{ stepper##ST.refresh_stepping_mode(); })
+
+ void menu_tmc_step_mode() {
+ START_MENU();
+ STATIC_ITEM(MSG_TMC_STEALTH_ENABLED);
+ BACK_ITEM(MSG_TMC_DRIVERS);
+ TERN_( X_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(X, STR_X));
+ TERN_(X2_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(X2, STR_X2));
+ TERN_( Y_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(Y, STR_Y));
+ TERN_(Y2_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(Y2, STR_Y2));
+ TERN_( Z_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(Z, STR_Z));
+ TERN_(Z2_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(Z2, STR_Z2));
+ TERN_(Z3_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(Z3, STR_Z3));
+ TERN_(Z4_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(Z4, STR_Z4));
+ TERN_(E0_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(E0, STR_E0));
+ TERN_(E1_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(E1, STR_E1));
+ TERN_(E2_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(E2, STR_E2));
+ TERN_(E3_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(E3, STR_E3));
+ TERN_(E4_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(E4, STR_E4));
+ TERN_(E5_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(E5, STR_E5));
+ TERN_(E6_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(E6, STR_E6));
+ TERN_(E7_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(E7, STR_E7));
+ END_MENU();
+ }
+
+#endif
+
+void menu_tmc() {
+ START_MENU();
+ BACK_ITEM(MSG_ADVANCED_SETTINGS);
+ SUBMENU(MSG_TMC_CURRENT, menu_tmc_current);
+ TERN_(HYBRID_THRESHOLD, SUBMENU(MSG_TMC_HYBRID_THRS, menu_tmc_hybrid_thrs));
+ TERN_(SENSORLESS_HOMING, SUBMENU(MSG_TMC_HOMING_THRS, menu_tmc_homing_thrs));
+ TERN_(HAS_STEALTHCHOP, SUBMENU(MSG_TMC_STEPPING_MODE, menu_tmc_step_mode));
+ END_MENU();
+}
+
+#endif // HAS_TRINAMIC_CONFIG
diff --git a/src/lcd/menu/menu_touch_screen.cpp b/src/lcd/menu/menu_touch_screen.cpp
new file mode 100644
index 0000000..130308d
--- /dev/null
+++ b/src/lcd/menu/menu_touch_screen.cpp
@@ -0,0 +1,36 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if BOTH(HAS_MARLINUI_MENU, TOUCH_SCREEN_CALIBRATION)
+
+#include "menu_item.h"
+#include "../marlinui.h"
+
+void touch_screen_calibration() {
+
+ ui.touch_calibration_screen();
+
+}
+
+#endif // TOUCH_SCREEN_CALIBRATION
diff --git a/src/lcd/menu/menu_tramming.cpp b/src/lcd/menu/menu_tramming.cpp
new file mode 100644
index 0000000..1dd8a1c
--- /dev/null
+++ b/src/lcd/menu/menu_tramming.cpp
@@ -0,0 +1,115 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Bed Tramming Wizard
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if BOTH(HAS_MARLINUI_MENU, ASSISTED_TRAMMING_WIZARD)
+
+#include "menu_item.h"
+
+#include "../../feature/tramming.h"
+
+#include "../../module/motion.h"
+#include "../../module/probe.h"
+#include "../../gcode/queue.h"
+
+#if ENABLED(BLTOUCH)
+ #include "../../feature/bltouch.h"
+#endif
+
+//#define DEBUG_OUT 1
+#include "../../core/debug_out.h"
+
+static float z_measured[G35_PROBE_COUNT];
+static Flags z_isvalid;
+static uint8_t tram_index = 0;
+static int8_t reference_index; // = 0
+
+#if HAS_LEVELING
+ #include "../../feature/bedlevel/bedlevel.h"
+#endif
+
+static bool probe_single_point() {
+ do_blocking_move_to_z(TERN(BLTOUCH, Z_CLEARANCE_DEPLOY_PROBE, Z_CLEARANCE_BETWEEN_PROBES));
+ // Stow after each point with BLTouch "HIGH SPEED" mode for push-pin safety
+ const float z_probed_height = probe.probe_at_point(tramming_points[tram_index], TERN0(BLTOUCH, bltouch.high_speed_mode) ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, true);
+ z_measured[tram_index] = z_probed_height;
+ if (reference_index < 0) reference_index = tram_index;
+ move_to_tramming_wait_pos();
+
+ DEBUG_ECHOLNPGM("probe_single_point(", tram_index, ") = ", z_probed_height, "mm");
+
+ const bool v = !isnan(z_probed_height);
+ z_isvalid.set(tram_index, v);
+ return v;
+}
+
+static void _menu_single_probe() {
+ DEBUG_ECHOLNPGM("Screen: single probe screen Arg:", tram_index);
+ START_MENU();
+ STATIC_ITEM(MSG_BED_TRAMMING, SS_LEFT);
+ STATIC_ITEM(MSG_LAST_VALUE_SP, SS_LEFT, z_isvalid[tram_index] ? ftostr42_52(z_measured[reference_index] - z_measured[tram_index]) : "---");
+ ACTION_ITEM(MSG_UBL_BC_INSERT2, []{ if (probe_single_point()) ui.refresh(); });
+ ACTION_ITEM(MSG_BUTTON_DONE, ui.goto_previous_screen);
+ END_MENU();
+}
+
+static void tramming_wizard_menu() {
+ START_MENU();
+ STATIC_ITEM(MSG_SELECT_ORIGIN);
+
+ // Draw a menu item for each tramming point
+ for (tram_index = 0; tram_index < G35_PROBE_COUNT; tram_index++)
+ SUBMENU_F(FPSTR(pgm_read_ptr(&tramming_point_name[tram_index])), _menu_single_probe);
+
+ ACTION_ITEM(MSG_BUTTON_DONE, []{
+ probe.stow(); // Stow before exiting Tramming Wizard
+ ui.goto_previous_screen_no_defer();
+ });
+ END_MENU();
+}
+
+// Init the wizard and enter the submenu
+void goto_tramming_wizard() {
+ DEBUG_ECHOLNPGM("Screen: goto_tramming_wizard", 1);
+ ui.defer_status_screen();
+
+ // Initialize measured point flags
+ z_isvalid.reset();
+ reference_index = -1;
+
+ // Inject G28, wait for homing to complete,
+ set_all_unhomed();
+ queue.inject(TERN(CAN_SET_LEVELING_AFTER_G28, F("G28L0"), FPSTR(G28_STR)));
+
+ ui.goto_screen([]{
+ _lcd_draw_homing();
+ if (all_axes_homed())
+ ui.goto_screen(tramming_wizard_menu);
+ });
+}
+
+#endif // HAS_MARLINUI_MENU && ASSISTED_TRAMMING_WIZARD
diff --git a/src/lcd/menu/menu_tune.cpp b/src/lcd/menu/menu_tune.cpp
new file mode 100644
index 0000000..bc52001
--- /dev/null
+++ b/src/lcd/menu/menu_tune.cpp
@@ -0,0 +1,241 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Tune Menu
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if HAS_MARLINUI_MENU
+
+#include "menu_item.h"
+#include "../../module/motion.h"
+#include "../../module/planner.h"
+#include "../../module/temperature.h"
+#include "../../MarlinCore.h"
+
+#if ENABLED(SINGLENOZZLE_STANDBY_TEMP)
+ #include "../../module/tool_change.h"
+#endif
+
+#if HAS_LEVELING
+ #include "../../feature/bedlevel/bedlevel.h"
+#endif
+
+#if ENABLED(BABYSTEPPING)
+
+ #include "../../feature/babystep.h"
+ #include "../lcdprint.h"
+ #if HAS_MARLINUI_U8GLIB
+ #include "../dogm/marlinui_DOGM.h"
+ #endif
+
+ // TODO: Replace fmsg with MSG_BABYSTEP_N and index substitution
+
+ void _lcd_babystep(const AxisEnum axis, FSTR_P const fmsg) {
+ if (ui.use_click()) return ui.goto_previous_screen_no_defer();
+ if (ui.encoderPosition) {
+ const int16_t steps = int16_t(ui.encoderPosition) * (
+ #if ENABLED(BABYSTEP_XY)
+ axis == X_AXIS ? BABYSTEP_SIZE_X :
+ axis == Y_AXIS ? BABYSTEP_SIZE_Y :
+ #endif
+ BABYSTEP_SIZE_Z
+ );
+ ui.encoderPosition = 0;
+ ui.refresh(LCDVIEW_REDRAW_NOW);
+ babystep.add_steps(axis, steps);
+ }
+ if (ui.should_draw()) {
+ const float mps = planner.mm_per_step[axis];
+ MenuEditItemBase::draw_edit_screen(fmsg, BABYSTEP_TO_STR(mps * babystep.accum));
+ #if ENABLED(BABYSTEP_DISPLAY_TOTAL)
+ const bool in_view = TERN1(HAS_MARLINUI_U8GLIB, PAGE_CONTAINS(LCD_PIXEL_HEIGHT - MENU_FONT_HEIGHT, LCD_PIXEL_HEIGHT - 1));
+ if (in_view) {
+ TERN_(HAS_MARLINUI_U8GLIB, ui.set_font(FONT_MENU));
+ #if ENABLED(TFT_COLOR_UI)
+ lcd_moveto(4, 3);
+ lcd_put_u8str(GET_TEXT_F(MSG_BABYSTEP_TOTAL));
+ lcd_put_lchar(':');
+ lcd_moveto(10, 3);
+ #else
+ lcd_moveto(0, TERN(HAS_MARLINUI_U8GLIB, LCD_PIXEL_HEIGHT - MENU_FONT_DESCENT, LCD_HEIGHT - 1));
+ lcd_put_u8str(GET_TEXT_F(MSG_BABYSTEP_TOTAL));
+ lcd_put_lchar(':');
+ #endif
+ lcd_put_u8str(BABYSTEP_TO_STR(mps * babystep.axis_total[BS_TOTAL_IND(axis)]));
+ }
+ #endif
+ }
+ }
+
+ inline void _lcd_babystep_go(const screenFunc_t screen) {
+ ui.goto_screen(screen);
+ ui.defer_status_screen();
+ babystep.accum = 0;
+ }
+
+ #if ENABLED(BABYSTEP_XY)
+ void _lcd_babystep_x() { _lcd_babystep(X_AXIS, GET_TEXT_F(MSG_BABYSTEP_X)); }
+ void _lcd_babystep_y() { _lcd_babystep(Y_AXIS, GET_TEXT_F(MSG_BABYSTEP_Y)); }
+ #endif
+
+ #if DISABLED(BABYSTEP_ZPROBE_OFFSET)
+ void _lcd_babystep_z() { _lcd_babystep(Z_AXIS, GET_TEXT_F(MSG_BABYSTEP_Z)); }
+ void lcd_babystep_z() { _lcd_babystep_go(_lcd_babystep_z); }
+ #endif
+
+#endif // BABYSTEPPING
+
+void menu_tune() {
+ START_MENU();
+ BACK_ITEM(MSG_MAIN);
+
+ //
+ // Speed:
+ //
+ EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999);
+
+ //
+ // Manual bed leveling, Bed Z:
+ //
+ #if BOTH(MESH_BED_LEVELING, LCD_BED_LEVELING)
+ EDIT_ITEM(float43, MSG_BED_Z, &bedlevel.z_offset, -1, 1);
+ #endif
+
+ //
+ // Nozzle:
+ // Nozzle [1-4]:
+ //
+ #if HOTENDS == 1
+ EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, thermalManager.hotend_max_target(0), []{ thermalManager.start_watching_hotend(0); });
+ #elif HAS_MULTI_HOTEND
+ HOTEND_LOOP()
+ EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.hotend_max_target(e), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); });
+ #endif
+
+ #if ENABLED(SINGLENOZZLE_STANDBY_TEMP)
+ LOOP_S_L_N(e, 1, EXTRUDERS)
+ EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.hotend_max_target(0));
+ #endif
+
+ //
+ // Bed:
+ //
+ #if HAS_HEATED_BED
+ EDIT_ITEM_FAST(int3, MSG_BED, &thermalManager.temp_bed.target, 0, BED_MAX_TARGET, thermalManager.start_watching_bed);
+ #endif
+
+ //
+ // Fan Speed:
+ //
+ #if HAS_FAN
+
+ DEFINE_SINGLENOZZLE_ITEM();
+
+ #if HAS_FAN0
+ _FAN_EDIT_ITEMS(0,FIRST_FAN_SPEED);
+ #endif
+ #if HAS_FAN1
+ FAN_EDIT_ITEMS(1);
+ #elif SNFAN(1)
+ singlenozzle_item(1);
+ #endif
+ #if HAS_FAN2
+ FAN_EDIT_ITEMS(2);
+ #elif SNFAN(2)
+ singlenozzle_item(2);
+ #endif
+ #if HAS_FAN3
+ FAN_EDIT_ITEMS(3);
+ #elif SNFAN(3)
+ singlenozzle_item(3);
+ #endif
+ #if HAS_FAN4
+ FAN_EDIT_ITEMS(4);
+ #elif SNFAN(4)
+ singlenozzle_item(4);
+ #endif
+ #if HAS_FAN5
+ FAN_EDIT_ITEMS(5);
+ #elif SNFAN(5)
+ singlenozzle_item(5);
+ #endif
+ #if HAS_FAN6
+ FAN_EDIT_ITEMS(6);
+ #elif SNFAN(6)
+ singlenozzle_item(6);
+ #endif
+ #if HAS_FAN7
+ FAN_EDIT_ITEMS(7);
+ #elif SNFAN(7)
+ singlenozzle_item(7);
+ #endif
+
+ #endif // HAS_FAN
+
+ //
+ // Flow:
+ //
+ #if HAS_EXTRUDERS
+ EDIT_ITEM(int3, MSG_FLOW, &planner.flow_percentage[active_extruder], 10, 999, []{ planner.refresh_e_factor(active_extruder); });
+ // Flow En:
+ #if HAS_MULTI_EXTRUDER
+ EXTRUDER_LOOP()
+ EDIT_ITEM_N(int3, e, MSG_FLOW_N, &planner.flow_percentage[e], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); });
+ #endif
+ #endif
+
+ //
+ // Advance K:
+ //
+ #if ENABLED(LIN_ADVANCE) && DISABLED(SLIM_LCD_MENUS)
+ #if EXTRUDERS == 1
+ EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 10);
+ #elif HAS_MULTI_EXTRUDER
+ EXTRUDER_LOOP()
+ EDIT_ITEM_N(float42_52, e, MSG_ADVANCE_K_E, &planner.extruder_advance_K[e], 0, 10);
+ #endif
+ #endif
+
+ //
+ // Babystep X:
+ // Babystep Y:
+ // Babystep Z:
+ //
+ #if ENABLED(BABYSTEPPING)
+ #if ENABLED(BABYSTEP_XY)
+ SUBMENU_N(X_AXIS, MSG_BABYSTEP_N, []{ _lcd_babystep_go(_lcd_babystep_x); });
+ SUBMENU_N(Y_AXIS, MSG_BABYSTEP_N, []{ _lcd_babystep_go(_lcd_babystep_y); });
+ #endif
+ #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+ SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset);
+ #else
+ SUBMENU_N(Z_AXIS, MSG_BABYSTEP_N, lcd_babystep_z);
+ #endif
+ #endif
+
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU
diff --git a/src/lcd/menu/menu_ubl.cpp b/src/lcd/menu/menu_ubl.cpp
new file mode 100644
index 0000000..62c1770
--- /dev/null
+++ b/src/lcd/menu/menu_ubl.cpp
@@ -0,0 +1,674 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+//
+// Unified Bed Leveling Menus
+//
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if BOTH(HAS_MARLINUI_MENU, AUTO_BED_LEVELING_UBL)
+
+#include "menu_item.h"
+#include "../../gcode/gcode.h"
+#include "../../gcode/queue.h"
+#include "../../module/motion.h"
+#include "../../module/planner.h"
+#include "../../module/settings.h"
+#include "../../feature/bedlevel/bedlevel.h"
+
+static int16_t ubl_storage_slot = 0,
+ custom_hotend_temp = 150,
+ side_points = 3,
+ ubl_fillin_amount = 5,
+ ubl_height_amount = 1;
+
+static uint8_t n_edit_pts = 1;
+static int8_t x_plot = 0, y_plot = 0; // May be negative during move
+
+#if HAS_HEATED_BED
+ static int16_t custom_bed_temp = 50;
+#endif
+
+float mesh_edit_accumulator; // Rounded to 2.5 decimal places on use
+
+inline float rounded_mesh_value() {
+ const int32_t rounded = int32_t(mesh_edit_accumulator * 1000);
+ return float(rounded - (rounded % 5L)) / 1000;
+}
+
+/**
+ * This screen displays the temporary mesh value and updates it based on encoder
+ * movement. While this screen is active bedlevel.fine_tune_mesh sits in a loop getting
+ * the current value via ubl_mesh_value, moves the Z axis, and updates the mesh
+ * value until the encoder button is pressed.
+ *
+ * - Update the 'mesh_edit_accumulator' from encoder rotation
+ * - Draw the mesh value (with draw_edit_screen)
+ * - Draw the graphical overlay, if enabled.
+ * - Update the 'refresh' state according to the display type
+ */
+void _lcd_mesh_fine_tune(FSTR_P const fmsg) {
+ constexpr float mesh_edit_step = 1.0f / 200.0f;
+ ui.defer_status_screen();
+ if (bedlevel.encoder_diff) {
+ mesh_edit_accumulator += TERN(IS_TFTGLCD_PANEL,
+ bedlevel.encoder_diff * mesh_edit_step / ENCODER_PULSES_PER_STEP,
+ bedlevel.encoder_diff > 0 ? mesh_edit_step : -mesh_edit_step
+ );
+ bedlevel.encoder_diff = 0;
+ IF_DISABLED(IS_TFTGLCD_PANEL, ui.refresh(LCDVIEW_CALL_REDRAW_NEXT));
+ }
+ TERN_(IS_TFTGLCD_PANEL, ui.refresh(LCDVIEW_CALL_REDRAW_NEXT));
+
+ if (ui.should_draw()) {
+ const float rounded_f = rounded_mesh_value();
+ MenuEditItemBase::draw_edit_screen(fmsg, ftostr43sign(rounded_f));
+ TERN_(MESH_EDIT_GFX_OVERLAY, ui.zoffset_overlay(rounded_f));
+ TERN_(HAS_GRAPHICAL_TFT, ui.refresh(LCDVIEW_NONE));
+ }
+}
+
+//
+// Init mesh editing and go to the fine tuning screen (bedlevel.fine_tune_mesh)
+// To capture encoder events UBL will also call ui.capture and ui.release.
+//
+void MarlinUI::ubl_mesh_edit_start(const_float_t initial) {
+ TERN_(HAS_GRAPHICAL_TFT, clear_lcd());
+ mesh_edit_accumulator = initial;
+ goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT_F(MSG_MESH_EDIT_Z)); });
+}
+
+//
+// Get the mesh value within a Z adjustment loop (bedlevel.fine_tune_mesh)
+//
+float MarlinUI::ubl_mesh_value() { return rounded_mesh_value(); }
+
+/**
+ * UBL Build Custom Mesh Command
+ */
+void _lcd_ubl_build_custom_mesh() {
+ char ubl_lcd_gcode[64];
+ #if HAS_HEATED_BED
+ sprintf_P(ubl_lcd_gcode, PSTR("G28\nM190 S%i\nM109 S%i\nG29 P1"), custom_bed_temp, custom_hotend_temp);
+ #else
+ sprintf_P(ubl_lcd_gcode, PSTR("G28\nM109 S%i\nG29 P1"), custom_hotend_temp);
+ #endif
+ queue.inject(ubl_lcd_gcode);
+}
+
+/**
+ * UBL Custom Mesh submenu
+ *
+ * << Build Mesh
+ * Hotend Temp: ---
+ * Bed Temp: ---
+ * Build Custom Mesh
+ */
+void _lcd_ubl_custom_mesh() {
+ START_MENU();
+ BACK_ITEM(MSG_UBL_BUILD_MESH_MENU);
+ #if HAS_HOTEND
+ EDIT_ITEM(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, EXTRUDE_MINTEMP, thermalManager.hotend_max_target(0));
+ #endif
+ #if HAS_HEATED_BED
+ EDIT_ITEM(int3, MSG_UBL_BED_TEMP_CUSTOM, &custom_bed_temp, BED_MINTEMP, BED_MAX_TARGET);
+ #endif
+ ACTION_ITEM(MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_build_custom_mesh);
+ END_MENU();
+}
+
+/**
+ * UBL Adjust Mesh Height Command
+ */
+void _lcd_ubl_adjust_height_cmd() {
+ char ubl_lcd_gcode[13];
+ const int ind = ubl_height_amount > 0 ? 6 : 7;
+ strcpy_P(ubl_lcd_gcode, PSTR("G29P6C-"));
+ sprintf_P(&ubl_lcd_gcode[ind], PSTR(".%i"), ABS(ubl_height_amount));
+ queue.inject(ubl_lcd_gcode);
+}
+
+/**
+ * UBL Adjust Mesh Height submenu
+ *
+ * << Edit Mesh
+ * Height Amount: ---
+ * Adjust Mesh Height
+ * << Info Screen
+ */
+void _menu_ubl_height_adjust() {
+ START_MENU();
+ BACK_ITEM(MSG_EDIT_MESH);
+ EDIT_ITEM(int3, MSG_UBL_MESH_HEIGHT_AMOUNT, &ubl_height_amount, -9, 9, _lcd_ubl_adjust_height_cmd);
+ ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status);
+ END_MENU();
+}
+
+/**
+ * UBL Edit Mesh submenu
+ *
+ * << UBL Tools
+ * Fine Tune All
+ * Fine Tune Closest
+ * - Adjust Mesh Height >>
+ * << Info Screen
+ */
+void _lcd_ubl_edit_mesh() {
+ START_MENU();
+ BACK_ITEM(MSG_UBL_TOOLS);
+ GCODES_ITEM(MSG_UBL_FINE_TUNE_ALL, F("G29P4RT"));
+ GCODES_ITEM(MSG_UBL_FINE_TUNE_CLOSEST, F("G29P4T"));
+ SUBMENU(MSG_UBL_MESH_HEIGHT_ADJUST, _menu_ubl_height_adjust);
+ ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status);
+ END_MENU();
+}
+
+#if ENABLED(G26_MESH_VALIDATION)
+
+ /**
+ * UBL Validate Custom Mesh Command
+ */
+ void _lcd_ubl_validate_custom_mesh() {
+ char ubl_lcd_gcode[20];
+ sprintf_P(ubl_lcd_gcode, PSTR("G28\nG26CPH%" PRIi16 TERN_(HAS_HEATED_BED, "B%" PRIi16))
+ , custom_hotend_temp
+ OPTARG(HAS_HEATED_BED, custom_bed_temp)
+ );
+ queue.inject(ubl_lcd_gcode);
+ }
+
+ /**
+ * UBL Validate Mesh submenu
+ *
+ * << UBL Tools
+ * Mesh Validation with Material 1 up to 5
+ * Validate Custom Mesh
+ * << Info Screen
+ */
+ void _lcd_ubl_validate_mesh() {
+ START_MENU();
+ BACK_ITEM(MSG_UBL_TOOLS);
+ #if HAS_PREHEAT
+ #if HAS_HEATED_BED
+ #define VALIDATE_MESH_GCODE_ITEM(M) \
+ GCODES_ITEM_N_f(M, ui.get_preheat_label(M), MSG_UBL_VALIDATE_MESH_M, F("G28\nG26CPI" STRINGIFY(M)));
+ #else
+ #define VALIDATE_MESH_GCODE_ITEM(M) \
+ GCODES_ITEM_N_f(M, ui.get_preheat_label(M), MSG_UBL_VALIDATE_MESH_M, F("G28\nG26CPB0I" STRINGIFY(M)));
+ #endif
+ REPEAT(PREHEAT_COUNT, VALIDATE_MESH_GCODE_ITEM)
+ #endif
+ ACTION_ITEM(MSG_UBL_VALIDATE_CUSTOM_MESH, _lcd_ubl_validate_custom_mesh);
+ ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status);
+ END_MENU();
+ }
+
+#endif
+
+/**
+ * UBL Grid Leveling submenu
+ *
+ * << UBL Tools
+ * Side points: ---
+ * Level Mesh
+ */
+void _lcd_ubl_grid_level() {
+ START_MENU();
+ BACK_ITEM(MSG_UBL_TOOLS);
+ EDIT_ITEM(int3, MSG_UBL_SIDE_POINTS, &side_points, 2, 6);
+ ACTION_ITEM(MSG_UBL_MESH_LEVEL, []{
+ char ubl_lcd_gcode[12];
+ sprintf_P(ubl_lcd_gcode, PSTR("G29J%i"), side_points);
+ queue.inject(ubl_lcd_gcode);
+ });
+ END_MENU();
+}
+
+/**
+ * UBL Mesh Leveling submenu
+ *
+ * << UBL Tools
+ * 3-Point Mesh Leveling
+ * - Grid Mesh Leveling >>
+ * << Info Screen
+ */
+void _lcd_ubl_mesh_leveling() {
+ START_MENU();
+ BACK_ITEM(MSG_UBL_TOOLS);
+ GCODES_ITEM(MSG_UBL_3POINT_MESH_LEVELING, F("G29J0"));
+ SUBMENU(MSG_UBL_GRID_MESH_LEVELING, _lcd_ubl_grid_level);
+ ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status);
+ END_MENU();
+}
+
+/**
+ * UBL Fill-in Amount Mesh Command
+ */
+void _lcd_ubl_fillin_amount_cmd() {
+ char ubl_lcd_gcode[18];
+ sprintf_P(ubl_lcd_gcode, PSTR("G29P3RC.%i"), ubl_fillin_amount);
+ gcode.process_subcommands_now(ubl_lcd_gcode);
+}
+
+/**
+ * UBL Fill-in Mesh submenu
+ *
+ * << Build Mesh
+ * Fill-in Amount: ---
+ * Fill-in Mesh
+ * Smart Fill-in
+ * Manual Fill-in
+ * << Info Screen
+ */
+void _menu_ubl_fillin() {
+ START_MENU();
+ BACK_ITEM(MSG_UBL_BUILD_MESH_MENU);
+ EDIT_ITEM(int3, MSG_UBL_FILLIN_AMOUNT, &ubl_fillin_amount, 0, 9, _lcd_ubl_fillin_amount_cmd);
+ GCODES_ITEM(MSG_UBL_SMART_FILLIN, F("G29P3T0"));
+ GCODES_ITEM(MSG_UBL_MANUAL_FILLIN, F("G29P2BT0"));
+ ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status);
+ END_MENU();
+}
+
+void _lcd_ubl_invalidate() {
+ bedlevel.invalidate();
+ SERIAL_ECHOLNPGM("Mesh invalidated.");
+}
+
+/**
+ * UBL Build Mesh submenu
+ *
+ * << UBL Tools
+ * Build Mesh with Material 1 up to 5
+ * - Build Custom Mesh >>
+ * Build Cold Mesh
+ * - Fill-in Mesh >>
+ * Continue Bed Mesh
+ * Invalidate All
+ * Invalidate Closest
+ * << Info Screen
+ */
+void _lcd_ubl_build_mesh() {
+ START_MENU();
+ BACK_ITEM(MSG_UBL_TOOLS);
+ #if HAS_PREHEAT
+ #if HAS_HEATED_BED
+ #define PREHEAT_BED_GCODE(M) "M190I" STRINGIFY(M) "\n"
+ #else
+ #define PREHEAT_BED_GCODE(M) ""
+ #endif
+ #define BUILD_MESH_GCODE_ITEM(M) GCODES_ITEM_f(ui.get_preheat_label(M), MSG_UBL_BUILD_MESH_M, \
+ F( \
+ "G28\n" \
+ PREHEAT_BED_GCODE(M) \
+ "M109I" STRINGIFY(M) "\n" \
+ "G29P1\n" \
+ "M104S0\n" \
+ "M140S0" \
+ ) )
+ BUILD_MESH_GCODE_ITEM(0);
+ #if PREHEAT_COUNT > 1
+ BUILD_MESH_GCODE_ITEM(1);
+ #if PREHEAT_COUNT > 2
+ BUILD_MESH_GCODE_ITEM(2);
+ #if PREHEAT_COUNT > 3
+ BUILD_MESH_GCODE_ITEM(3);
+ #if PREHEAT_COUNT > 4
+ BUILD_MESH_GCODE_ITEM(4);
+ #endif
+ #endif
+ #endif
+ #endif
+ #endif // HAS_PREHEAT
+
+ SUBMENU(MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_custom_mesh);
+ GCODES_ITEM(MSG_UBL_BUILD_COLD_MESH, F("G29NP1"));
+ SUBMENU(MSG_UBL_FILLIN_MESH, _menu_ubl_fillin);
+ GCODES_ITEM(MSG_UBL_CONTINUE_MESH, F("G29P1C"));
+ ACTION_ITEM(MSG_UBL_INVALIDATE_ALL, _lcd_ubl_invalidate);
+ GCODES_ITEM(MSG_UBL_INVALIDATE_CLOSEST, F("G29I"));
+ ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status);
+ END_MENU();
+}
+
+/**
+ * UBL Load / Save Mesh Commands
+ */
+inline void _lcd_ubl_load_save_cmd(const char loadsave, FSTR_P const fmsg) {
+ char ubl_lcd_gcode[40];
+ sprintf_P(ubl_lcd_gcode, PSTR("G29%c%i\nM117 "), loadsave, ubl_storage_slot);
+ sprintf_P(&ubl_lcd_gcode[strlen(ubl_lcd_gcode)], FTOP(fmsg), ubl_storage_slot);
+ gcode.process_subcommands_now(ubl_lcd_gcode);
+}
+void _lcd_ubl_load_mesh_cmd() { _lcd_ubl_load_save_cmd('L', GET_TEXT_F(MSG_MESH_LOADED)); }
+void _lcd_ubl_save_mesh_cmd() { _lcd_ubl_load_save_cmd('S', GET_TEXT_F(MSG_MESH_SAVED)); }
+
+/**
+ * UBL Mesh Storage submenu
+ *
+ * << Unified Bed Leveling
+ * Memory Slot: ---
+ * Load Bed Mesh
+ * Save Bed Mesh
+ */
+void _lcd_ubl_storage_mesh() {
+ int16_t a = settings.calc_num_meshes();
+ START_MENU();
+ BACK_ITEM(MSG_UBL_LEVEL_BED);
+ if (!WITHIN(ubl_storage_slot, 0, a - 1))
+ STATIC_ITEM(MSG_UBL_NO_STORAGE);
+ else {
+ EDIT_ITEM(int3, MSG_UBL_STORAGE_SLOT, &ubl_storage_slot, 0, a - 1);
+ ACTION_ITEM(MSG_UBL_LOAD_MESH, _lcd_ubl_load_mesh_cmd);
+ ACTION_ITEM(MSG_UBL_SAVE_MESH, _lcd_ubl_save_mesh_cmd);
+ }
+ END_MENU();
+}
+
+/**
+ * UBL LCD "radar" map point editing
+ */
+void _lcd_ubl_map_edit_cmd() {
+ char ubl_lcd_gcode[50], str[10], str2[10];
+ dtostrf(bedlevel.get_mesh_x(x_plot), 0, 2, str);
+ dtostrf(bedlevel.get_mesh_y(y_plot), 0, 2, str2);
+ snprintf_P(ubl_lcd_gcode, sizeof(ubl_lcd_gcode), PSTR("G29P4X%sY%sR%i"), str, str2, int(n_edit_pts));
+ queue.inject(ubl_lcd_gcode);
+}
+
+/**
+ * UBL LCD Map Movement
+ */
+void ubl_map_move_to_xy() {
+ const xy_pos_t xy = { bedlevel.get_mesh_x(x_plot), bedlevel.get_mesh_y(y_plot) };
+
+ // Some printers have unreachable areas in the mesh. Skip the move if unreachable.
+ if (!position_is_reachable(xy)) return;
+
+ #if ENABLED(DELTA)
+ if (current_position.z > delta_clip_start_height) { // Make sure the delta has fully free motion
+ destination = current_position;
+ destination.z = delta_clip_start_height;
+ prepare_internal_fast_move_to_destination(homing_feedrate(Z_AXIS)); // Set current_position from destination
+ }
+ #endif
+
+ // Use the built-in manual move handler to move to the mesh point.
+ ui.manual_move.set_destination(xy);
+ ui.manual_move.soon(ALL_AXES_ENUM);
+}
+
+inline int32_t grid_index(const uint8_t x, const uint8_t y) {
+ return (GRID_MAX_POINTS_X) * y + x;
+}
+
+/**
+ * UBL LCD "radar" map
+ */
+void ubl_map_screen() {
+ // static millis_t next_move = 0;
+ // const millis_t ms = millis();
+
+ uint8_t x, y;
+
+ if (ui.first_page) {
+
+ // On click send "G29 P4 ..." to edit the Z value
+ if (ui.use_click()) {
+ _lcd_ubl_map_edit_cmd();
+ return;
+ }
+
+ ui.defer_status_screen();
+
+ #if IS_KINEMATIC
+ // Index of the mesh point upon entry
+ const int32_t old_pos_index = grid_index(x_plot, y_plot);
+ // Direction from new (unconstrained) encoder value
+ const int8_t step_dir = int32_t(ui.encoderPosition) < old_pos_index ? -1 : 1;
+ #endif
+
+ do {
+ // Now, keep the encoder position within range
+ if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = GRID_MAX_POINTS + TERN(TOUCH_SCREEN, ui.encoderPosition, -1);
+ if (int32_t(ui.encoderPosition) > GRID_MAX_POINTS - 1) ui.encoderPosition = TERN(TOUCH_SCREEN, ui.encoderPosition - GRID_MAX_POINTS, 0);
+
+ // Draw the grid point based on the encoder
+ x = ui.encoderPosition % (GRID_MAX_POINTS_X);
+ y = ui.encoderPosition / (GRID_MAX_POINTS_X);
+
+ // Validate if needed
+ #if IS_KINEMATIC
+ const xy_pos_t xy = { bedlevel.get_mesh_x(x), bedlevel.get_mesh_y(y) };
+ if (position_is_reachable(xy)) break; // Found a valid point
+ ui.encoderPosition += step_dir; // Test the next point
+ #endif
+ } while (ENABLED(IS_KINEMATIC));
+
+ // Determine number of points to edit
+ #if IS_KINEMATIC
+ n_edit_pts = 9; // TODO: Delta accessible edit points
+ #else
+ const bool xc = WITHIN(x, 1, (GRID_MAX_POINTS_X) - 2),
+ yc = WITHIN(y, 1, (GRID_MAX_POINTS_Y) - 2);
+ n_edit_pts = yc ? (xc ? 9 : 6) : (xc ? 6 : 4); // Corners
+ #endif
+
+ // Refresh is also set by encoder movement
+ //if (int32_t(ui.encoderPosition) != grid_index(x, y))
+ // ui.refresh(LCDVIEW_CALL_REDRAW_NEXT);
+ }
+
+ // Draw the grid point based on the encoder
+ x = ui.encoderPosition % (GRID_MAX_POINTS_X);
+ y = ui.encoderPosition / (GRID_MAX_POINTS_X);
+
+ if (ui.should_draw()) ui.ubl_plot(x, y);
+
+ // Add a move if needed to match the grid point
+ if (x != x_plot || y != y_plot) {
+ x_plot = x; y_plot = y; // The move is always posted, so update the grid point now
+ ubl_map_move_to_xy(); // Sets up a "manual move"
+ ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); // Clean up a half drawn box
+ }
+}
+
+/**
+ * UBL LCD "radar" map homing
+ */
+void _ubl_map_screen_homing() {
+ ui.defer_status_screen();
+ _lcd_draw_homing();
+ if (all_axes_homed()) {
+ bedlevel.lcd_map_control = true; // Return to the map screen after editing Z
+ ui.goto_screen(ubl_map_screen, grid_index(x_plot, y_plot)); // Pre-set the encoder value
+ ui.manual_move.menu_scale = 0; // Immediate move
+ ubl_map_move_to_xy(); // Move to current mesh point
+ ui.manual_move.menu_scale = 1; // Delayed moves
+ }
+}
+
+/**
+ * UBL Homing before LCD map
+ */
+void _ubl_goto_map_screen() {
+ if (planner.movesplanned()) return; // The ACTION_ITEM will do nothing
+ if (!all_axes_trusted()) {
+ set_all_unhomed();
+ queue.inject_P(G28_STR);
+ }
+ ui.goto_screen(_ubl_map_screen_homing); // Go to the "Homing" screen
+}
+
+/**
+ * UBL Output map submenu
+ *
+ * << Unified Bed Leveling
+ * Output for Host
+ * Output for CSV
+ * Off Printer Backup
+ */
+void _lcd_ubl_output_map() {
+ START_MENU();
+ BACK_ITEM(MSG_UBL_LEVEL_BED);
+ GCODES_ITEM(MSG_UBL_OUTPUT_MAP_HOST, F("G29T0"));
+ GCODES_ITEM(MSG_UBL_OUTPUT_MAP_CSV, F("G29T1"));
+ GCODES_ITEM(MSG_UBL_OUTPUT_MAP_BACKUP, F("G29S-1"));
+ END_MENU();
+}
+
+/**
+ * UBL Tools submenu
+ *
+ * << Unified Bed Leveling
+ * - Build Mesh >>
+ * - Validate Mesh >>
+ * - Edit Mesh >>
+ * - Mesh Leveling >>
+ */
+void _menu_ubl_tools() {
+ START_MENU();
+ BACK_ITEM(MSG_UBL_LEVEL_BED);
+ SUBMENU(MSG_UBL_BUILD_MESH_MENU, _lcd_ubl_build_mesh);
+ GCODES_ITEM(MSG_UBL_MANUAL_MESH, F("G29I999\nG29P2BT0"));
+ #if ENABLED(G26_MESH_VALIDATION)
+ SUBMENU(MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh);
+ #endif
+ SUBMENU(MSG_EDIT_MESH, _lcd_ubl_edit_mesh);
+ SUBMENU(MSG_UBL_MESH_LEVELING, _lcd_ubl_mesh_leveling);
+ END_MENU();
+}
+
+#if ENABLED(G26_MESH_VALIDATION)
+
+ /**
+ * UBL Step-By-Step submenu
+ *
+ * << Unified Bed Leveling
+ * 1 Build Cold Mesh
+ * 2 Smart Fill-in
+ * - 3 Validate Mesh >>
+ * 4 Fine Tune All
+ * - 5 Validate Mesh >>
+ * 6 Fine Tune All
+ * 7 Save Bed Mesh
+ */
+ void _lcd_ubl_step_by_step() {
+ START_MENU();
+ BACK_ITEM(MSG_UBL_LEVEL_BED);
+ GCODES_ITEM(MSG_UBL_1_BUILD_COLD_MESH, F("G29NP1"));
+ GCODES_ITEM(MSG_UBL_2_SMART_FILLIN, F("G29P3T0"));
+ SUBMENU(MSG_UBL_3_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh);
+ GCODES_ITEM(MSG_UBL_4_FINE_TUNE_ALL, F("G29P4RT"));
+ SUBMENU(MSG_UBL_5_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh);
+ GCODES_ITEM(MSG_UBL_6_FINE_TUNE_ALL, F("G29P4RT"));
+ ACTION_ITEM(MSG_UBL_7_SAVE_MESH, _lcd_ubl_save_mesh_cmd);
+ END_MENU();
+ }
+
+#endif
+
+#if ENABLED(UBL_MESH_WIZARD)
+
+ /**
+ * UBL Mesh Wizard - One-click mesh creation with or without a probe
+ */
+ void _lcd_ubl_mesh_wizard() {
+ char ubl_lcd_gcode[30];
+ #if HAS_HEATED_BED && HAS_HOTEND
+ sprintf_P(ubl_lcd_gcode, PSTR("M1004B%iH%iS%i"), custom_bed_temp, custom_hotend_temp, ubl_storage_slot);
+ #elif HAS_HOTEND
+ sprintf_P(ubl_lcd_gcode, PSTR("M1004H%iS%i"), custom_hotend_temp, ubl_storage_slot);
+ #else
+ sprintf_P(ubl_lcd_gcode, PSTR("M1004S%i"), ubl_storage_slot);
+ #endif
+ queue.inject(ubl_lcd_gcode);
+ ui.return_to_status();
+ }
+
+ void _menu_ubl_mesh_wizard() {
+ const int16_t total_slots = settings.calc_num_meshes();
+ START_MENU();
+ BACK_ITEM(MSG_UBL_LEVEL_BED);
+
+ #if HAS_HOTEND
+ EDIT_ITEM(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, HEATER_0_MINTEMP + 20, thermalManager.hotend_max_target(0));
+ #endif
+
+ #if HAS_HEATED_BED
+ EDIT_ITEM(int3, MSG_UBL_BED_TEMP_CUSTOM, &custom_bed_temp, BED_MINTEMP + 20, BED_MAX_TARGET);
+ #endif
+
+ EDIT_ITEM(int3, MSG_UBL_STORAGE_SLOT, &ubl_storage_slot, 0, total_slots);
+
+ ACTION_ITEM(MSG_UBL_MESH_WIZARD, _lcd_ubl_mesh_wizard);
+
+ #if ENABLED(G26_MESH_VALIDATION)
+ SUBMENU(MSG_UBL_VALIDATE_MESH_MENU, _lcd_ubl_validate_mesh);
+ #endif
+
+ ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status);
+ END_MENU();
+ }
+
+#endif
+
+/**
+ * UBL System submenu
+ *
+ * << Motion
+ * - Manually Build Mesh >>
+ * - Activate UBL >>
+ * - Deactivate UBL >>
+ * - Step-By-Step UBL >>
+ * - Mesh Storage >>
+ * - Output Map >>
+ * - UBL Tools >>
+ * - Output UBL Info >>
+ */
+void _lcd_ubl_level_bed() {
+ START_MENU();
+ BACK_ITEM(MSG_MOTION);
+ if (planner.leveling_active)
+ GCODES_ITEM(MSG_UBL_DEACTIVATE_MESH, F("G29D"));
+ else
+ GCODES_ITEM(MSG_UBL_ACTIVATE_MESH, F("G29A"));
+ #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
+ editable.decimal = planner.z_fade_height;
+ EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, []{ set_z_fade_height(editable.decimal); });
+ #endif
+ #if ENABLED(G26_MESH_VALIDATION)
+ SUBMENU(MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step);
+ #endif
+ #if ENABLED(UBL_MESH_WIZARD)
+ SUBMENU(MSG_UBL_MESH_WIZARD, _menu_ubl_mesh_wizard);
+ #endif
+ ACTION_ITEM(MSG_UBL_MESH_EDIT, _ubl_goto_map_screen);
+ SUBMENU(MSG_UBL_STORAGE_MESH_MENU, _lcd_ubl_storage_mesh);
+ SUBMENU(MSG_UBL_OUTPUT_MAP, _lcd_ubl_output_map);
+ SUBMENU(MSG_UBL_TOOLS, _menu_ubl_tools);
+ GCODES_ITEM(MSG_UBL_INFO_UBL, F("G29W"));
+ END_MENU();
+}
+
+#endif // HAS_MARLINUI_MENU && AUTO_BED_LEVELING_UBL
diff --git a/src/lcd/menu/menu_x_twist.cpp b/src/lcd/menu/menu_x_twist.cpp
new file mode 100644
index 0000000..a069b42
--- /dev/null
+++ b/src/lcd/menu/menu_x_twist.cpp
@@ -0,0 +1,213 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#include "../../inc/MarlinConfigPre.h"
+
+#if ENABLED(X_AXIS_TWIST_COMPENSATION)
+
+#include "menu_item.h"
+#include "menu_addon.h"
+#include "../../module/planner.h"
+#include "../../feature/bedlevel/bedlevel.h"
+#include "../../feature/x_twist.h"
+#include "../../module/motion.h"
+#include "../../gcode/queue.h"
+#include "../../module/probe.h"
+
+#ifndef XATC_Y_POSITION
+ #define XATC_Y_POSITION ((probe.max_y() - probe.min_y())/2)
+#endif
+
+void _goto_manual_move_z(const_float_t);
+
+float measured_z, z_offset;
+
+//
+// Step 9: X Axis Twist Compensation Wizard is finished.
+//
+void xatc_wizard_done() {
+ if (!ui.wait_for_move) {
+ xatc.print_points();
+ set_bed_leveling_enabled(leveling_was_active);
+ SET_SOFT_ENDSTOP_LOOSE(false);
+ ui.goto_screen(menu_advanced_settings);
+ }
+ if (ui.should_draw())
+ MenuItem_static::draw(LCD_HEIGHT >= 4, GET_TEXT_F(MSG_XATC_DONE));
+ ui.refresh(LCDVIEW_CALL_REDRAW_NEXT);
+}
+
+void xatc_wizard_goto_next_point();
+
+//
+// Step 8: Ask the user if he wants to update the z-offset of the probe
+//
+void xatc_wizard_update_z_offset() {
+ MenuItem_confirm::select_screen(
+ GET_TEXT_F(MSG_YES), GET_TEXT_F(MSG_NO)
+ , []{
+ probe.offset.z = z_offset;
+ ui.goto_screen(xatc_wizard_done);
+ }
+ , xatc_wizard_done
+ , GET_TEXT_F(MSG_XATC_UPDATE_Z_OFFSET)
+ , ftostr42_52(z_offset), F("?")
+ );
+}
+
+//
+// Step 7: Set the Z-offset for this point and go to the next one.
+//
+void xatc_wizard_set_offset_and_go_to_next_point() {
+ // Set Z-offset at probed point
+ xatc.z_offset[manual_probe_index++] = probe.offset.z + current_position.z - measured_z;
+ // Go to next point
+ ui.goto_screen(xatc_wizard_goto_next_point);
+}
+
+//
+// Step 6: Wizard Menu. Move the nozzle down until it touches the bed.
+//
+void xatc_wizard_menu() {
+ START_MENU();
+ float calculated_z_offset = probe.offset.z + current_position.z - measured_z;
+
+ if (LCD_HEIGHT >= 4)
+ STATIC_ITEM(MSG_MOVE_NOZZLE_TO_BED, SS_CENTER|SS_INVERT);
+
+ STATIC_ITEM_F(F("Z="), SS_CENTER, ftostr42_52(current_position.z));
+ STATIC_ITEM(MSG_ZPROBE_ZOFFSET, SS_LEFT, ftostr42_52(calculated_z_offset));
+
+ SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move_z( 1); });
+ SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move_z( 0.1f); });
+
+ if ((FINE_MANUAL_MOVE) > 0.0f && (FINE_MANUAL_MOVE) < 0.1f)
+ SUBMENU_f(F(STRINGIFY(FINE_MANUAL_MOVE)), MSG_MOVE_N_MM, []{ _goto_manual_move_z(float(FINE_MANUAL_MOVE)); });
+
+ ACTION_ITEM(MSG_BUTTON_DONE, xatc_wizard_set_offset_and_go_to_next_point);
+
+ END_MENU();
+}
+
+//
+// Step 5: Display "Next point: 1 / 9" while waiting for move to finish
+//
+void xatc_wizard_moving() {
+ if (ui.should_draw()) {
+ char msg[10];
+ sprintf_P(msg, PSTR("%i / %u"), manual_probe_index + 1, XATC_MAX_POINTS);
+ MenuEditItemBase::draw_edit_screen(GET_TEXT_F(MSG_LEVEL_BED_NEXT_POINT), msg);
+ }
+ ui.refresh(LCDVIEW_CALL_NO_REDRAW);
+ if (!ui.wait_for_move) ui.goto_screen(xatc_wizard_menu);
+}
+
+//
+// Step 4: Initiate a move to the next point
+//
+void xatc_wizard_goto_next_point() {
+ if (manual_probe_index < XATC_MAX_POINTS) {
+
+ const float x = xatc.start + manual_probe_index * xatc.spacing;
+
+ // Avoid probing outside the round or hexagonal area
+ if (!TERN0(IS_KINEMATIC, !probe.can_reach(x, XATC_Y_POSITION))) {
+ ui.wait_for_move = true;
+ ui.goto_screen(xatc_wizard_moving);
+
+ // Deploy certain probes before starting probing
+ TERN_(BLTOUCH, do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE));
+
+ xatc.set_enabled(false);
+ measured_z = probe.probe_at_point(x, XATC_Y_POSITION, PROBE_PT_STOW);
+ xatc.set_enabled(true);
+ current_position += probe.offset_xy;
+ current_position.z = (XATC_START_Z) - probe.offset.z + measured_z;
+ line_to_current_position(MMM_TO_MMS(XY_PROBE_FEEDRATE));
+ ui.wait_for_move = false;
+ }
+ else
+ manual_probe_index++; // Go to next point
+ }
+ else {
+ // Compute the z-offset by averaging the values found with this wizard
+ z_offset = 0;
+ LOOP_L_N(i, XATC_MAX_POINTS) z_offset += xatc.z_offset[i];
+ z_offset /= XATC_MAX_POINTS;
+
+ // Subtract the average from the values found with this wizard.
+ // This way they are indipendent from the z-offset
+ LOOP_L_N(i, XATC_MAX_POINTS) xatc.z_offset[i] -= z_offset;
+
+ ui.goto_screen(xatc_wizard_update_z_offset);
+ }
+}
+
+//
+// Step 3: Display "Click to Begin", wait for click
+// Move to the first probe position
+//
+void xatc_wizard_homing_done() {
+ if (ui.should_draw()) {
+ MenuItem_static::draw(1, GET_TEXT_F(MSG_LEVEL_BED_WAITING));
+
+ // Color UI needs a control to detect a touch
+ #if BOTH(TOUCH_SCREEN, HAS_GRAPHICAL_TFT)
+ touch.add_control(CLICK, 0, 0, TFT_WIDTH, TFT_HEIGHT);
+ #endif
+ }
+
+ if (ui.use_click()) {
+ xatc.reset();
+
+ SET_SOFT_ENDSTOP_LOOSE(true); // Disable soft endstops for free Z movement
+
+ ui.goto_screen(xatc_wizard_goto_next_point);
+ }
+}
+
+//
+// Step 2: Display "Homing XYZ" - Wait for homing to finish
+//
+void xatc_wizard_homing() {
+ _lcd_draw_homing();
+ if (all_axes_homed())
+ ui.goto_screen(xatc_wizard_homing_done);
+}
+
+//
+// Step 1: Prepare for the wizard...
+//
+void xatc_wizard_continue() {
+ // Store Bed-Leveling-State and disable
+ #if HAS_LEVELING
+ leveling_was_active = planner.leveling_active;
+ set_bed_leveling_enabled(false);
+ #endif
+
+ // Home all axes
+ ui.defer_status_screen();
+ set_all_unhomed();
+ ui.goto_screen(xatc_wizard_homing);
+ queue.inject_P(G28_STR);
+}
+
+#endif // X_AXIS_TWIST_COMPENSATION