Browse Source

New ML support - migration - replaced source, removed original ML support files (backup)

Robert Pelnar 6 years ago
parent
commit
bd587faab9

+ 46 - 46
Firmware/Marlin_main.cpp

@@ -308,7 +308,7 @@ unsigned long t_fan_rising_edge = millis();
 bool mesh_bed_leveling_flag = false;
 bool mesh_bed_run_from_menu = false;
 
-unsigned char lang_selected = 0;
+//unsigned char lang_selected = 0;
 int8_t FarmMode = 0;
 
 bool prusa_sd_card_upload = false;
@@ -915,8 +915,8 @@ void factory_reset()
 void show_fw_version_warnings() {
 	if (FW_DEV_VERSION == FW_VERSION_GOLD || FW_DEV_VERSION == FW_VERSION_RC) return;
 	switch (FW_DEV_VERSION) {
-	case(FW_VERSION_ALPHA):   lcd_show_fullscreen_message_and_wait_P(MSG_FW_VERSION_ALPHA);   break;
-	case(FW_VERSION_BETA):    lcd_show_fullscreen_message_and_wait_P(MSG_FW_VERSION_BETA);    break;
+	case(FW_VERSION_ALPHA):   lcd_show_fullscreen_message_and_wait_P(_i("You are using firmware alpha version. This is development version. Using this version is not recommended and may cause printer damage."));   break;////MSG_FW_VERSION_ALPHA c=20 r=8
+	case(FW_VERSION_BETA):    lcd_show_fullscreen_message_and_wait_P(_i("You are using firmware beta version. This is development version. Using this version is not recommended and may cause printer damage."));    break;////MSG_FW_VERSION_BETA c=20 r=8
   case(FW_VERSION_DEVEL):
 	case(FW_VERSION_DEBUG):
     lcd_update_enable(false);
@@ -931,7 +931,7 @@ void show_fw_version_warnings() {
     lcd_print_at_PGM(0, 3, PSTR(FW_REPOSITORY));
     lcd_wait_for_click();
     break;
-	default: lcd_show_fullscreen_message_and_wait_P(MSG_FW_VERSION_UNKNOWN); break;
+	default: lcd_show_fullscreen_message_and_wait_P(_i("WARNING: This is an unofficial, unsupported build. Use at your own risk!")); break;////MSG_FW_VERSION_UNKNOWN c=20 r=8
 	}
 	lcd_update_enable(true);
 }
@@ -1026,9 +1026,9 @@ void setup()
 #ifdef STRING_VERSION_CONFIG_H
 #ifdef STRING_CONFIG_H_AUTHOR
 	SERIAL_ECHO_START;
-	SERIAL_ECHORPGM(MSG_CONFIGURATION_VER);
+	SERIAL_ECHORPGM(_i(" Last Updated: "));////MSG_CONFIGURATION_VER c=0 r=0
 	SERIAL_ECHOPGM(STRING_VERSION_CONFIG_H);
-	SERIAL_ECHORPGM(MSG_AUTHOR);
+	SERIAL_ECHORPGM(_n(" | Author: "));////MSG_AUTHOR c=0 r=0
 	SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR);
 	SERIAL_ECHOPGM("Compiled: ");
 	SERIAL_ECHOLNPGM(__DATE__);
@@ -1036,9 +1036,9 @@ void setup()
 #endif
 
 	SERIAL_ECHO_START;
-	SERIAL_ECHORPGM(MSG_FREE_MEMORY);
+	SERIAL_ECHORPGM(_i(" Free Memory: "));////MSG_FREE_MEMORY c=0 r=0
 	SERIAL_ECHO(freeMemory());
-	SERIAL_ECHORPGM(MSG_PLANNER_BUFFER_BYTES);
+	SERIAL_ECHORPGM(_i("  PlannerBufferBytes: "));////MSG_PLANNER_BUFFER_BYTES c=0 r=0
 	SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE);
 	//lcd_update_enable(false); // why do we need this?? - andre
 	// loads data from EEPROM if available else uses defaults (and resets step acceleration rate)
@@ -1309,15 +1309,15 @@ void setup()
 	  //if motherboard or printer type was changed inform user as it can indicate flashing wrong firmware version
 	  //if user confirms with knob, new hw version (printer and/or motherboard) is written to eeprom and message will be not shown next time
 	case(0b01): 
-		lcd_show_fullscreen_message_and_wait_P(MSG_CHANGED_MOTHERBOARD); 
+		lcd_show_fullscreen_message_and_wait_P(_i("Warning: motherboard type changed.")); ////MSG_CHANGED_MOTHERBOARD c=20 r=4
 		eeprom_write_word((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD); 
 		break;
 	case(0b10): 
-		lcd_show_fullscreen_message_and_wait_P(MSG_CHANGED_PRINTER); 
+		lcd_show_fullscreen_message_and_wait_P(_i("Warning: printer type changed.")); ////MSG_CHANGED_PRINTER c=20 r=4
 		eeprom_write_word((uint16_t*)EEPROM_PRINTER_TYPE, PRINTER_TYPE); 
 		break;
 	case(0b11): 
-		lcd_show_fullscreen_message_and_wait_P(MSG_CHANGED_BOTH); 
+		lcd_show_fullscreen_message_and_wait_P(_i("Warning: both printer type and motherboard type changed.")); ////MSG_CHANGED_BOTH c=20 r=4
 		eeprom_write_word((uint16_t*)EEPROM_PRINTER_TYPE, PRINTER_TYPE);
 		eeprom_write_word((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD); 
 		break;
@@ -1325,7 +1325,7 @@ void setup()
   }
 
   if (!previous_settings_retrieved) {
-	  lcd_show_fullscreen_message_and_wait_P(MSG_DEFAULT_SETTINGS_LOADED); //if EEPROM version or printer type was changed, inform user that default setting were loaded
+	  lcd_show_fullscreen_message_and_wait_P(_i("Old settings found. Default PID, Esteps etc. will be set.")); //if EEPROM version or printer type was changed, inform user that default setting were loaded////MSG_DEFAULT_SETTINGS_LOADED c=20 r=4
 	  erase_eeprom_section(EEPROM_OFFSET, 156); 							   //erase M500 part of eeprom
   }
   if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 1) {
@@ -1346,7 +1346,7 @@ void setup()
 		  lcd_update_enable(true);
 	  }
 	  else if (calibration_status() == CALIBRATION_STATUS_CALIBRATED && temp_cal_active == true && calibration_status_pinda() == false) {
-		  //lcd_show_fullscreen_message_and_wait_P(MSG_PINDA_NOT_CALIBRATED);
+		  //lcd_show_fullscreen_message_and_wait_P(_i("Temperature calibration has not been run yet"));////MSG_PINDA_NOT_CALIBRATED c=20 r=4
 		  lcd_update_enable(true);
 	  }
 	  else if (calibration_status() == CALIBRATION_STATUS_Z_CALIBRATION) {
@@ -1357,7 +1357,7 @@ void setup()
 
 #if !defined (DEBUG_DISABLE_FORCE_SELFTEST) && defined (TMC2130)
   if (force_selftest_if_fw_version() && calibration_status() < CALIBRATION_STATUS_ASSEMBLED) {
-	  lcd_show_fullscreen_message_and_wait_P(MSG_FORCE_SELFTEST);
+	  lcd_show_fullscreen_message_and_wait_P(_i("Selftest will be run to calibrate accurate sensorless rehoming."));////MSG_FORCE_SELFTEST c=20 r=8
 	  update_current_firmware_version_to_eeprom();
 	  lcd_selftest();
   }
@@ -2454,7 +2454,7 @@ void gcode_M114()
 	SERIAL_PROTOCOLPGM(" E:");
 	SERIAL_PROTOCOL(current_position[E_AXIS]);
 
-	SERIAL_PROTOCOLRPGM(MSG_COUNT_X);
+	SERIAL_PROTOCOLRPGM(_n(" Count X: "));////MSG_COUNT_X c=0 r=0
 	SERIAL_PROTOCOL(float(st_get_position(X_AXIS)) / axis_steps_per_unit[X_AXIS]);
 	SERIAL_PROTOCOLPGM(" Y:");
 	SERIAL_PROTOCOL(float(st_get_position(Y_AXIS)) / axis_steps_per_unit[Y_AXIS]);
@@ -2934,7 +2934,7 @@ void process_commands()
       codenum = 0;
       if(code_seen('P')) codenum = code_value(); // milliseconds to wait
       if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait
-	  if(codenum != 0) LCD_MESSAGERPGM(MSG_DWELL);
+	  if(codenum != 0) LCD_MESSAGERPGM(_i("Sleep..."));////MSG_DWELL c=0 r=0
       st_synchronize();
       codenum += millis();  // keep track of when we started waiting
       previous_millis_cmd = millis();
@@ -3464,7 +3464,7 @@ void process_commands()
 				enquecommand_front_P((PSTR("G28 W0")));
 				break;
 			}
-			lcd_show_fullscreen_message_and_wait_P(MSG_TEMP_CAL_WARNING);
+			lcd_show_fullscreen_message_and_wait_P(_i("Stable ambient temperature 21-26C is needed a rigid stand is required."));////MSG_TEMP_CAL_WARNING c=20 r=4
 			bool result = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_STEEL_SHEET_CHECK, false, false);
 			
 			if (result)
@@ -3949,11 +3949,11 @@ void process_commands()
 				break;
 			}
 			if (MESH_HOME_Z_SEARCH - current_position[Z_AXIS] < 0.1f) {
-				kill_message = MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED;
+				kill_message = _i("Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset.");////MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED c=20 r=4
 				break;
 			}
 			if (has_z && fabs(z0 - current_position[Z_AXIS]) > Z_CALIBRATION_THRESHOLD) { //if we have data from z calibration, max. allowed difference is 1mm for each point
-				kill_message = MSG_BED_LEVELING_FAILED_POINT_HIGH;
+				kill_message = _i("Bed leveling failed. Sensor triggered too high. Waiting for reset.");////MSG_BED_LEVELING_FAILED_POINT_HIGH c=20 r=4
 				break;
 			}
 			#ifdef SUPPORT_VERBOSITY
@@ -4277,7 +4277,7 @@ void process_commands()
       if (!hasP && !hasS && *src != '\0') {
         lcd_setstatus(src);
       } else {
-        LCD_MESSAGERPGM(MSG_USERWAIT);
+        LCD_MESSAGERPGM(_i("Wait for user..."));////MSG_USERWAIT c=0 r=0
       }
 
       lcd_ignore_click();				//call lcd_ignore_click aslo for else ???
@@ -4305,14 +4305,14 @@ void process_commands()
 		KEEPALIVE_STATE(IN_HANDLER);
       }
       if (IS_SD_PRINTING)
-        LCD_MESSAGERPGM(MSG_RESUMING);
+        LCD_MESSAGERPGM(_i("Resuming print"));////MSG_RESUMING c=0 r=0
       else
         LCD_MESSAGERPGM(WELCOME_MSG);
     }
     break;
 #endif
     case 17:
-        LCD_MESSAGERPGM(MSG_NO_MOVE);
+        LCD_MESSAGERPGM(_i("No move."));////MSG_NO_MOVE c=0 r=0
         enable_x();
         enable_y();
         enable_z();
@@ -4323,9 +4323,9 @@ void process_commands()
 
 #ifdef SDSUPPORT
     case 20: // M20 - list SD card
-      SERIAL_PROTOCOLLNRPGM(MSG_BEGIN_FILE_LIST);
+      SERIAL_PROTOCOLLNRPGM(_i("Begin file list"));////MSG_BEGIN_FILE_LIST c=0 r=0
       card.ls();
-      SERIAL_PROTOCOLLNRPGM(MSG_END_FILE_LIST);
+      SERIAL_PROTOCOLLNRPGM(_i("End file list"));////MSG_END_FILE_LIST c=0 r=0
       break;
     case 21: // M21 - init SD card
 
@@ -4864,7 +4864,7 @@ Sigma_Exit:
         }
       #else
         SERIAL_ERROR_START;
-        SERIAL_ERRORLNRPGM(MSG_ERR_NO_THERMISTORS);
+        SERIAL_ERRORLNRPGM(_i("No thermistors - no temperature"));////MSG_ERR_NO_THERMISTORS c=0 r=0
       #endif
 
         SERIAL_PROTOCOLPGM(" @:");
@@ -5215,10 +5215,10 @@ Sigma_Exit:
       enable_endstops(true) ;
       break;
     case 119: // M119
-    SERIAL_PROTOCOLRPGM(MSG_M119_REPORT);
+    SERIAL_PROTOCOLRPGM(_i("Reporting endstop status"));////MSG_M119_REPORT c=0 r=0
     SERIAL_PROTOCOLLN("");
       #if defined(X_MIN_PIN) && X_MIN_PIN > -1
-        SERIAL_PROTOCOLRPGM(MSG_X_MIN);
+        SERIAL_PROTOCOLRPGM(_n("x_min: "));////MSG_X_MIN c=0 r=0
         if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){
           SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
         }else{
@@ -5227,7 +5227,7 @@ Sigma_Exit:
         SERIAL_PROTOCOLLN("");
       #endif
       #if defined(X_MAX_PIN) && X_MAX_PIN > -1
-        SERIAL_PROTOCOLRPGM(MSG_X_MAX);
+        SERIAL_PROTOCOLRPGM(_n("x_max: "));////MSG_X_MAX c=0 r=0
         if(READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING){
           SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
         }else{
@@ -5236,7 +5236,7 @@ Sigma_Exit:
         SERIAL_PROTOCOLLN("");
       #endif
       #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1
-        SERIAL_PROTOCOLRPGM(MSG_Y_MIN);
+        SERIAL_PROTOCOLRPGM(_n("y_min: "));////MSG_Y_MIN c=0 r=0
         if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){
           SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
         }else{
@@ -5245,7 +5245,7 @@ Sigma_Exit:
         SERIAL_PROTOCOLLN("");
       #endif
       #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1
-        SERIAL_PROTOCOLRPGM(MSG_Y_MAX);
+        SERIAL_PROTOCOLRPGM(_n("y_max: "));////MSG_Y_MAX c=0 r=0
         if(READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING){
           SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
         }else{
@@ -5296,7 +5296,7 @@ Sigma_Exit:
           tmp_extruder = code_value();
 		  if(tmp_extruder >= EXTRUDERS) {
             SERIAL_ECHO_START;
-            SERIAL_ECHO(MSG_M200_INVALID_EXTRUDER);
+            SERIAL_ECHO(_i("M200 Invalid extruder "));////MSG_M200_INVALID_EXTRUDER c=0 r=0
             break;
           }
         }
@@ -5943,7 +5943,7 @@ Sigma_Exit:
 				delay_keep_alive(4);
 
 				if (millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) {
-					lcd_display_message_fullscreen_P(MSG_PRESS_TO_PREHEAT);
+					lcd_display_message_fullscreen_P(_i("Press knob to preheat nozzle and continue."));////MSG_PRESS_TO_PREHEAT c=20 r=4
 					wait_for_user_state = 1;
 					setTargetHotend(0, 0);
 					setTargetHotend(0, 1);
@@ -6083,8 +6083,8 @@ Sigma_Exit:
 			WRITE(BEEPER, LOW);
 
 			KEEPALIVE_STATE(PAUSED_FOR_USER);
-			lcd_change_fil_state = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_UNLOAD_SUCCESSFUL, false, true);
-			if (lcd_change_fil_state == 0) lcd_show_fullscreen_message_and_wait_P(MSG_CHECK_IDLER);
+			lcd_change_fil_state = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Was filament unload successful?"), false, true);////MSG_UNLOAD_SUCCESSFUL c=20 r=2
+			if (lcd_change_fil_state == 0) lcd_show_fullscreen_message_and_wait_P(_i("Please open idler and remove filament manually."));////MSG_CHECK_IDLER c=20 r=4
 			//lcd_return_to_status();
 			lcd_update_enable(true);
 		
@@ -6729,7 +6729,7 @@ Sigma_Exit:
 			  SERIAL_ECHO_START;
 			  SERIAL_ECHOPGM("T");
 			  SERIAL_PROTOCOLLN((int)tmp_extruder);
-			  SERIAL_ECHOLNRPGM(MSG_INVALID_EXTRUDER);
+			  SERIAL_ECHOLNRPGM(_n("Invalid extruder"));////MSG_INVALID_EXTRUDER c=0 r=0
 		  }
 		  else {
 			  boolean make_move = false;
@@ -6761,7 +6761,7 @@ Sigma_Exit:
 			  }
 #endif
 			  SERIAL_ECHO_START;
-			  SERIAL_ECHORPGM(MSG_ACTIVE_EXTRUDER);
+			  SERIAL_ECHORPGM(_n("Active Extruder: "));////MSG_ACTIVE_EXTRUDER c=0 r=0
 			  SERIAL_PROTOCOLLN((int)active_extruder);
 		  }
 
@@ -6831,7 +6831,7 @@ void FlushSerialRequestResend()
 {
   //char cmdbuffer[bufindr][100]="Resend:";
   MYSERIAL.flush();
-  SERIAL_PROTOCOLRPGM(MSG_RESEND);
+  SERIAL_PROTOCOLRPGM(_i("Resend: "));////MSG_RESEND c=0 r=0
   SERIAL_PROTOCOLLN(gcode_LastN + 1);
   previous_millis_cmd = millis();
   SERIAL_PROTOCOLLNRPGM(MSG_OK);
@@ -7152,7 +7152,7 @@ static void handleSafetyTimer()
     {
         setTargetBed(0);
         setTargetHotend(0, 0);
-        lcd_show_fullscreen_message_and_wait_P(MSG_BED_HEATING_SAFETY_DISABLED);
+        lcd_show_fullscreen_message_and_wait_P(_i("Heating disabled by safety timer."));////MSG_BED_HEATING_SAFETY_DISABLED c=0 r=0
     }
 }
 #endif //SAFETYTIMER
@@ -7308,12 +7308,12 @@ void kill(const char *full_screen_message, unsigned char id)
   pinMode(PS_ON_PIN,INPUT);
 #endif
   SERIAL_ERROR_START;
-  SERIAL_ERRORLNRPGM(MSG_ERR_KILLED);
+  SERIAL_ERRORLNRPGM(_i("Printer halted. kill() called!"));////MSG_ERR_KILLED c=0 r=0
   if (full_screen_message != NULL) {
       SERIAL_ERRORLNRPGM(full_screen_message);
       lcd_display_message_fullscreen_P(full_screen_message);
   } else {
-      LCD_ALERTMESSAGERPGM(MSG_KILLED);
+      LCD_ALERTMESSAGERPGM(_i("KILLED. "));////MSG_KILLED c=0 r=0
   }
 
   // FMC small patch to update the LCD before ending
@@ -7426,19 +7426,19 @@ bool setTargetedHotend(int code){
       SERIAL_ECHO_START;
       switch(code){
         case 104:
-          SERIAL_ECHORPGM(MSG_M104_INVALID_EXTRUDER);
+          SERIAL_ECHORPGM(_i("M104 Invalid extruder "));////MSG_M104_INVALID_EXTRUDER c=0 r=0
           break;
         case 105:
-          SERIAL_ECHO(MSG_M105_INVALID_EXTRUDER);
+          SERIAL_ECHO(_i("M105 Invalid extruder "));////MSG_M105_INVALID_EXTRUDER c=0 r=0
           break;
         case 109:
-          SERIAL_ECHO(MSG_M109_INVALID_EXTRUDER);
+          SERIAL_ECHO(_i("M109 Invalid extruder "));////MSG_M109_INVALID_EXTRUDER c=0 r=0
           break;
         case 218:
-          SERIAL_ECHO(MSG_M218_INVALID_EXTRUDER);
+          SERIAL_ECHO(_i("M218 Invalid extruder "));////MSG_M218_INVALID_EXTRUDER c=0 r=0
           break;
         case 221:
-          SERIAL_ECHO(MSG_M221_INVALID_EXTRUDER);
+          SERIAL_ECHO(_i("M221 Invalid extruder "));////MSG_M221_INVALID_EXTRUDER c=0 r=0
           break;
       }
       SERIAL_PROTOCOLLN((int)tmp_extruder);
@@ -8209,7 +8209,7 @@ void recover_print(uint8_t automatic) {
 	char cmd[30];
 	lcd_update_enable(true);
 	lcd_update(2);
-	lcd_setstatuspgm(MSG_RECOVERING_PRINT);
+	lcd_setstatuspgm(_i("Recovering print    "));////MSG_RECOVERING_PRINT c=20 r=1
 
   recover_machine_state_after_power_panic();
 

+ 13 - 13
Firmware/cardreader.cpp

@@ -94,7 +94,7 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
 				if (!dir.open(parent, lfilename, O_READ)) {
 					if (lsAction == LS_SerialPrint) {
 						//SERIAL_ECHO_START();
-						//SERIAL_ECHOPGM(MSG_SD_CANT_OPEN_SUBDIR);
+						//SERIAL_ECHOPGM(_i("Cannot open subdir"));////MSG_SD_CANT_OPEN_SUBDIR c=0 r=0
 						//SERIAL_ECHOLN(lfilename);
 					}
 				}
@@ -183,23 +183,23 @@ void CardReader::initsd()
   {
     //if (!card.init(SPI_HALF_SPEED,SDSS))
     SERIAL_ECHO_START;
-    SERIAL_ECHOLNRPGM(MSG_SD_INIT_FAIL);
+    SERIAL_ECHOLNRPGM(_i("SD init fail"));////MSG_SD_INIT_FAIL c=0 r=0
   }
   else if (!volume.init(&card))
   {
     SERIAL_ERROR_START;
-    SERIAL_ERRORLNRPGM(MSG_SD_VOL_INIT_FAIL);
+    SERIAL_ERRORLNRPGM(_i("volume.init failed"));////MSG_SD_VOL_INIT_FAIL c=0 r=0
   }
   else if (!root.openRoot(&volume)) 
   {
     SERIAL_ERROR_START;
-    SERIAL_ERRORLNRPGM(MSG_SD_OPENROOT_FAIL);
+    SERIAL_ERRORLNRPGM(_i("openRoot failed"));////MSG_SD_OPENROOT_FAIL c=0 r=0
   }
   else 
   {
     cardOK = true;
     SERIAL_ECHO_START;
-    SERIAL_ECHOLNRPGM(MSG_SD_CARD_OK);
+    SERIAL_ECHOLNRPGM(_i("SD card ok"));////MSG_SD_CARD_OK c=0 r=0
   }
   workDir=root;
   curDir=&root;
@@ -392,13 +392,13 @@ void CardReader::openFile(char* name,bool read, bool replace_current/*=true*/)
     if (file.open(curDir, fname, O_READ)) 
     {
       filesize = file.fileSize();
-      SERIAL_PROTOCOLRPGM(MSG_SD_FILE_OPENED);
+      SERIAL_PROTOCOLRPGM(_i("File opened: "));////MSG_SD_FILE_OPENED c=0 r=0
       SERIAL_PROTOCOL(fname);
-      SERIAL_PROTOCOLRPGM(MSG_SD_SIZE);
+      SERIAL_PROTOCOLRPGM(_n(" Size: "));////MSG_SD_SIZE c=0 r=0
       SERIAL_PROTOCOLLN(filesize);
       sdpos = 0;
       
-      SERIAL_PROTOCOLLNRPGM(MSG_SD_FILE_SELECTED);
+      SERIAL_PROTOCOLLNRPGM(_i("File selected"));////MSG_SD_FILE_SELECTED c=0 r=0
       getfilename(0, fname);
       lcd_setstatus(longFilename[0] ? longFilename : fname);
       lcd_setstatus("SD-PRINTING         ");
@@ -421,7 +421,7 @@ void CardReader::openFile(char* name,bool read, bool replace_current/*=true*/)
     else
     {
       saving = true;
-      SERIAL_PROTOCOLRPGM(MSG_SD_WRITE_TO_FILE);
+      SERIAL_PROTOCOLRPGM(_i("Writing to file: "));////MSG_SD_WRITE_TO_FILE c=0 r=0
       SERIAL_PROTOCOLLN(name);
       lcd_setstatus(fname);
     }
@@ -513,7 +513,7 @@ void CardReader::getStatus()
   if(sdprinting){
     SERIAL_PROTOCOL(longFilename);
     SERIAL_PROTOCOLPGM("\n");
-    SERIAL_PROTOCOLRPGM(MSG_SD_PRINTING_BYTE);
+    SERIAL_PROTOCOLRPGM(_i("SD printing byte "));////MSG_SD_PRINTING_BYTE c=0 r=0
     SERIAL_PROTOCOL(sdpos);
     SERIAL_PROTOCOLPGM("/");
     SERIAL_PROTOCOLLN(filesize);
@@ -673,7 +673,7 @@ void CardReader::chdir(const char * relpath)
   if(!newfile.open(*parent,relpath, O_READ))
   {
    SERIAL_ECHO_START;
-   SERIAL_ECHORPGM(MSG_SD_CANT_ENTER_SUBDIR);
+   SERIAL_ECHORPGM(_i("Cannot enter subdir: "));////MSG_SD_CANT_ENTER_SUBDIR c=0 r=0
    SERIAL_ECHOLN(relpath);
   }
   else
@@ -748,14 +748,14 @@ void CardReader::presort() {
 		// Never sort more than the max allowed
 		// If you use folders to organize, 20 may be enough
 		if (fileCnt > SDSORT_LIMIT) {
-			lcd_show_fullscreen_message_and_wait_P(MSG_FILE_CNT);
+			lcd_show_fullscreen_message_and_wait_P(_i("Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."));////MSG_FILE_CNT c=20 r=4
 			fileCnt = SDSORT_LIMIT;
 		}
 		lcd_implementation_clear();
 		#if !SDSORT_USES_RAM
 			lcd_set_progress();
 		#endif
-		lcd_print_at_PGM(0, 1, MSG_SORTING);
+		lcd_print_at_PGM(0, 1, _i("Sorting files"));////MSG_SORTING c=20 r=1
 
 		// Sort order is always needed. May be static or dynamic.
 		#if SDSORT_DYNAMIC_RAM

+ 5 - 5
Firmware/cmdqueue.cpp

@@ -425,7 +425,7 @@ void get_command()
 				  // M110 - set current line number.
 				  // Line numbers not sent in succession.
 				  SERIAL_ERROR_START;
-				  SERIAL_ERRORRPGM(MSG_ERR_LINE_NO);
+				  SERIAL_ERRORRPGM(_n("Line Number is not Last Line Number+1, Last Line: "));////MSG_ERR_LINE_NO c=0 r=0
 				  SERIAL_ERRORLN(gcode_LastN);
 				  //Serial.println(gcode_N);
 				  FlushSerialRequestResend();
@@ -441,7 +441,7 @@ void get_command()
 					  checksum = checksum^(*p++);
 				  if (int(strtol(strchr_pointer+1, NULL, 10)) != int(checksum)) {
 					  SERIAL_ERROR_START;
-					  SERIAL_ERRORRPGM(MSG_ERR_CHECKSUM_MISMATCH);
+					  SERIAL_ERRORRPGM(_i("checksum mismatch, Last Line: "));////MSG_ERR_CHECKSUM_MISMATCH c=0 r=0
 					  SERIAL_ERRORLN(gcode_LastN);
 					  FlushSerialRequestResend();
 					  serial_count = 0;
@@ -453,7 +453,7 @@ void get_command()
 			  else
 			  {
 				  SERIAL_ERROR_START;
-				  SERIAL_ERRORRPGM(MSG_ERR_NO_CHECKSUM);
+				  SERIAL_ERRORRPGM(_i("No Checksum with line number, Last Line: "));////MSG_ERR_NO_CHECKSUM c=0 r=0
 				  SERIAL_ERRORLN(gcode_LastN);
 				  FlushSerialRequestResend();
 				  serial_count = 0;
@@ -470,7 +470,7 @@ void get_command()
         {
 
             SERIAL_ERROR_START;
-            SERIAL_ERRORRPGM(MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM);
+            SERIAL_ERRORRPGM(_n("No Line Number with checksum, Last Line: "));////MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM c=0 r=0
             SERIAL_ERRORLN(gcode_LastN);
             serial_count = 0;
             return;
@@ -580,7 +580,7 @@ void get_command()
        serial_count >= (MAX_CMD_SIZE - 1) || n==-1)
     {
       if(card.eof()){
-        SERIAL_PROTOCOLLNRPGM(MSG_FILE_PRINTED);
+        SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED c=0 r=0
         stoptime=millis();
         char time[30];
         unsigned long t=(stoptime-starttime-pause_time)/1000;

+ 6 - 0
Firmware/config.h

@@ -18,4 +18,10 @@
 #define TMC2130_SPCR           SPI_SPCR(TMC2130_SPI_RATE, 1, 1, 1, 0)
 #define TMC2130_SPSR           SPI_SPSR(TMC2130_SPI_RATE)
 
+//LANG - Multi-language support
+#define LANG_MODE               0 // primary language only
+//#define LANG_MODE               1 // sec. language support
+#define LANG_SIZE_RESERVED 0x3000 // reserved space for secondary language (12kb)
+
+
 #endif //_CONFIG_H

+ 63 - 0
Firmware/language.c

@@ -0,0 +1,63 @@
+//language.c
+#include "language.h"
+#include <inttypes.h>
+#include <avr/pgmspace.h>
+
+
+// Currectly active language selection.
+unsigned char lang_selected = 0;
+
+#if (LANG_MODE == 0) //primary language only
+#else //(LANG_MODE == 0)
+//reserved xx kbytes for secondary language table
+static const char _SEC_LANG[LANG_SIZE_RESERVED] PROGMEM_I2 = "_SEC_LANG";
+#endif //(LANG_MODE == 0)
+
+//lang_table_t structure - 16byte header
+typedef struct
+{
+	struct
+	{
+		uint32_t magic;
+		uint16_t size;
+		uint16_t count;
+		uint16_t checksum;
+		uint16_t reserved0;
+		uint32_t reserved1;
+	} header;
+	uint16_t table[];
+} lang_table_t;
+
+//lang_table pointer
+lang_table_t* lang_table = 0;
+
+
+const char* lang_get_translation(const char* s)
+{
+	if (lang_selected == 0) return s + 2; //primary language selected
+	if (lang_table == 0) return s + 2; //sec. lang table not found
+	uint16_t ui = pgm_read_word(((uint16_t*)s)); //read string id
+	if (ui == 0xffff) return s + 2; //translation not found
+	ui = pgm_read_word(((uint16_t*)(((char*)lang_table + 16 + ui*2)))); //read relative offset
+	return (const char*)((char*)lang_table + ui + 16); //return calculated pointer
+}
+
+const char* lang_select(unsigned char lang)
+{
+#if (LANG_MODE == 0) //primary language only
+	return 0;
+#else //(LANG_MODE == 0)
+	if (lang == 0) //primary language
+	{
+		lang_table = 0;
+		lang_selected = 0;
+		return;
+	}
+	uint16_t ui = (uint16_t)&_SEC_LANG; //pointer to _SEC_LANG reserved space
+	ui += 0x0100; //add 1 page
+	ui &= 0xff00; //align to page
+	lang_table = ui; //set table pointer
+	ui = pgm_read_word(((uint16_t*)(((char*)lang_table + 16)))); //read relative offset of first string (language name)
+	return (const char*)((char*)lang_table + ui + 16); //return calculated pointer
+#endif //(LANG_MODE == 0)
+}

+ 61 - 7
Firmware/language.h

@@ -1,6 +1,9 @@
+//language.h
 #ifndef LANGUAGE_H
 #define LANGUAGE_H
 
+#include "config.h"
+
 #define PROTOCOL_VERSION "1.0"
 
 #ifdef CUSTOM_MENDEL_NAME
@@ -9,8 +12,6 @@
     #define MACHINE_NAME "Mendel"
 #endif
 
-
-
 #ifndef MACHINE_UUID
    #define MACHINE_UUID "00000000-0000-0000-0000-000000000000"
 #endif
@@ -20,14 +21,67 @@
 #define STRINGIFY_(n) #n
 #define STRINGIFY(n) STRINGIFY_(n)
 
+#if (LANG_MODE == 0)
+//#define _i PSTR
+//#define _I(s) (__extension__({static const char __c[] __attribute__((section("Txt_i"))) = s; &__c[0];}))
+#endif //(LANG_MODE == 0)
+
+//section progmem0 will be used for localized translated strings
+#define PROGMEM_I2 __attribute__((section(".progmem0")))
+//section progmem1 will be used for localized strings in english
+#define PROGMEM_I1 __attribute__((section(".progmem1")))
+//section progmem2 will be used for not localized strings in english
+#define PROGMEM_N1 __attribute__((section(".progmem2")))
+
+#if (LANG_MODE == 0) //primary language only
+#define _I(s) (__extension__({static const char __c[] PROGMEM_I1 = s; &__c[0];}))
+#define ISTR(s) s
+#define _i(s) _I(s)
+#define _T(s) s
+#else //(LANG_MODE == 0)
+#define _I(s) (__extension__({static const char __c[] PROGMEM_I1 = "\xff\xff"s; &__c[0];}))
+#define ISTR(s) "\xff\xff"s
+#define _i(s) lang_get_translation(_I(s))
+#define _T(s) lang_get_translation(s)
+#endif //(LANG_MODE == 0)
+#define _N(s) (__extension__({static const char __c[] PROGMEM_N1 = s; &__c[0];}))
+#define _n(s) _N(s)
+
+
+// Language indices into their particular symbol tables.
+#define LANG_ID_EN 0
+#define LANG_ID_CZ 1
+// Language is not defined and it shall be selected from the menu.
+#define LANG_ID_FORCE_SELECTION 254
+// Language is not defined on a virgin RAMBo board.
+#define LANG_ID_UNDEFINED 255
 
-// Common serial messages
-#define MSG_MARLIN "Marlin"
+// Default language ID, if no language is selected.
+#define LANG_ID_DEFAULT LANG_ID_CZ
 
-// Serial Console Messages (do not translate those!)
+// Number of languages available in the language table.
+#define LANG_NUM 2
 
 
-// LCD Menu Messages
-#include "language_all.h"
+#if defined(__cplusplus)
+extern "C" {
+#endif //defined(__cplusplus)
+
+// Currectly active language selection.
+extern unsigned char lang_selected;
+
+extern const char* lang_get_translation(const char* s);
+extern const char* lang_select(unsigned char lang);
+
+#if defined(__cplusplus)
+}
+#endif //defined(__cplusplus)
+
+#define CAT2(_s1, _s2) _s1
+#define CAT4(_s1, _s2, _s3, _s4) _s1
+#define MSG_LANGUAGE_NAME_EXPLICIT(i) ((i==0)?PSTR("ENG"):PSTR("CZE"))
+
+#include "messages.h"
 
 #endif //__LANGUAGE_H
+

+ 3 - 3
Firmware/mesh_bed_calibration.cpp

@@ -2197,7 +2197,7 @@ BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level
 		lcd_printPGM(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2);
 
 		if (iteration > 0) {
-			lcd_print_at_PGM(0, next_line + 1, MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION);
+			lcd_print_at_PGM(0, next_line + 1, _i("Iteration "));////MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION c=20 r=0
 			lcd_implementation_print(int(iteration + 1));
 		}
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
@@ -2455,7 +2455,7 @@ BedSkewOffsetDetectionResultType improve_bed_offset_and_skew(int8_t method, int8
 
 #ifdef MESH_BED_CALIBRATION_SHOW_LCD
     uint8_t next_line;
-    lcd_display_message_fullscreen_P(MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1, next_line);
+    lcd_display_message_fullscreen_P(_i("Improving bed calibration point"), next_line);////MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
     if (next_line > 3)
         next_line = 3;
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
@@ -2468,7 +2468,7 @@ BedSkewOffsetDetectionResultType improve_bed_offset_and_skew(int8_t method, int8
         // Print the decrasing ID of the measurement point.
 #ifdef MESH_BED_CALIBRATION_SHOW_LCD
         lcd_implementation_print_at(0, next_line, mesh_point+1);
-        lcd_printPGM(MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2);
+        lcd_printPGM(_i(" of 4"));////MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14 r=0
 #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
 
         // Move up.

+ 120 - 0
Firmware/messages.c

@@ -0,0 +1,120 @@
+//messages.c
+#include "language.h"
+
+//this is because we need include Configuration_prusa.h (CUSTOM_MENDEL_NAME)
+#define bool char
+#define true 1
+#define false 0
+#include "Configuration_prusa.h"
+
+//internationalized messages
+const char MSG_ALL[] PROGMEM_I1 = ISTR("All"); ////c=19 r=1
+const char MSG_AUTO_HOME[] PROGMEM_I1 = ISTR("Auto home"); ////c=0 r=0
+const char MSG_AUTO_MODE_ON[] PROGMEM_I1 = ISTR("Mode [auto power]"); ////c=0 r=0
+const char MSG_BABYSTEP_Z[] PROGMEM_I1 = ISTR("Live adjust Z"); ////c=0 r=0
+const char MSG_BABYSTEP_Z_NOT_SET[] PROGMEM_I1 = ISTR("Distance between tip of the nozzle and the bed surface has not been set yet. Please follow the manual, chapter First steps, section First layer calibration."); ////c=20 r=12
+const char MSG_BED[] PROGMEM_I1 = ISTR("Bed"); ////c=0 r=0
+const char MSG_BED_DONE[] PROGMEM_I1 = ISTR("Bed done"); ////c=0 r=0
+const char MSG_BED_HEATING[] PROGMEM_I1 = ISTR("Bed Heating"); ////c=0 r=0
+const char MSG_BED_LEVELING_FAILED_POINT_LOW[] PROGMEM_I1 = ISTR("Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."); ////c=20 r=4
+const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED[] PROGMEM_I1 = ISTR("XYZ calibration failed. Please consult the manual."); ////c=20 r=8
+const char MSG_CALIBRATE_Z_AUTO[] PROGMEM_I1 = ISTR("Calibrating Z"); ////c=20 r=2
+const char MSG_CARD_MENU[] PROGMEM_I1 = ISTR("Print from SD"); ////c=0 r=0
+const char MSG_CONFIRM_NOZZLE_CLEAN[] PROGMEM_I1 = ISTR("Please clean the nozzle for calibration. Click when done."); ////c=20 r=8
+const char MSG_COOLDOWN[] PROGMEM_I1 = ISTR("Cooldown"); ////c=0 r=0
+const char MSG_CRASH_DETECTED[] PROGMEM_I1 = ISTR("Crash detected."); ////c=20 r=1
+const char MSG_CRASHDETECT_NA[] PROGMEM_I1 = ISTR("Crash det. [N/A]"); ////c=0 r=0
+const char MSG_CRASHDETECT_OFF[] PROGMEM_I1 = ISTR("Crash det. [off]"); ////c=0 r=0
+const char MSG_CRASHDETECT_ON[] PROGMEM_I1 = ISTR("Crash det. [on]"); ////c=0 r=0
+const char MSG_ENDSTOP_HIT[] PROGMEM_I1 = ISTR("TRIGGERED"); ////c=0 r=0
+const char MSG_ENDSTOP_OPEN[] PROGMEM_I1 = ISTR("open"); ////c=0 r=0
+const char MSG_ENDSTOPS_HIT[] PROGMEM_I1 = ISTR("endstops hit: "); ////c=0 r=0
+const char MSG_Enqueing[] PROGMEM_I1 = ISTR("enqueing \""); ////c=0 r=0
+const char MSG_ERR_STOPPED[] PROGMEM_I1 = ISTR("Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"); ////c=0 r=0
+const char MSG_ERROR[] PROGMEM_I1 = ISTR("ERROR:"); ////c=0 r=0
+const char MSG_EXTRUDER[] PROGMEM_I1 = ISTR("Extruder"); ////c=17 r=1
+const char MSG_FAN_SPEED[] PROGMEM_I1 = ISTR("Fan speed"); ////c=14 r=0
+const char MSG_FILAMENT_CLEAN[] PROGMEM_I1 = ISTR("Filament extruding & with correct color?"); ////c=20 r=2
+const char MSG_FILAMENT_LOADING_T0[] PROGMEM_I1 = ISTR("Insert filament into extruder 1. Click when done."); ////c=20 r=4
+const char MSG_FILAMENT_LOADING_T1[] PROGMEM_I1 = ISTR("Insert filament into extruder 2. Click when done."); ////c=20 r=4
+const char MSG_FILAMENT_LOADING_T2[] PROGMEM_I1 = ISTR("Insert filament into extruder 3. Click when done."); ////c=20 r=4
+const char MSG_FILAMENT_LOADING_T3[] PROGMEM_I1 = ISTR("Insert filament into extruder 4. Click when done."); ////c=20 r=4
+const char MSG_FILAMENTCHANGE[] PROGMEM_I1 = ISTR("Change filament"); ////c=0 r=0
+const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1[] PROGMEM_I1 = ISTR("Searching bed calibration point"); ////c=60 r=0
+const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2[] PROGMEM_I1 = ISTR(" of 4"); ////c=14 r=0
+const char MSG_FINISHING_MOVEMENTS[] PROGMEM_I1 = ISTR("Finishing movements"); ////c=20 r=1
+const char MSG_FOLLOW_CALIBRATION_FLOW[] PROGMEM_I1 = ISTR("Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."); ////c=20 r=8
+const char MSG_FSENS_AUTOLOAD_NA[] PROGMEM_I1 = ISTR("F. autoload [N/A]"); ////c=17 r=1
+const char MSG_FSENSOR_OFF[] PROGMEM_I1 = ISTR("Fil. sensor [off]"); ////c=0 r=0
+const char MSG_FSENSOR_ON[] PROGMEM_I1 = ISTR("Fil. sensor [on]"); ////c=0 r=0
+const char MSG_HEATING[] PROGMEM_I1 = ISTR("Heating"); ////c=0 r=0
+const char MSG_HEATING_COMPLETE[] PROGMEM_I1 = ISTR("Heating done."); ////c=20 r=0
+const char MSG_HOMEYZ[] PROGMEM_I1 = ISTR("Calibrate Z"); ////c=0 r=0
+const char MSG_CHOOSE_EXTRUDER[] PROGMEM_I1 = ISTR("Choose extruder:"); ////c=20 r=1
+const char MSG_LOAD_FILAMENT[] PROGMEM_I1 = ISTR("Load filament"); ////c=17 r=0
+const char MSG_LOADING_FILAMENT[] PROGMEM_I1 = ISTR("Loading filament"); ////c=20 r=0
+const char MSG_M117_V2_CALIBRATION[] PROGMEM_I1 = ISTR("M117 First layer cal."); ////c=25 r=1
+const char MSG_MAIN[] PROGMEM_I1 = ISTR("Main"); ////c=0 r=0
+const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1[] PROGMEM_I1 = ISTR("Measuring reference height of calibration point"); ////c=60 r=0
+const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2[] PROGMEM_I1 = ISTR(" of 9"); ////c=14 r=0
+const char MSG_MENU_CALIBRATION[] PROGMEM_I1 = ISTR("Calibration"); ////c=0 r=0
+const char MSG_NO[] PROGMEM_I1 = ISTR("No"); ////c=0 r=0
+const char MSG_NOZZLE[] PROGMEM_I1 = ISTR("Nozzle"); ////c=0 r=0
+const char MSG_OK[] PROGMEM_I1 = ISTR("ok"); ////c=0 r=0
+const char MSG_PAPER[] PROGMEM_I1 = ISTR("Place a sheet of paper under the nozzle during the calibration of first 4 points. If the nozzle catches the paper, power off the printer immediately."); ////c=20 r=8
+const char MSG_PLACE_STEEL_SHEET[] PROGMEM_I1 = ISTR("Please place steel sheet on heatbed."); ////c=20 r=4
+const char MSG_PLEASE_WAIT[] PROGMEM_I1 = ISTR("Please wait"); ////c=20 r=0
+const char MSG_POWERUP[] PROGMEM_I1 = ISTR("PowerUp"); ////c=0 r=0
+const char MSG_PREHEAT_NOZZLE[] PROGMEM_I1 = ISTR("Preheat the nozzle!"); ////c=20 r=0
+const char MSG_PRESS_TO_UNLOAD[] PROGMEM_I1 = ISTR("Please press the knob to unload filament"); ////c=20 r=4
+const char MSG_PRINT_ABORTED[] PROGMEM_I1 = ISTR("Print aborted"); ////c=20 r=0
+const char MSG_PULL_OUT_FILAMENT[] PROGMEM_I1 = ISTR("Please pull out filament immediately"); ////c=20 r=4
+const char MSG_RECOVER_PRINT[] PROGMEM_I1 = ISTR("Blackout occurred. Recover print?"); ////c=20 r=2
+const char MSG_REFRESH[] PROGMEM_I1 = ISTR("\xF8" "Refresh"); ////c=0 r=0
+const char MSG_REMOVE_STEEL_SHEET[] PROGMEM_I1 = ISTR("Please remove steel sheet from heatbed."); ////c=20 r=4
+const char MSG_SD_ERR_WRITE_TO_FILE[] PROGMEM_I1 = ISTR("error writing to file"); ////c=0 r=0
+const char MSG_SD_OPEN_FILE_FAIL[] PROGMEM_I1 = ISTR("open failed, File: "); ////c=0 r=0
+const char MSG_SD_WORKDIR_FAIL[] PROGMEM_I1 = ISTR("workDir open failed"); ////c=0 r=0
+const char MSG_SELFTEST_COOLING_FAN[] PROGMEM_I1 = ISTR("Front print fan?"); ////c=20 r=0
+const char MSG_SELFTEST_EXTRUDER_FAN[] PROGMEM_I1 = ISTR("Left hotend fan?"); ////c=20 r=0
+const char MSG_SELFTEST_FAILED[] PROGMEM_I1 = ISTR("Selftest failed "); ////c=20 r=0
+const char MSG_SELFTEST_FAN[] PROGMEM_I1 = ISTR("Fan test"); ////c=20 r=0
+const char MSG_SELFTEST_FAN_NO[] PROGMEM_I1 = ISTR("Not spinning"); ////c=19 r=0
+const char MSG_SELFTEST_FAN_YES[] PROGMEM_I1 = ISTR("Spinning"); ////c=19 r=0
+const char MSG_SELFTEST_CHECK_BED[] PROGMEM_I1 = ISTR("Checking bed "); ////c=20 r=0
+const char MSG_SELFTEST_CHECK_FSENSOR[] PROGMEM_I1 = ISTR("Checking sensors "); ////c=20 r=0
+const char MSG_SELFTEST_MOTOR[] PROGMEM_I1 = ISTR("Motor"); ////c=0 r=0
+const char MSG_SELFTEST_WIRINGERROR[] PROGMEM_I1 = ISTR("Wiring error"); ////c=0 r=0
+const char MSG_SETTINGS[] PROGMEM_I1 = ISTR("Settings"); ////c=0 r=0
+const char MSG_SILENT_MODE_OFF[] PROGMEM_I1 = ISTR("Mode [high power]"); ////c=0 r=0
+const char MSG_SILENT_MODE_ON[] PROGMEM_I1 = ISTR("Mode [silent]"); ////c=0 r=0
+const char MSG_STEALTH_MODE_OFF[] PROGMEM_I1 = ISTR("Mode [Normal]"); ////c=0 r=0
+const char MSG_STEALTH_MODE_ON[] PROGMEM_I1 = ISTR("Mode [Stealth]"); ////c=0 r=0
+const char MSG_STEEL_SHEET_CHECK[] PROGMEM_I1 = ISTR("Is steel sheet on heatbed?"); ////c=20 r=2
+const char MSG_STOP_PRINT[] PROGMEM_I1 = ISTR("Stop print"); ////c=0 r=0
+const char MSG_STOPPED[] PROGMEM_I1 = ISTR("STOPPED. "); ////c=0 r=0
+const char MSG_TEMP_CALIBRATION[] PROGMEM_I1 = ISTR("Temp. cal. "); ////c=20 r=1
+const char MSG_TEMP_CALIBRATION_DONE[] PROGMEM_I1 = ISTR("Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."); ////c=20 r=12
+const char MSG_UNLOAD_FILAMENT[] PROGMEM_I1 = ISTR("Unload filament"); ////c=17 r=0
+const char MSG_UNLOADING_FILAMENT[] PROGMEM_I1 = ISTR("Unloading filament"); ////c=20 r=1
+const char MSG_WATCH[] PROGMEM_I1 = ISTR("Info screen"); ////c=0 r=0
+const char MSG_WIZARD_CALIBRATION_FAILED[] PROGMEM_I1 = ISTR("Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."); ////c=20 r=8
+const char MSG_WIZARD_DONE[] PROGMEM_I1 = ISTR("All is done. Happy printing!"); ////c=20 r=8
+const char MSG_WIZARD_HEATING[] PROGMEM_I1 = ISTR("Preheating nozzle. Please wait."); ////c=20 r=3
+const char MSG_WIZARD_QUIT[] PROGMEM_I1 = ISTR("You can always resume the Wizard from Calibration -> Wizard."); ////c=20 r=8
+const char MSG_YES[] PROGMEM_I1 = ISTR("Yes"); ////c=0 r=0
+const char WELCOME_MSG[] PROGMEM_I1 = ISTR(CUSTOM_MENDEL_NAME " ready."); ////c=20 r=0
+//not internationalized messages
+const char MSG_BROWNOUT_RESET[] PROGMEM_N1 = " Brown out Reset"; ////c=0 r=0
+const char MSG_EXTERNAL_RESET[] PROGMEM_N1 = " External Reset"; ////c=0 r=0
+const char MSG_FILE_SAVED[] PROGMEM_N1 = "Done saving file."; ////c=0 r=0
+const char MSG_OFF[] PROGMEM_N1 = "Off"; ////c=0 r=0
+const char MSG_ON[] PROGMEM_N1 = "On "; ////c=0 r=0
+const char MSG_POSITION_UNKNOWN[] PROGMEM_N1 = "Home X/Y before Z"; ////c=0 r=0
+const char MSG_SOFTWARE_RESET[] PROGMEM_N1 = " Software Reset"; ////c=0 r=0
+const char MSG_UNKNOWN_COMMAND[] PROGMEM_N1 = "Unknown command: \""; ////c=0 r=0
+const char MSG_WATCHDOG_RESET[] PROGMEM_N1 = " Watchdog Reset"; ////c=0 r=0
+const char MSG_Z_MAX[] PROGMEM_N1 = "z_max: "; ////c=0 r=0
+const char MSG_Z_MIN[] PROGMEM_N1 = "z_min: "; ////c=0 r=0
+const char MSG_ZPROBE_OUT[] PROGMEM_N1 = "Z probe out. bed"; ////c=0 r=0
+const char MSG_ZPROBE_ZOFFSET[] PROGMEM_N1 = "Z Offset"; ////c=0 r=0

+ 117 - 0
Firmware/messages.h

@@ -0,0 +1,117 @@
+//messages.h
+
+// Common serial messages
+#define MSG_MARLIN "Marlin"
+
+// LCD Menu Messages
+//internationalized messages
+extern const char MSG_ALL[];
+extern const char MSG_AUTO_HOME[];
+extern const char MSG_AUTO_MODE_ON[];
+extern const char MSG_BABYSTEP_Z[];
+extern const char MSG_BABYSTEP_Z_NOT_SET[];
+extern const char MSG_BED[];
+extern const char MSG_BED_DONE[];
+extern const char MSG_BED_HEATING[];
+extern const char MSG_BED_LEVELING_FAILED_POINT_LOW[];
+extern const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED[];
+extern const char MSG_CALIBRATE_Z_AUTO[];
+extern const char MSG_CARD_MENU[];
+extern const char MSG_CONFIRM_NOZZLE_CLEAN[];
+extern const char MSG_COOLDOWN[];
+extern const char MSG_CRASH_DETECTED[];
+extern const char MSG_CRASHDETECT_NA[];
+extern const char MSG_CRASHDETECT_OFF[];
+extern const char MSG_CRASHDETECT_ON[];
+extern const char MSG_ENDSTOP_HIT[];
+extern const char MSG_ENDSTOP_OPEN[];
+extern const char MSG_ENDSTOPS_HIT[];
+extern const char MSG_Enqueing[];
+extern const char MSG_ERR_STOPPED[];
+extern const char MSG_ERROR[];
+extern const char MSG_EXTRUDER[];
+extern const char MSG_FAN_SPEED[];
+extern const char MSG_FILAMENT_CLEAN[];
+extern const char MSG_FILAMENT_LOADING_T0[];
+extern const char MSG_FILAMENT_LOADING_T1[];
+extern const char MSG_FILAMENT_LOADING_T2[];
+extern const char MSG_FILAMENT_LOADING_T3[];
+extern const char MSG_FILAMENTCHANGE[];
+extern const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1[];
+extern const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2[];
+extern const char MSG_FINISHING_MOVEMENTS[];
+extern const char MSG_FOLLOW_CALIBRATION_FLOW[];
+extern const char MSG_FSENS_AUTOLOAD_NA[];
+extern const char MSG_FSENSOR_OFF[];
+extern const char MSG_FSENSOR_ON[];
+extern const char MSG_HEATING[];
+extern const char MSG_HEATING_COMPLETE[];
+extern const char MSG_HOMEYZ[];
+extern const char MSG_CHOOSE_EXTRUDER[];
+extern const char MSG_LOAD_FILAMENT[];
+extern const char MSG_LOADING_FILAMENT[];
+extern const char MSG_M117_V2_CALIBRATION[];
+extern const char MSG_MAIN[];
+extern const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1[];
+extern const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2[];
+extern const char MSG_MENU_CALIBRATION[];
+extern const char MSG_NO[];
+extern const char MSG_NOZZLE[];
+extern const char MSG_OK[];
+extern const char MSG_PAPER[];
+extern const char MSG_PLACE_STEEL_SHEET[];
+extern const char MSG_PLEASE_WAIT[];
+extern const char MSG_POWERUP[];
+extern const char MSG_PREHEAT_NOZZLE[];
+extern const char MSG_PRESS_TO_UNLOAD[];
+extern const char MSG_PRINT_ABORTED[];
+extern const char MSG_PULL_OUT_FILAMENT[];
+extern const char MSG_RECOVER_PRINT[];
+extern const char MSG_REFRESH[];
+extern const char MSG_REMOVE_STEEL_SHEET[];
+extern const char MSG_SD_ERR_WRITE_TO_FILE[];
+extern const char MSG_SD_OPEN_FILE_FAIL[];
+extern const char MSG_SD_WORKDIR_FAIL[];
+extern const char MSG_SELFTEST_COOLING_FAN[];
+extern const char MSG_SELFTEST_EXTRUDER_FAN[];
+extern const char MSG_SELFTEST_FAILED[];
+extern const char MSG_SELFTEST_FAN[];
+extern const char MSG_SELFTEST_FAN_NO[];
+extern const char MSG_SELFTEST_FAN_YES[];
+extern const char MSG_SELFTEST_CHECK_BED[];
+extern const char MSG_SELFTEST_CHECK_FSENSOR[];
+extern const char MSG_SELFTEST_MOTOR[];
+extern const char MSG_SELFTEST_WIRINGERROR[];
+extern const char MSG_SETTINGS[];
+extern const char MSG_SILENT_MODE_OFF[];
+extern const char MSG_SILENT_MODE_ON[];
+extern const char MSG_STEALTH_MODE_OFF[];
+extern const char MSG_STEALTH_MODE_ON[];
+extern const char MSG_STEEL_SHEET_CHECK[];
+extern const char MSG_STOP_PRINT[];
+extern const char MSG_STOPPED[];
+extern const char MSG_TEMP_CALIBRATION[];
+extern const char MSG_TEMP_CALIBRATION_DONE[];
+extern const char MSG_UNLOAD_FILAMENT[];
+extern const char MSG_UNLOADING_FILAMENT[];
+extern const char MSG_WATCH[];
+extern const char MSG_WIZARD_CALIBRATION_FAILED[];
+extern const char MSG_WIZARD_DONE[];
+extern const char MSG_WIZARD_HEATING[];
+extern const char MSG_WIZARD_QUIT[];
+extern const char MSG_YES[];
+extern const char WELCOME_MSG[];
+//not internationalized messages
+extern const char MSG_BROWNOUT_RESET[];
+extern const char MSG_EXTERNAL_RESET[];
+extern const char MSG_FILE_SAVED[];
+extern const char MSG_OFF[];
+extern const char MSG_ON[];
+extern const char MSG_POSITION_UNKNOWN[];
+extern const char MSG_SOFTWARE_RESET[];
+extern const char MSG_UNKNOWN_COMMAND[];
+extern const char MSG_WATCHDOG_RESET[];
+extern const char MSG_Z_MAX[];
+extern const char MSG_Z_MIN[];
+extern const char MSG_ZPROBE_OUT[];
+extern const char MSG_ZPROBE_ZOFFSET[];

+ 2 - 2
Firmware/planner.cpp

@@ -742,7 +742,7 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate
       de_float = 0;
 #endif
       SERIAL_ECHO_START;
-      SERIAL_ECHOLNRPGM(MSG_ERR_COLD_EXTRUDE_STOP);
+      SERIAL_ECHOLNRPGM(_i(" cold extrusion prevented"));////MSG_ERR_COLD_EXTRUDE_STOP c=0 r=0
     }
     
     #ifdef PREVENT_LENGTHY_EXTRUDE
@@ -754,7 +754,7 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate
         de_float = 0;
 #endif
       SERIAL_ECHO_START;
-      SERIAL_ECHOLNRPGM(MSG_ERR_LONG_EXTRUDE_STOP);
+      SERIAL_ECHOLNRPGM(_n(" too long extrusion prevented"));////MSG_ERR_LONG_EXTRUDE_STOP c=0 r=0
     }
     #endif
   }

+ 1 - 1
Firmware/stepper.cpp

@@ -342,7 +342,7 @@ FORCE_INLINE unsigned short calc_timer(uint16_t step_rate) {
     timer = (unsigned short)pgm_read_word_near(table_address);
     timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3);
   }
-  if(timer < 100) { timer = 100; MYSERIAL.print(MSG_STEPPER_TOO_HIGH); MYSERIAL.println(step_rate); }//(20kHz this should never happen)
+  if(timer < 100) { timer = 100; MYSERIAL.print(_i("Steprate too high: ")); MYSERIAL.println(step_rate); }//(20kHz this should never happen)////MSG_STEPPER_TOO_HIGH c=0 r=0
   return timer;
 }
 

+ 185 - 185
Firmware/ultralcd.cpp

@@ -604,7 +604,7 @@ static void lcd_status_screen()
 
   /*if (farm_mode && !printer_connected) {
 	  lcd.setCursor(0, 3);
-	  lcd_printPGM(MSG_PRINTER_DISCONNECTED);
+	  lcd_printPGM(_i("Printer disconnected"));////MSG_PRINTER_DISCONNECTED c=20 r=1
   }*/
 
 
@@ -639,7 +639,7 @@ void lcd_commands()
 			}
 		}
 		if (lcd_commands_step == 1 && !blocks_queued() && !homing_flag) {
-			lcd_setstatuspgm(MSG_PRINT_PAUSED);
+			lcd_setstatuspgm(_i("Print paused"));////MSG_PRINT_PAUSED c=20 r=1
 			isPrintPaused = true;
 			long_pause();
 			lcd_commands_type = 0;
@@ -703,7 +703,7 @@ void lcd_commands()
 			strcat(cmd1, ftostr32(pause_lastpos[Y_AXIS]));
 			enquecommand(cmd1);
 			
-			lcd_setstatuspgm(MSG_RESUMING_PRINT);
+			lcd_setstatuspgm(_i("Resuming print"));////MSG_RESUMING_PRINT c=20 r=1
 			lcd_commands_step = 3;
 		}
 	}
@@ -1363,13 +1363,13 @@ void lcd_commands()
 			strcpy(cmd1, "M303 E0 S");
 			strcat(cmd1, ftostr3(pid_temp));
 			enquecommand(cmd1);
-			lcd_setstatuspgm(MSG_PID_RUNNING);
+			lcd_setstatuspgm(_i("PID cal.           "));////MSG_PID_RUNNING c=20 r=1
 			lcd_commands_step = 2;
 		}
 		if (lcd_commands_step == 2 && pid_tuning_finished) { //saving to eeprom
 			pid_tuning_finished = false;
 			custom_message_state = 0;
-			lcd_setstatuspgm(MSG_PID_FINISHED);
+			lcd_setstatuspgm(_i("PID cal. finished"));////MSG_PID_FINISHED c=20 r=1
 			if (_Kp != 0 || _Ki != 0 || _Kd != 0) {
 			strcpy(cmd1, "M301 P");
 			strcat(cmd1, ftostr32(_Kp));
@@ -1534,7 +1534,7 @@ static void lcd_menu_extruder_info()
     // Display Nozzle fan RPM
     
     lcd.setCursor(0, 0);
-    lcd_printPGM(MSG_INFO_NOZZLE_FAN);
+    lcd_printPGM(_i("Nozzle FAN:"));////MSG_INFO_NOZZLE_FAN c=11 r=1
     
     lcd.setCursor(11, 0);
     lcd.print("         ");
@@ -1546,7 +1546,7 @@ static void lcd_menu_extruder_info()
     
 #if (defined(TACH_1))
     lcd.setCursor(0, 1);
-    lcd_printPGM(MSG_INFO_PRINT_FAN);
+    lcd_printPGM(_i("Print FAN: "));////MSG_INFO_PRINT_FAN c=11 r=1
     
     lcd.setCursor(11, 1);
     lcd.print("         ");
@@ -1817,15 +1817,15 @@ static void lcd_support_menu()
       MENU_ITEM(back, PSTR("FW - " FW_version), 0);
   }*/
       
-  MENU_ITEM(back, MSG_PRUSA3D, 0);
-  MENU_ITEM(back, MSG_PRUSA3D_FORUM, 0);
-  MENU_ITEM(back, MSG_PRUSA3D_HOWTO, 0);
+  MENU_ITEM(back, _i("prusa3d.com"), 0);////MSG_PRUSA3D c=0 r=0
+  MENU_ITEM(back, _i("forum.prusa3d.com"), 0);////MSG_PRUSA3D_FORUM c=0 r=0
+  MENU_ITEM(back, _i("howto.prusa3d.com"), 0);////MSG_PRUSA3D_HOWTO c=0 r=0
   MENU_ITEM(back, PSTR("------------"), 0);
   MENU_ITEM(back, PSTR(FILAMENT_SIZE), 0);
   MENU_ITEM(back, PSTR(ELECTRONICS),0);
   MENU_ITEM(back, PSTR(NOZZLE_TYPE),0);
   MENU_ITEM(back, PSTR("------------"), 0);
-  MENU_ITEM(back, MSG_DATE, 0);
+  MENU_ITEM(back, _i("Date:"), 0);////MSG_DATE c=17 r=1
   MENU_ITEM(back, PSTR(__DATE__), 0);
 
   // Show the FlashAir IP address, if the card is available.
@@ -1836,17 +1836,17 @@ static void lcd_support_menu()
   }
   #ifndef MK1BP
   MENU_ITEM(back, PSTR("------------"), 0);
-  MENU_ITEM(submenu, MSG_XYZ_DETAILS, lcd_menu_xyz_y_min);
-  MENU_ITEM(submenu, MSG_INFO_EXTRUDER, lcd_menu_extruder_info);
+  MENU_ITEM(submenu, _i("XYZ cal. details"), lcd_menu_xyz_y_min);////MSG_XYZ_DETAILS c=19 r=1
+  MENU_ITEM(submenu, _i("Extruder info"), lcd_menu_extruder_info);////MSG_INFO_EXTRUDER c=15 r=1
 
 #ifdef TMC2130
-  MENU_ITEM(submenu, MSG_MENU_BELT_STATUS, lcd_menu_belt_status);
+  MENU_ITEM(submenu, _i("Belt status"), lcd_menu_belt_status);////MSG_MENU_BELT_STATUS c=15 r=1
 #endif //TMC2130
     
-  MENU_ITEM(submenu, MSG_MENU_TEMPERATURES, lcd_menu_temperatures);
+  MENU_ITEM(submenu, _i("Temperatures"), lcd_menu_temperatures);////MSG_MENU_TEMPERATURES c=15 r=1
 
 #if defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN)
-  MENU_ITEM(submenu, MSG_MENU_VOLTAGES, lcd_menu_voltages);
+  MENU_ITEM(submenu, _i("Voltages"), lcd_menu_voltages);////MSG_MENU_VOLTAGES c=15 r=1
 #endif //defined VOLT_BED_PIN || defined VOLT_PWR_PIN
 
 #ifdef DEBUG_BUILD
@@ -1897,7 +1897,7 @@ void lcd_change_filament() {
 
   lcd.setCursor(0, 1);
 
-  lcd_printPGM(MSG_CHANGING_FILAMENT);
+  lcd_printPGM(_i("Changing filament!"));////MSG_CHANGING_FILAMENT c=20 r=0
 
 
 }
@@ -1909,12 +1909,12 @@ void lcd_wait_interact() {
 
   lcd.setCursor(0, 1);
 #ifdef SNMM 
-  lcd_printPGM(MSG_PREPARE_FILAMENT);
+  lcd_printPGM(_i("Prepare new filament"));////MSG_PREPARE_FILAMENT c=20 r=1
 #else
-  lcd_printPGM(MSG_INSERT_FILAMENT);
+  lcd_printPGM(_i("Insert filament"));////MSG_INSERT_FILAMENT c=20 r=0
 #endif
   lcd.setCursor(0, 2);
-  lcd_printPGM(MSG_PRESS);
+  lcd_printPGM(_i("and press the knob"));////MSG_PRESS c=20 r=0
 
 }
 
@@ -1925,7 +1925,7 @@ void lcd_change_success() {
 
   lcd.setCursor(0, 2);
 
-  lcd_printPGM(MSG_CHANGE_SUCCESS);
+  lcd_printPGM(_i("Change success!"));////MSG_CHANGE_SUCCESS c=0 r=0
 
 
 }
@@ -1937,7 +1937,7 @@ void lcd_loading_color() {
 
   lcd.setCursor(0, 0);
 
-  lcd_printPGM(MSG_LOADING_COLOR);
+  lcd_printPGM(_i("Loading color"));////MSG_LOADING_COLOR c=0 r=0
   lcd.setCursor(0, 2);
   lcd_printPGM(MSG_PLEASE_WAIT);
 
@@ -2004,7 +2004,7 @@ void lcd_alright() {
 
   lcd.setCursor(0, 0);
 
-  lcd_printPGM(MSG_CORRECTLY);
+  lcd_printPGM(_i("Changed correctly?"));////MSG_CORRECTLY c=20 r=0
 
   lcd.setCursor(1, 1);
 
@@ -2012,11 +2012,11 @@ void lcd_alright() {
 
   lcd.setCursor(1, 2);
 
-  lcd_printPGM(MSG_NOT_LOADED);
+  lcd_printPGM(_i("Filament not loaded"));////MSG_NOT_LOADED c=19 r=0
 
 
   lcd.setCursor(1, 3);
-  lcd_printPGM(MSG_NOT_COLOR);
+  lcd_printPGM(_i("Color not correct"));////MSG_NOT_COLOR c=0 r=0
 
 
   lcd.setCursor(0, 1);
@@ -2087,7 +2087,7 @@ static void lcd_menu_AutoLoadFilament()
     if (degHotend0() > EXTRUDE_MINTEMP)
     {
         uint8_t nlines;
-        lcd_display_message_fullscreen_nonBlocking_P(MSG_AUTOLOADING_ENABLED,nlines);
+        lcd_display_message_fullscreen_nonBlocking_P(_i("Autoloading filament is active, just press the knob and insert filament..."),nlines);////MSG_AUTOLOADING_ENABLED c=20 r=4
     }
     else
     {
@@ -2140,7 +2140,7 @@ void lcd_menu_statistics()
 		int _s = _t - ((_h * 3600) + (_m * 60));
 		
 		lcd.setCursor(0, 0);
-		lcd_printPGM(MSG_STATS_FILAMENTUSED);
+		lcd_printPGM(_i("Filament used:  "));////MSG_STATS_FILAMENTUSED c=20 r=0
 
 		lcd.setCursor(6, 1);
 		lcd.print(itostr3(_met));
@@ -2149,7 +2149,7 @@ void lcd_menu_statistics()
 		lcd.print("cm");
 		
 		lcd.setCursor(0, 2);
-		lcd_printPGM(MSG_STATS_PRINTTIME);
+		lcd_printPGM(_i("Print time:  "));////MSG_STATS_PRINTTIME c=20 r=0
 
 		lcd.setCursor(8, 3);
 		lcd.print(itostr2(_h));
@@ -2184,7 +2184,7 @@ void lcd_menu_statistics()
 		lcd_implementation_clear();
 
 		lcd.setCursor(0, 0);
-		lcd_printPGM(MSG_STATS_TOTALFILAMENT);
+		lcd_printPGM(_i("Total filament :"));////MSG_STATS_TOTALFILAMENT c=20 r=0
 		lcd.setCursor(17 - strlen(ftostr32ns(_filament_m)), 1);
 		lcd.print(ftostr32ns(_filament_m));
 
@@ -2201,7 +2201,7 @@ void lcd_menu_statistics()
 		lcd.print("m");
 
 		lcd.setCursor(0, 2);
-		lcd_printPGM(MSG_STATS_TOTALPRINTTIME);;
+		lcd_printPGM(_i("Total print time :"));;////MSG_STATS_TOTALPRINTTIME c=20 r=0
 
 		lcd.setCursor(18, 3);
 		lcd.print("m");
@@ -2304,10 +2304,10 @@ static void lcd_move_e()
 static void lcd_menu_xyz_y_min()
 {
     lcd.setCursor(0,0);
-    lcd_printPGM(MSG_Y_DISTANCE_FROM_MIN);
+    lcd_printPGM(_i("Y distance from min:"));////MSG_Y_DISTANCE_FROM_MIN c=20 r=1
     lcd_print_at_PGM(0, 1, separator);
-    lcd_print_at_PGM(0, 2, MSG_LEFT);
-    lcd_print_at_PGM(0, 3, MSG_RIGHT);
+    lcd_print_at_PGM(0, 2, _i("Left:"));////MSG_LEFT c=12 r=1
+    lcd_print_at_PGM(0, 3, _i("Right:"));////MSG_RIGHT c=12 r=1
 
     float distanceMin[2];
     count_xyz_details(distanceMin);
@@ -2333,18 +2333,18 @@ static void lcd_menu_xyz_skew()
     angleDiff = eeprom_read_float((float*)(EEPROM_XYZ_CAL_SKEW));
 
     lcd.setCursor(0,0);
-    lcd_printPGM(MSG_MEASURED_SKEW);
+    lcd_printPGM(_i("Measured skew:"));////MSG_MEASURED_SKEW c=15 r=1
     if (angleDiff < 100) {
         lcd.setCursor(15, 0);
         lcd.print(angleDiff * 180 / M_PI);
         lcd.print(LCD_STR_DEGREE);
     }else lcd_print_at_PGM(16, 0, PSTR("N/A"));
     lcd_print_at_PGM(0, 1, separator);
-    lcd_print_at_PGM(0, 2, MSG_SLIGHT_SKEW);
+    lcd_print_at_PGM(0, 2, _i("Slight skew:"));////MSG_SLIGHT_SKEW c=15 r=1
     lcd_print_at_PGM(15, 2, PSTR(""));
     lcd.print(bed_skew_angle_mild * 180 / M_PI);
     lcd.print(LCD_STR_DEGREE);
-    lcd_print_at_PGM(0, 3, MSG_SEVERE_SKEW);
+    lcd_print_at_PGM(0, 3, _i("Severe skew:"));////MSG_SEVERE_SKEW c=15 r=1
     lcd_print_at_PGM(15, 3, PSTR(""));
     lcd.print(bed_skew_angle_extreme * 180 / M_PI);
     lcd.print(LCD_STR_DEGREE);
@@ -2360,7 +2360,7 @@ static void lcd_menu_xyz_skew()
 static void lcd_menu_xyz_offset()
 {
     lcd.setCursor(0,0);
-    lcd_printPGM(MSG_MEASURED_OFFSET);
+    lcd_printPGM(_i("[0;0] point offset"));////MSG_MEASURED_OFFSET c=0 r=0
     lcd_print_at_PGM(0, 1, separator);
     lcd_print_at_PGM(0, 2, PSTR("X"));
     lcd_print_at_PGM(0, 3, PSTR("Y"));
@@ -2479,13 +2479,13 @@ static void _lcd_babystep(int axis, const char *msg)
 }
 
 static void lcd_babystep_x() {
-  _lcd_babystep(X_AXIS, (MSG_BABYSTEPPING_X));
+  _lcd_babystep(X_AXIS, (_i("Babystepping X")));////MSG_BABYSTEPPING_X c=0 r=0
 }
 static void lcd_babystep_y() {
-  _lcd_babystep(Y_AXIS, (MSG_BABYSTEPPING_Y));
+  _lcd_babystep(Y_AXIS, (_i("Babystepping Y")));////MSG_BABYSTEPPING_Y c=0 r=0
 }
 static void lcd_babystep_z() {
-	_lcd_babystep(Z_AXIS, (MSG_BABYSTEPPING_Z));
+	_lcd_babystep(Z_AXIS, (_i("Adjusting Z")));////MSG_BABYSTEPPING_Z c=20 r=0
 }
 
 static void lcd_adjust_bed();
@@ -2561,11 +2561,11 @@ static void lcd_adjust_bed()
 
     START_MENU();
     MENU_ITEM(back, MSG_SETTINGS, 0);
-    MENU_ITEM_EDIT(int3, MSG_BED_CORRECTION_LEFT,  &menuData.adjustBed.left2,  -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
-    MENU_ITEM_EDIT(int3, MSG_BED_CORRECTION_RIGHT, &menuData.adjustBed.right2, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
-    MENU_ITEM_EDIT(int3, MSG_BED_CORRECTION_FRONT, &menuData.adjustBed.front2, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
-    MENU_ITEM_EDIT(int3, MSG_BED_CORRECTION_REAR,  &menuData.adjustBed.rear2,  -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
-    MENU_ITEM(function, MSG_BED_CORRECTION_RESET, lcd_adjust_bed_reset);
+    MENU_ITEM_EDIT(int3, _i("Left side [um]"),  &menuData.adjustBed.left2,  -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);////MSG_BED_CORRECTION_LEFT c=14 r=1
+    MENU_ITEM_EDIT(int3, _i("Right side[um]"), &menuData.adjustBed.right2, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);////MSG_BED_CORRECTION_RIGHT c=14 r=1
+    MENU_ITEM_EDIT(int3, _i("Front side[um]"), &menuData.adjustBed.front2, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);////MSG_BED_CORRECTION_FRONT c=14 r=1
+    MENU_ITEM_EDIT(int3, _i("Rear side [um]"),  &menuData.adjustBed.rear2,  -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);////MSG_BED_CORRECTION_REAR c=14 r=1
+    MENU_ITEM(function, _i("Reset"), lcd_adjust_bed_reset);////MSG_BED_CORRECTION_RESET c=0 r=0
     END_MENU();
 }
 
@@ -2573,7 +2573,7 @@ void pid_extruder() {
 
 	lcd_implementation_clear();
 	lcd.setCursor(1, 0);
-	lcd_printPGM(MSG_SET_TEMPERATURE);
+	lcd_printPGM(_i("Set temperature:"));////MSG_SET_TEMPERATURE c=19 r=1
 	pid_temp += int(encoderPosition);
 	if (pid_temp > HEATER_0_MAXTEMP) pid_temp = HEATER_0_MAXTEMP;
 	if (pid_temp < HEATER_0_MINTEMP) pid_temp = HEATER_0_MINTEMP;
@@ -2598,7 +2598,7 @@ void lcd_adjust_z() {
 
   lcd_implementation_clear();
   lcd.setCursor(0, 0);
-  lcd_printPGM(MSG_ADJUSTZ);
+  lcd_printPGM(_i("Auto adjust Z?"));////MSG_ADJUSTZ c=0 r=0
   lcd.setCursor(1, 1);
   lcd_printPGM(MSG_YES);
 
@@ -2681,7 +2681,7 @@ bool lcd_wait_for_pinda(float temp) {
 	bool target_temp_reached = true;
 
 	while (current_temperature_pinda > temp){
-		lcd_display_message_fullscreen_P(MSG_WAITING_TEMP_PINDA);
+		lcd_display_message_fullscreen_P(_i("Waiting for PINDA probe cooling"));////MSG_WAITING_TEMP_PINDA c=20 r=3
 
 		lcd.setCursor(0, 4);
 		lcd.print(LCD_STR_THERMOMETER[0]);
@@ -2717,7 +2717,7 @@ void lcd_wait_for_cool_down() {
 	setTargetHotend(0,0);
 	setTargetBed(0);
 	while ((degHotend(0)>MAX_HOTEND_TEMP_CALIBRATION) || (degBed() > MAX_BED_TEMP_CALIBRATION)) {
-		lcd_display_message_fullscreen_P(MSG_WAITING_TEMP);
+		lcd_display_message_fullscreen_P(_i("Waiting for nozzle and bed cooling"));////MSG_WAITING_TEMP c=20 r=3
 
 		lcd.setCursor(0, 4);
 		lcd.print(LCD_STR_THERMOMETER[0]);
@@ -2754,7 +2754,7 @@ bool lcd_calibrate_z_end_stop_manual(bool only_z)
     // Until confirmed by the confirmation dialog.
     for (;;) {
         unsigned long previous_millis_cmd = millis();
-        const char   *msg                 = only_z ? MSG_MOVE_CARRIAGE_TO_THE_TOP_Z : MSG_MOVE_CARRIAGE_TO_THE_TOP;
+        const char   *msg                 = only_z ? _i("Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done.") : _i("Calibrating XYZ. Rotate the knob to move the Z carriage up to the end stoppers. Click when done.");////MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8////MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
         const char   *msg_next            = lcd_display_message_fullscreen_P(msg);
         const bool    multi_screen        = msg_next != NULL;
         unsigned long previous_millis_msg = millis();
@@ -2801,7 +2801,7 @@ bool lcd_calibrate_z_end_stop_manual(bool only_z)
 		
 
         // Let the user confirm, that the Z carriage is at the top end stoppers.
-        int8_t result = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_CONFIRM_CARRIAGE_AT_THE_TOP, false);
+        int8_t result = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Are left and right Z~carriages all up?"), false);////MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
         if (result == -1)
             goto canceled;
         else if (result == 1)
@@ -3117,31 +3117,31 @@ void lcd_bed_calibration_show_result(BedSkewOffsetDetectionResultType result, ui
 {
     const char *msg = NULL;
     if (result == BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND) {
-        lcd_show_fullscreen_message_and_wait_P(MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND);
+        lcd_show_fullscreen_message_and_wait_P(_i("XYZ calibration failed. Bed calibration point was not found."));////MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=8
     } else if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED) {
         if (point_too_far_mask == 0)
             msg = MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED;
         else if (point_too_far_mask == 2 || point_too_far_mask == 7)
             // Only the center point or all the three front points.
-            msg = MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR;
+            msg = _i("XYZ calibration failed. Front calibration points not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=8
         else if (point_too_far_mask & 1 == 0)
             // The right and maybe the center point out of reach.
-            msg = MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR;
+            msg = _i("XYZ calibration failed. Right front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=8
         else
             // The left and maybe the center point out of reach.
-            msg = MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR;
+            msg = _i("XYZ calibration failed. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
         lcd_show_fullscreen_message_and_wait_P(msg);
     } else {
         if (point_too_far_mask != 0) {
             if (point_too_far_mask == 2 || point_too_far_mask == 7)
                 // Only the center point or all the three front points.
-                msg = MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR;
+                msg = _i("XYZ calibration compromised. Front calibration points not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
             else if (point_too_far_mask & 1 == 0)
                 // The right and maybe the center point out of reach.
-                msg = MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR;
+                msg = _i("XYZ calibration compromised. Right front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
             else
                 // The left and maybe the center point out of reach.
-                msg = MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR;
+                msg = _i("XYZ calibration compromised. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
             lcd_show_fullscreen_message_and_wait_P(msg);
         }
         if (point_too_far_mask == 0 || result > 0) {
@@ -3151,13 +3151,13 @@ void lcd_bed_calibration_show_result(BedSkewOffsetDetectionResultType result, ui
                     msg = MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED;
                     break;
                 case BED_SKEW_OFFSET_DETECTION_PERFECT:
-                    msg = MSG_BED_SKEW_OFFSET_DETECTION_PERFECT;
+                    msg = _i("XYZ calibration ok. X/Y axes are perpendicular. Congratulations!");////MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
                     break;
                 case BED_SKEW_OFFSET_DETECTION_SKEW_MILD:
-                    msg = MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD;
+                    msg = _i("XYZ calibration all right. X/Y axes are slightly skewed. Good job!");////MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
                     break;
                 case BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME:
-                    msg = MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME;
+                    msg = _i("XYZ calibration all right. Skew will be corrected automatically.");////MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
                     break;
             }
             lcd_show_fullscreen_message_and_wait_P(msg);
@@ -3187,7 +3187,7 @@ void lcd_temp_cal_show_result(bool result) {
 	else {
 		eeprom_update_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 0);
 		SERIAL_ECHOLNPGM("Temperature calibration failed. Continue with pressing the knob.");
-		lcd_show_fullscreen_message_and_wait_P(MSG_TEMP_CAL_FAILED);
+		lcd_show_fullscreen_message_and_wait_P(_i("Temperature calibration failed"));////MSG_TEMP_CAL_FAILED c=20 r=8
 		temp_cal_active = false;
 		eeprom_update_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE, 0);
 	}
@@ -3461,7 +3461,7 @@ void lcd_pick_babystep(){
     
     lcd.setCursor(0, 0);
     
-    lcd_printPGM(MSG_PICK_Z);
+    lcd_printPGM(_i("Pick print"));////MSG_PICK_Z c=0 r=0
     
     
     lcd.setCursor(3, 2);
@@ -3555,10 +3555,10 @@ void lcd_move_menu_axis()
 {
 	START_MENU();
 	MENU_ITEM(back, MSG_SETTINGS, 0);
-	MENU_ITEM(submenu, MSG_MOVE_X, lcd_move_x);
-	MENU_ITEM(submenu, MSG_MOVE_Y, lcd_move_y);
-	MENU_ITEM(submenu, MSG_MOVE_Z, lcd_move_z);
-	MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_e);
+	MENU_ITEM(submenu, _i("Move X"), lcd_move_x);////MSG_MOVE_X c=0 r=0
+	MENU_ITEM(submenu, _i("Move Y"), lcd_move_y);////MSG_MOVE_Y c=0 r=0
+	MENU_ITEM(submenu, _i("Move Z"), lcd_move_z);////MSG_MOVE_Z c=0 r=0
+	MENU_ITEM(submenu, _i("Extruder"), lcd_move_e);////MSG_MOVE_E c=0 r=0
 	END_MENU();
 }
 
@@ -3611,7 +3611,7 @@ static void lcd_crash_mode_info()
 	static uint32_t tim = 0;
 	if ((tim + 1000) < millis())
 	{
-		fputs_P(MSG_CRASH_DET_ONLY_IN_NORMAL, lcdout);
+		fputs_P(_i("Crash detection canbe turned on only inNormal mode"), lcdout);////MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
 		tim = millis();
 	}
 	if (lcd_clicked())
@@ -3624,7 +3624,7 @@ static void lcd_crash_mode_info2()
 	static uint32_t tim = 0;
 	if ((tim + 1000) < millis())
 	{
-		fputs_P(MSG_CRASH_DET_STEALTH_FORCE_OFF, lcdout);
+		fputs_P(_i("WARNING:Crash detectiondisabled inStealth mode"), lcdout);////MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
 		tim = millis();
 	}
 	if (lcd_clicked())
@@ -3635,12 +3635,12 @@ static void lcd_crash_mode_info2()
 #ifdef PAT9125
 static void lcd_filament_autoload_info()
 {
-    lcd_show_fullscreen_message_and_wait_P(MSG_AUTOLOADING_ONLY_IF_FSENS_ON);
+    lcd_show_fullscreen_message_and_wait_P(_i("Autoloading filament available only when filament sensor is turned on..."));////MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
 }
 
 static void lcd_fsensor_fail()
 {
-    lcd_show_fullscreen_message_and_wait_P(MSG_FSENS_NOT_RESPONDING);
+    lcd_show_fullscreen_message_and_wait_P(_i("ERROR: Filament sensor is not responding, please check connection."));////MSG_FSENS_NOT_RESPONDING c=20 r=4
 }
 #endif //PAT9125
 
@@ -3782,7 +3782,7 @@ void lcd_pinda_calibration_menu()
 {
 	START_MENU();
 		MENU_ITEM(back, MSG_MENU_CALIBRATION, 0);
-		MENU_ITEM(submenu, MSG_CALIBRATE_PINDA, lcd_calibrate_pinda);
+		MENU_ITEM(submenu, _i("Calibrate"), lcd_calibrate_pinda);////MSG_CALIBRATE_PINDA c=17 r=1
 	END_MENU();
 }
 
@@ -3823,12 +3823,12 @@ void lcd_calibrate_pinda() {
 		float e_steps_per_unit;
 		float feedrate = (180 / axis_steps_per_unit[E_AXIS]) * 1;	//3	//initial automatic extrusion feedrate (depends on current value of axis_steps_per_unit to avoid too fast extrusion)
 		float e_shift_calibration = (axis_steps_per_unit[E_AXIS] > 180 ) ? ((180 / axis_steps_per_unit[E_AXIS]) * 70): 70; //length of initial automatic extrusion sequence
-		const char   *msg_e_cal_knob = MSG_E_CAL_KNOB;
+		const char   *msg_e_cal_knob = _i("Rotate knob until mark reaches extruder body. Click when done.");////MSG_E_CAL_KNOB c=20 r=8
 		const char   *msg_next_e_cal_knob = lcd_display_message_fullscreen_P(msg_e_cal_knob);
 		const bool    multi_screen = msg_next_e_cal_knob != NULL;
 		unsigned long msg_millis;
 
-		lcd_show_fullscreen_message_and_wait_P(MSG_MARK_FIL);
+		lcd_show_fullscreen_message_and_wait_P(_i("Mark filament 100mm from extruder body. Click when done."));////MSG_MARK_FIL c=20 r=8
 		lcd_implementation_clear();
 		
 		
@@ -3878,7 +3878,7 @@ void lcd_calibrate_pinda() {
 		//lcd_implementation_drawedit(PSTR("Result"), ftostr31(axis_steps_per_unit[E_AXIS]));
 		//delay_keep_alive(2000);
 		delay_keep_alive(500);
-		lcd_show_fullscreen_message_and_wait_P(MSG_CLEAN_NOZZLE_E);
+		lcd_show_fullscreen_message_and_wait_P(_i("E calibration finished. Please clean the nozzle. Click when done."));////MSG_CLEAN_NOZZLE_E c=20 r=8
 		lcd_update_enable(true);
 		lcdDrawUpdate = 2;
 
@@ -3912,12 +3912,12 @@ void lcd_toshiba_flash_air_compatibility_toggle()
 }
 
 void lcd_v2_calibration() {
-	bool loaded = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_PLA_FILAMENT_LOADED, false, true);
+	bool loaded = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Is PLA filament loaded?"), false, true);////MSG_PLA_FILAMENT_LOADED c=20 r=2
 	if (loaded) {
 		lcd_commands_type = LCD_COMMAND_V2_CAL;
 	}
 	else {
-		lcd_display_message_fullscreen_P(MSG_PLEASE_LOAD_PLA);
+		lcd_display_message_fullscreen_P(_i("Please load PLA filament first."));////MSG_PLEASE_LOAD_PLA c=20 r=4
 		for (int i = 0; i < 20; i++) { //wait max. 2s
 			delay_keep_alive(100);
 			if (lcd_clicked()) {
@@ -3935,7 +3935,7 @@ void lcd_v2_calibration() {
 void lcd_wizard() {
 	bool result = true;
 	if (calibration_status() != CALIBRATION_STATUS_ASSEMBLED) {
-		result = lcd_show_multiscreen_message_yes_no_and_wait_P(MSG_WIZARD_RERUN, false, false);
+		result = lcd_show_multiscreen_message_yes_no_and_wait_P(_i("Running Wizard will delete current calibration results and start from the beginning. Continue?"), false, false);////MSG_WIZARD_RERUN c=20 r=7
 	}
 	if (result) {
 		calibration_status_store(CALIBRATION_STATUS_ASSEMBLED);
@@ -3956,7 +3956,7 @@ void lcd_wizard(int state) {
 	while (!end) {
 		switch (state) {
 		case 0: // run wizard?
-			wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(MSG_WIZARD_WELCOME, false, true);
+			wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_i("Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"), false, true);////MSG_WIZARD_WELCOME c=20 r=7
 			if (wizard_event) {
 				state = 1;
 				eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1);
@@ -3977,7 +3977,7 @@ void lcd_wizard(int state) {
 			}
 			break; 
 		case 2: //selftest
-			lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_SELFTEST);
+			lcd_show_fullscreen_message_and_wait_P(_i("First, I will run the selftest to check most common assembly problems."));////MSG_WIZARD_SELFTEST c=20 r=8
 			wizard_event = lcd_selftest();
 			if (wizard_event) {
 				calibration_status_store(CALIBRATION_STATUS_XYZ_CALIBRATION);
@@ -3986,13 +3986,13 @@ void lcd_wizard(int state) {
 			else end = true;
 			break;
 		case 3: //xyz cal.
-			lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_XYZ_CAL);
+			lcd_show_fullscreen_message_and_wait_P(_i("I will run xyz calibration now. It will take approx. 12 mins."));////MSG_WIZARD_XYZ_CAL c=20 r=8
 			wizard_event = gcode_M45(false, 0);
 			if (wizard_event) state = 5;
 			else end = true;
 			break;
 		case 4: //z cal.
-			lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_Z_CAL);
+			lcd_show_fullscreen_message_and_wait_P(_i("I will run z calibration now."));////MSG_WIZARD_Z_CAL c=20 r=8
 			wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_STEEL_SHEET_CHECK, false, false);
 			if (!wizard_event) lcd_show_fullscreen_message_and_wait_P(MSG_PLACE_STEEL_SHEET);
 			wizard_event = gcode_M45(true, 0);
@@ -4003,14 +4003,14 @@ void lcd_wizard(int state) {
 				//start to preheat nozzle and bed to save some time later
 			setTargetHotend(PLA_PREHEAT_HOTEND_TEMP, 0);
 			setTargetBed(PLA_PREHEAT_HPB_TEMP);
-			wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_WIZARD_FILAMENT_LOADED, false);
+			wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Is filament loaded?"), false);////MSG_WIZARD_FILAMENT_LOADED c=20 r=2
 			if (wizard_event) state = 8;
 			else state = 6;
 
 			break;
 		case 6: //waiting for preheat nozzle for PLA;
 #ifndef SNMM
-			lcd_display_message_fullscreen_P(MSG_WIZARD_WILL_PREHEAT);
+			lcd_display_message_fullscreen_P(_i("Now I will preheat nozzle for PLA."));////MSG_WIZARD_WILL_PREHEAT c=20 r=4
 			current_position[Z_AXIS] = 100; //move in z axis to make space for loading filament
 			plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Z_AXIS] / 60, active_extruder);
 			delay_keep_alive(2000);
@@ -4034,7 +4034,7 @@ void lcd_wizard(int state) {
 #ifdef PAT9125
 			fsensor_block();
 #endif //PAT9125
-			lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_LOAD_FILAMENT);
+			lcd_show_fullscreen_message_and_wait_P(_i("Please insert PLA filament to the extruder, then press knob to load it."));////MSG_WIZARD_LOAD_FILAMENT c=20 r=8
 			lcd_update_enable(false);
 			lcd_implementation_clear();
 			lcd_print_at_PGM(0, 2, MSG_LOADING_FILAMENT);
@@ -4048,20 +4048,20 @@ void lcd_wizard(int state) {
 			state = 9;
 			break;
 		case 8:
-			wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_WIZARD_PLA_FILAMENT, false, true);
+			wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Is it PLA filament?"), false, true);////MSG_WIZARD_PLA_FILAMENT c=20 r=2
 			if (wizard_event) state = 9;
 			else end = true;
 			break;
 		case 9:
-			lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_V2_CAL);
-			lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_V2_CAL_2);
+			lcd_show_fullscreen_message_and_wait_P(_i("Now I will calibrate distance between tip of the nozzle and heatbed surface."));////MSG_WIZARD_V2_CAL c=20 r=8
+			lcd_show_fullscreen_message_and_wait_P(_i("I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."));////MSG_WIZARD_V2_CAL_2 c=20 r=12
 			lcd_commands_type = LCD_COMMAND_V2_CAL;
 			end = true;
 			break;
 		case 10: //repeat first layer cal.?
-			wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(MSG_WIZARD_REPEAT_V2_CAL, false);
+			wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_i("Do you want to repeat last step to readjust distance between nozzle and heatbed?"), false);////MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 			if (wizard_event) {
-				lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_CLEAN_HEATBED);
+				lcd_show_fullscreen_message_and_wait_P(_i("Please clean heatbed and then press the knob."));////MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 				state = 9;
 			}
 			else {
@@ -4097,7 +4097,7 @@ void lcd_wizard(int state) {
 		msg = MSG_WIZARD_CALIBRATION_FAILED;
 		break;
 	case 8:
-		msg = MSG_WIZARD_INSERT_CORRECT_FILAMENT;
+		msg = _i("Please load PLA filament and then resume Wizard by rebooting the printer.");////MSG_WIZARD_INSERT_CORRECT_FILAMENT c=20 r=8
 		break;
 	case 9: break; //exit wizard for v2 calibration, which is implemted in lcd_commands (we need lcd_update running)
 	case 11: //we are finished
@@ -4127,14 +4127,14 @@ static void lcd_settings_menu()
 
   MENU_ITEM(back, MSG_MAIN, lcd_settings_menu_back);
 
-  MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_control_temperature_menu);
+  MENU_ITEM(submenu, _i("Temperature"), lcd_control_temperature_menu);////MSG_TEMPERATURE c=0 r=0
   if (!homing_flag)
   {
-	  MENU_ITEM(submenu, MSG_MOVE_AXIS, lcd_move_menu_1mm);
+	  MENU_ITEM(submenu, _i("Move axis"), lcd_move_menu_1mm);////MSG_MOVE_AXIS c=0 r=0
   }
   if (!isPrintPaused)
   {
-	  MENU_ITEM(gcode, MSG_DISABLE_STEPPERS, PSTR("M84"));
+	  MENU_ITEM(gcode, _i("Disable steppers"), PSTR("M84"));////MSG_DISABLE_STEPPERS c=0 r=0
   }
 #ifndef TMC2130
   if (!farm_mode) { //dont show in menu if we are in farm mode
@@ -4152,7 +4152,7 @@ static void lcd_settings_menu()
   if (FSensorStateMenu == 0) {
       if (fsensor_not_responding){
           // Filament sensor not working
-          MENU_ITEM(function, MSG_FSENSOR_NA, lcd_fsensor_state_set);
+          MENU_ITEM(function, _i("Fil. sensor [N/A]"), lcd_fsensor_state_set);////MSG_FSENSOR_NA c=0 r=0
           MENU_ITEM(function, MSG_FSENS_AUTOLOAD_NA, lcd_fsensor_fail);
       }
       else{
@@ -4165,10 +4165,10 @@ static void lcd_settings_menu()
       MENU_ITEM(function, MSG_FSENSOR_ON, lcd_fsensor_state_set);
       
       if ((filament_autoload_enabled == true)) {
-          MENU_ITEM(function, MSG_FSENS_AUTOLOAD_ON, lcd_set_filament_autoload);
+          MENU_ITEM(function, _i("F. autoload  [on]"), lcd_set_filament_autoload);////MSG_FSENS_AUTOLOAD_ON c=17 r=1
       }
       else {
-          MENU_ITEM(function, MSG_FSENS_AUTOLOAD_OFF, lcd_set_filament_autoload);
+          MENU_ITEM(function, _i("F. autoload [off]"), lcd_set_filament_autoload);////MSG_FSENS_AUTOLOAD_OFF c=17 r=1
       }
       
   }
@@ -4176,10 +4176,10 @@ static void lcd_settings_menu()
 #endif //PAT9125
 
   if (fans_check_enabled == true) {
-	  MENU_ITEM(function, MSG_FANS_CHECK_ON, lcd_set_fan_check);
+	  MENU_ITEM(function, _i("Fans check   [on]"), lcd_set_fan_check);////MSG_FANS_CHECK_ON c=17 r=1
   }
   else {
-	  MENU_ITEM(function, MSG_FANS_CHECK_OFF, lcd_set_fan_check);
+	  MENU_ITEM(function, _i("Fans check  [off]"), lcd_set_fan_check);////MSG_FANS_CHECK_OFF c=17 r=1
   }
 
 #ifdef TMC2130
@@ -4195,21 +4195,21 @@ static void lcd_settings_menu()
     }
     else MENU_ITEM(submenu, MSG_CRASHDETECT_NA, lcd_crash_mode_info);
   }
-  MENU_ITEM_EDIT(wfac, MSG_EXTRUDER_CORRECTION,  &tmc2130_wave_fac[E_AXIS],  TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);
+  MENU_ITEM_EDIT(wfac, _i("E-correct"),  &tmc2130_wave_fac[E_AXIS],  TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);////MSG_EXTRUDER_CORRECTION c=9 r=0
 #endif //TMC2130
 
   if (temp_cal_active == false) {
-	  MENU_ITEM(function, MSG_TEMP_CALIBRATION_OFF, lcd_temp_calibration_set);
+	  MENU_ITEM(function, _i("Temp. cal.  [off]"), lcd_temp_calibration_set);////MSG_TEMP_CALIBRATION_OFF c=20 r=1
   }
   else {
-	  MENU_ITEM(function, MSG_TEMP_CALIBRATION_ON, lcd_temp_calibration_set);
+	  MENU_ITEM(function, _i("Temp. cal.   [on]"), lcd_temp_calibration_set);////MSG_TEMP_CALIBRATION_ON c=20 r=1
   }
 #ifdef HAS_SECOND_SERIAL_PORT
   if (selectedSerialPort == 0) {
-	  MENU_ITEM(function, MSG_SECOND_SERIAL_OFF, lcd_second_serial_set);
+	  MENU_ITEM(function, _i("RPi port    [off]"), lcd_second_serial_set);////MSG_SECOND_SERIAL_OFF c=17 r=1
   }
   else {
-	  MENU_ITEM(function, MSG_SECOND_SERIAL_ON, lcd_second_serial_set);
+	  MENU_ITEM(function, _i("RPi port     [on]"), lcd_second_serial_set);////MSG_SECOND_SERIAL_ON c=17 r=1
   }
 #endif //HAS_SECOND_SERIAL
 
@@ -4217,12 +4217,12 @@ static void lcd_settings_menu()
 	{
 		MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_babystep_z);
 	}
-	MENU_ITEM(submenu, MSG_LANGUAGE_SELECT, lcd_language_menu);
+	MENU_ITEM(submenu, _i("Select language"), lcd_language_menu);////MSG_LANGUAGE_SELECT c=0 r=0
 
   if (card.ToshibaFlashAir_isEnabled()) {
-    MENU_ITEM(function, MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON, lcd_toshiba_flash_air_compatibility_toggle);
+    MENU_ITEM(function, _i("SD card [FlshAir]"), lcd_toshiba_flash_air_compatibility_toggle);////MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON c=19 r=1
   } else {
-    MENU_ITEM(function, MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF, lcd_toshiba_flash_air_compatibility_toggle);
+    MENU_ITEM(function, _i("SD card  [normal]"), lcd_toshiba_flash_air_compatibility_toggle);////MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF c=19 r=1
   }
 
   #ifdef SDCARD_SORT_ALPHA
@@ -4230,9 +4230,9 @@ static void lcd_settings_menu()
 	  uint8_t sdSort;
 	  EEPROM_read(EEPROM_SD_SORT, (uint8_t*)&sdSort, sizeof(sdSort));
 	  switch (sdSort) {
-		  case SD_SORT_TIME: MENU_ITEM(function, MSG_SORT_TIME, lcd_sort_type_set); break;
-		  case SD_SORT_ALPHA: MENU_ITEM(function, MSG_SORT_ALPHA, lcd_sort_type_set); break;
-		  default: MENU_ITEM(function, MSG_SORT_NONE, lcd_sort_type_set);
+		  case SD_SORT_TIME: MENU_ITEM(function, _i("Sort:      [Time]"), lcd_sort_type_set); break;////MSG_SORT_TIME c=17 r=1
+		  case SD_SORT_ALPHA: MENU_ITEM(function, _i("Sort:  [Alphabet]"), lcd_sort_type_set); break;////MSG_SORT_ALPHA c=17 r=1
+		  default: MENU_ITEM(function, _i("Sort:      [None]"), lcd_sort_type_set);////MSG_SORT_NONE c=17 r=1
 	  }
   }
   #endif // SDCARD_SORT_ALPHA
@@ -4488,37 +4488,37 @@ static void lcd_calibration_menu()
   MENU_ITEM(back, MSG_MAIN, 0);
   if (!isPrintPaused)
   {
-	MENU_ITEM(function, MSG_WIZARD, lcd_wizard);
-	MENU_ITEM(submenu, MSG_V2_CALIBRATION, lcd_v2_calibration);
+	MENU_ITEM(function, _i("Wizard"), lcd_wizard);////MSG_WIZARD c=17 r=1
+	MENU_ITEM(submenu, _i("First layer cal."), lcd_v2_calibration);////MSG_V2_CALIBRATION c=17 r=1
 	MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28 W"));
-	MENU_ITEM(function, MSG_SELFTEST, lcd_selftest_v);
+	MENU_ITEM(function, _i("Selftest         "), lcd_selftest_v);////MSG_SELFTEST c=0 r=0
 #ifdef MK1BP
     // MK1
     // "Calibrate Z"
     MENU_ITEM(gcode, MSG_HOMEYZ, PSTR("G28 Z"));
 #else //MK1BP
     // MK2
-    MENU_ITEM(function, MSG_CALIBRATE_BED, lcd_mesh_calibration);
+    MENU_ITEM(function, _i("Calibrate XYZ"), lcd_mesh_calibration);////MSG_CALIBRATE_BED c=0 r=0
     // "Calibrate Z" with storing the reference values to EEPROM.
     MENU_ITEM(submenu, MSG_HOMEYZ, lcd_mesh_calibration_z);
 #ifndef SNMM
-	//MENU_ITEM(function, MSG_CALIBRATE_E, lcd_calibrate_extruder);
+	//MENU_ITEM(function, _i("Calibrate E"), lcd_calibrate_extruder);////MSG_CALIBRATE_E c=20 r=1
 #endif
     // "Mesh Bed Leveling"
-    MENU_ITEM(submenu, MSG_MESH_BED_LEVELING, lcd_mesh_bedleveling);
+    MENU_ITEM(submenu, _i("Mesh Bed Leveling"), lcd_mesh_bedleveling);////MSG_MESH_BED_LEVELING c=0 r=0
 	
 #endif //MK1BP
-    MENU_ITEM(submenu, MSG_BED_CORRECTION_MENU, lcd_adjust_bed);
-	MENU_ITEM(submenu, MSG_PID_EXTRUDER, pid_extruder);
-    MENU_ITEM(submenu, MSG_SHOW_END_STOPS, menu_show_end_stops);
+    MENU_ITEM(submenu, _i("Bed level correct"), lcd_adjust_bed);////MSG_BED_CORRECTION_MENU c=0 r=0
+	MENU_ITEM(submenu, _i("PID calibration"), pid_extruder);////MSG_PID_EXTRUDER c=17 r=1
+    MENU_ITEM(submenu, _i("Show end stops"), menu_show_end_stops);////MSG_SHOW_END_STOPS c=17 r=1
 #ifndef MK1BP
-    MENU_ITEM(gcode, MSG_CALIBRATE_BED_RESET, PSTR("M44"));
+    MENU_ITEM(gcode, _i("Reset XYZ calibr."), PSTR("M44"));////MSG_CALIBRATE_BED_RESET c=0 r=0
 #endif //MK1BP
 #ifndef SNMM
 	//MENU_ITEM(function, MSG_RESET_CALIBRATE_E, lcd_extr_cal_reset);
 #endif
 #ifndef MK1BP
-	MENU_ITEM(submenu, MSG_CALIBRATION_PINDA_MENU, lcd_pinda_calibration_menu);
+	MENU_ITEM(submenu, _i("Temp. calibration"), lcd_pinda_calibration_menu);////MSG_CALIBRATION_PINDA_MENU c=17 r=1
 #endif //MK1BP
   }
   
@@ -4827,8 +4827,8 @@ static char snmm_stop_print_menu() { //menu for choosing which filaments will be
 	lcd_print_at_PGM(0,0,MSG_UNLOAD_FILAMENT); lcd.print(":");
 	lcd.setCursor(0, 1); lcd.print(">");
 	lcd_print_at_PGM(1,1,MSG_ALL);
-	lcd_print_at_PGM(1,2,MSG_USED);
-	lcd_print_at_PGM(1,3,MSG_CURRENT);
+	lcd_print_at_PGM(1,2,_i("Used during print"));////MSG_USED c=19 r=1
+	lcd_print_at_PGM(1,3,_i("Current"));////MSG_CURRENT c=19 r=1
 	char cursor_pos = 1;
 	int enc_dif = 0;
 	KEEPALIVE_STATE(PAUSED_FOR_USER);
@@ -5361,11 +5361,11 @@ static void fil_load_menu()
 {
 	START_MENU();
 	MENU_ITEM(back, MSG_MAIN, 0);
-	MENU_ITEM(function, MSG_LOAD_ALL, load_all);
-	MENU_ITEM(function, MSG_LOAD_FILAMENT_1, extr_adj_0);
-	MENU_ITEM(function, MSG_LOAD_FILAMENT_2, extr_adj_1);
-	MENU_ITEM(function, MSG_LOAD_FILAMENT_3, extr_adj_2);
-	MENU_ITEM(function, MSG_LOAD_FILAMENT_4, extr_adj_3);
+	MENU_ITEM(function, _i("Load all"), load_all);////MSG_LOAD_ALL c=0 r=0
+	MENU_ITEM(function, _i("Load filament 1"), extr_adj_0);////MSG_LOAD_FILAMENT_1 c=17 r=0
+	MENU_ITEM(function, _i("Load filament 2"), extr_adj_1);////MSG_LOAD_FILAMENT_2 c=17 r=0
+	MENU_ITEM(function, _i("Load filament 3"), extr_adj_2);////MSG_LOAD_FILAMENT_3 c=17 r=0
+	MENU_ITEM(function, _i("Load filament 4"), extr_adj_3);////MSG_LOAD_FILAMENT_4 c=17 r=0
 	
 	END_MENU();
 }
@@ -5374,11 +5374,11 @@ static void fil_unload_menu()
 {
 	START_MENU();
 	MENU_ITEM(back, MSG_MAIN, 0);
-	MENU_ITEM(function, MSG_UNLOAD_ALL, extr_unload_all);
-	MENU_ITEM(function, MSG_UNLOAD_FILAMENT_1, extr_unload_0);
-	MENU_ITEM(function, MSG_UNLOAD_FILAMENT_2, extr_unload_1);
-	MENU_ITEM(function, MSG_UNLOAD_FILAMENT_3, extr_unload_2);
-	MENU_ITEM(function, MSG_UNLOAD_FILAMENT_4, extr_unload_3);
+	MENU_ITEM(function, _i("Unload all"), extr_unload_all);////MSG_UNLOAD_ALL c=0 r=0
+	MENU_ITEM(function, _i("Unload filament 1"), extr_unload_0);////MSG_UNLOAD_FILAMENT_1 c=17 r=0
+	MENU_ITEM(function, _i("Unload filament 2"), extr_unload_1);////MSG_UNLOAD_FILAMENT_2 c=17 r=0
+	MENU_ITEM(function, _i("Unload filament 3"), extr_unload_2);////MSG_UNLOAD_FILAMENT_3 c=17 r=0
+	MENU_ITEM(function, _i("Unload filament 4"), extr_unload_3);////MSG_UNLOAD_FILAMENT_4 c=17 r=0
 
 	END_MENU();
 }
@@ -5386,10 +5386,10 @@ static void fil_unload_menu()
 static void change_extr_menu(){
 	START_MENU();
 	MENU_ITEM(back, MSG_MAIN, 0);
-	MENU_ITEM(function, MSG_EXTRUDER_1, extr_change_0);
-	MENU_ITEM(function, MSG_EXTRUDER_2, extr_change_1);
-	MENU_ITEM(function, MSG_EXTRUDER_3, extr_change_2);
-	MENU_ITEM(function, MSG_EXTRUDER_4, extr_change_3);
+	MENU_ITEM(function, _i("Extruder 1"), extr_change_0);////MSG_EXTRUDER_1 c=17 r=1
+	MENU_ITEM(function, _i("Extruder 2"), extr_change_1);////MSG_EXTRUDER_2 c=17 r=1
+	MENU_ITEM(function, _i("Extruder 3"), extr_change_2);////MSG_EXTRUDER_3 c=17 r=1
+	MENU_ITEM(function, _i("Extruder 4"), extr_change_3);////MSG_EXTRUDER_4 c=17 r=1
 
 	END_MENU();
 }
@@ -5707,10 +5707,10 @@ static void lcd_main_menu()
 
   if ( moves_planned() || IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LCD_COMMAND_V2_CAL))
   {
-    MENU_ITEM(submenu, MSG_TUNE, lcd_tune_menu);
+    MENU_ITEM(submenu, _i("Tune"), lcd_tune_menu);////MSG_TUNE c=0 r=0
   } else 
   {
-    MENU_ITEM(submenu, MSG_PREHEAT, lcd_preheat_menu);
+    MENU_ITEM(submenu, _i("Preheat"), lcd_preheat_menu);////MSG_PREHEAT c=0 r=0
   }
 
 #ifdef SDSUPPORT
@@ -5721,11 +5721,11 @@ static void lcd_main_menu()
 		if (mesh_bed_leveling_flag == false && homing_flag == false) {
 			if (card.sdprinting)
 			{
-				MENU_ITEM(function, MSG_PAUSE_PRINT, lcd_sdcard_pause);
+				MENU_ITEM(function, _i("Pause print"), lcd_sdcard_pause);////MSG_PAUSE_PRINT c=0 r=0
 			}
 			else
 			{
-				MENU_ITEM(function, MSG_RESUME_PRINT, lcd_sdcard_resume);
+				MENU_ITEM(function, _i("Resume print"), lcd_sdcard_resume);////MSG_RESUME_PRINT c=0 r=0
 			}
 			MENU_ITEM(submenu, MSG_STOP_PRINT, lcd_sdcard_stop);
 		}
@@ -5741,15 +5741,15 @@ static void lcd_main_menu()
 			/*else*/ MENU_ITEM(submenu, MSG_CARD_MENU, lcd_sdcard_menu);
 		}
 #if SDCARDDETECT < 1
-      MENU_ITEM(gcode, MSG_CNG_SDCARD, PSTR("M21"));  // SD-card changed by user
+      MENU_ITEM(gcode, _i("Change SD card"), PSTR("M21"));  // SD-card changed by user////MSG_CNG_SDCARD c=0 r=0
 #endif
     }
 	
   } else 
   {
-    MENU_ITEM(submenu, MSG_NO_CARD, lcd_sdcard_menu);
+    MENU_ITEM(submenu, _i("No SD card"), lcd_sdcard_menu);////MSG_NO_CARD c=0 r=0
 #if SDCARDDETECT < 1
-    MENU_ITEM(gcode, MSG_INIT_SDCARD, PSTR("M21")); // Manually initialize the SD-card via user interface
+    MENU_ITEM(gcode, _i("Init. SD card"), PSTR("M21")); // Manually initialize the SD-card via user interface////MSG_INIT_SDCARD c=0 r=0
 #endif
   }
 #endif
@@ -5767,7 +5767,7 @@ static void lcd_main_menu()
 	#ifndef SNMM
 #ifdef PAT9125
 	if ( ((filament_autoload_enabled == true) && (fsensor_enabled == true)))
-        MENU_ITEM(submenu, MSG_AUTOLOAD_FILAMENT, lcd_menu_AutoLoadFilament);
+        MENU_ITEM(submenu, _i("AutoLoad filament"), lcd_menu_AutoLoadFilament);////MSG_AUTOLOAD_FILAMENT c=17 r=0
 	else
 #endif //PAT9125
 		MENU_ITEM(function, MSG_LOAD_FILAMENT, lcd_LoadFilament);
@@ -5776,7 +5776,7 @@ static void lcd_main_menu()
 	#ifdef SNMM
 	MENU_ITEM(submenu, MSG_LOAD_FILAMENT, fil_load_menu);
 	MENU_ITEM(submenu, MSG_UNLOAD_FILAMENT, fil_unload_menu);
-	MENU_ITEM(submenu, MSG_CHANGE_EXTR, change_extr_menu);
+	MENU_ITEM(submenu, _i("Change extruder"), change_extr_menu);////MSG_CHANGE_EXTR c=20 r=1
 	#endif
 	MENU_ITEM(submenu, MSG_SETTINGS, lcd_settings_menu);
     if(!isPrintPaused) MENU_ITEM(submenu, MSG_MENU_CALIBRATION, lcd_calibration_menu);
@@ -5788,14 +5788,14 @@ static void lcd_main_menu()
 
   if (!is_usb_printing && (lcd_commands_type != LCD_COMMAND_V2_CAL))
   {
-	  MENU_ITEM(submenu, MSG_STATISTICS, lcd_menu_statistics);
+	  MENU_ITEM(submenu, _i("Statistics  "), lcd_menu_statistics);////MSG_STATISTICS c=0 r=0
   }
     
 #if defined(TMC2130) || defined(PAT9125)
   MENU_ITEM(submenu, PSTR("Fail stats"), lcd_menu_fails_stats);
 #endif
 
-  MENU_ITEM(submenu, MSG_SUPPORT, lcd_support_menu);
+  MENU_ITEM(submenu, _i("Support"), lcd_support_menu);////MSG_SUPPORT c=0 r=0
 
   END_MENU();
 
@@ -5806,7 +5806,7 @@ void stack_error() {
 	WRITE(BEEPER, HIGH);
 	delay(1000);
 	WRITE(BEEPER, LOW);
-	lcd_display_message_fullscreen_P(MSG_STACK_ERROR);
+	lcd_display_message_fullscreen_P(_i("Error - static memory has been overwritten"));////MSG_STACK_ERROR c=20 r=4
 	//err_triggered = 1;
 	 while (1) delay_keep_alive(1000);
 }
@@ -5889,13 +5889,13 @@ static void lcd_tune_menu()
 
 	START_MENU();
 	MENU_ITEM(back, MSG_MAIN, 0); //1
-	MENU_ITEM_EDIT(int3, MSG_SPEED, &feedmultiply, 10, 999);//2
+	MENU_ITEM_EDIT(int3, _i("Speed"), &feedmultiply, 10, 999);//2////MSG_SPEED c=0 r=0
 
 	MENU_ITEM_EDIT(int3, MSG_NOZZLE, &target_temperature[0], 0, HEATER_0_MAXTEMP - 10);//3
 	MENU_ITEM_EDIT(int3, MSG_BED, &target_temperature_bed, 0, BED_MAXTEMP - 10);//4
 
 	MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255);//5
-	MENU_ITEM_EDIT(int3, MSG_FLOW, &extrudemultiply, 10, 999);//6
+	MENU_ITEM_EDIT(int3, _i("Flow"), &extrudemultiply, 10, 999);//6////MSG_FLOW c=0 r=0
 #ifdef FILAMENTCHANGEENABLE
 	MENU_ITEM(function, MSG_FILAMENTCHANGE, lcd_colorprint_change);//7
 #endif
@@ -5958,10 +5958,10 @@ static void lcd_control_temperature_menu()
   MENU_ITEM_EDIT(int3, MSG_NOZZLE, &target_temperature[0], 0, HEATER_0_MAXTEMP - 10);
 #endif
 #if TEMP_SENSOR_1 != 0
-  MENU_ITEM_EDIT(int3, MSG_NOZZLE1, &target_temperature[1], 0, HEATER_1_MAXTEMP - 10);
+  MENU_ITEM_EDIT(int3, _i("Nozzle2"), &target_temperature[1], 0, HEATER_1_MAXTEMP - 10);////MSG_NOZZLE1 c=0 r=0
 #endif
 #if TEMP_SENSOR_2 != 0
-  MENU_ITEM_EDIT(int3, MSG_NOZZLE2, &target_temperature[2], 0, HEATER_2_MAXTEMP - 10);
+  MENU_ITEM_EDIT(int3, _i("Nozzle3"), &target_temperature[2], 0, HEATER_2_MAXTEMP - 10);////MSG_NOZZLE2 c=0 r=0
 #endif
 #if TEMP_SENSOR_BED != 0
   MENU_ITEM_EDIT(int3, MSG_BED, &target_temperature_bed, 0, BED_MAXTEMP - 3);
@@ -5969,9 +5969,9 @@ static void lcd_control_temperature_menu()
   MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255);
 #if defined AUTOTEMP && (TEMP_SENSOR_0 != 0)
   MENU_ITEM_EDIT(bool, MSG_AUTOTEMP, &autotemp_enabled);
-  MENU_ITEM_EDIT(float3, MSG_MIN, &autotemp_min, 0, HEATER_0_MAXTEMP - 10);
-  MENU_ITEM_EDIT(float3, MSG_MAX, &autotemp_max, 0, HEATER_0_MAXTEMP - 10);
-  MENU_ITEM_EDIT(float32, MSG_FACTOR, &autotemp_factor, 0.0, 1.0);
+  MENU_ITEM_EDIT(float3, _i("   MENU_ITEM_EDIT(float3, MSG_MIN, &autotemp_min, 0, HEATER_0_MAXTEMP - 10);02 Min"), &autotemp_min, 0, HEATER_0_MAXTEMP - 10);////MSG_MIN c=0 r=0
+  MENU_ITEM_EDIT(float3, _i("   MENU_ITEM_EDIT(float3, MSG_MAX, &autotemp_max, 0, HEATER_0_MAXTEMP - 10);02 Max"), &autotemp_max, 0, HEATER_0_MAXTEMP - 10);////MSG_MAX c=0 r=0
+  MENU_ITEM_EDIT(float32, _i("   MENU_ITEM_EDIT(float32, MSG_FACTOR, &autotemp_factor, 0.0, 1.0);02 Fact"), &autotemp_factor, 0.0, 1.0);////MSG_FACTOR c=0 r=0
 #endif
 
   END_MENU();
@@ -6275,7 +6275,7 @@ char *wfac_to_str5(const uint8_t &x)
 	    conv[0] = '[';
 	    ftostr43(((float)((uint16_t)x + 1000) / 1000), 1);
 	    }
-	else strcpy_P(conv, MSG_EXTRUDER_CORRECTION_OFF);
+	else strcpy_P(conv, _i("  [off"));////MSG_EXTRUDER_CORRECTION_OFF c=6 r=0
 	conv[6] = ']';
 	conv[7] = ' ';
 	conv[8] = 0;
@@ -6305,7 +6305,7 @@ bool lcd_selftest()
 	bool _result = true;
 	lcd_wait_for_cool_down();
 	lcd_implementation_clear();
-	lcd.setCursor(0, 0); lcd_printPGM(MSG_SELFTEST_START);
+	lcd.setCursor(0, 0); lcd_printPGM(_i("Self test start  "));////MSG_SELFTEST_START c=20 r=0
 	#ifdef TMC2130
 	  FORCE_HIGH_POWER_START;
 	#endif // TMC2130
@@ -6468,7 +6468,7 @@ bool lcd_selftest()
 	
 	if (_result)
 	{
-		LCD_ALERTMESSAGERPGM(MSG_SELFTEST_OK);
+		LCD_ALERTMESSAGERPGM(_i("Self test OK"));////MSG_SELFTEST_OK c=0 r=0
 	}
 	else
 	{
@@ -6900,27 +6900,27 @@ static void lcd_selftest_error(int _error_no, const char *_error_1, const char *
 	lcd_implementation_clear();
 
 	lcd.setCursor(0, 0);
-	lcd_printPGM(MSG_SELFTEST_ERROR);
+	lcd_printPGM(_i("Selftest error !"));////MSG_SELFTEST_ERROR c=0 r=0
 	lcd.setCursor(0, 1);
-	lcd_printPGM(MSG_SELFTEST_PLEASECHECK);
+	lcd_printPGM(_i("Please check :"));////MSG_SELFTEST_PLEASECHECK c=0 r=0
 
 	switch (_error_no)
 	{
 	case 1:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(MSG_SELFTEST_HEATERTHERMISTOR);
+		lcd_printPGM(_i("Heater/Thermistor"));////MSG_SELFTEST_HEATERTHERMISTOR c=0 r=0
 		lcd.setCursor(0, 3);
-		lcd_printPGM(MSG_SELFTEST_NOTCONNECTED);
+		lcd_printPGM(_i("Not connected"));////MSG_SELFTEST_NOTCONNECTED c=0 r=0
 		break;
 	case 2:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(MSG_SELFTEST_BEDHEATER);
+		lcd_printPGM(_i("Bed / Heater"));////MSG_SELFTEST_BEDHEATER c=0 r=0
 		lcd.setCursor(0, 3);
 		lcd_printPGM(MSG_SELFTEST_WIRINGERROR);
 		break;
 	case 3:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(MSG_SELFTEST_ENDSTOPS);
+		lcd_printPGM(_i("Endstops"));////MSG_SELFTEST_ENDSTOPS c=0 r=0
 		lcd.setCursor(0, 3);
 		lcd_printPGM(MSG_SELFTEST_WIRINGERROR);
 		lcd.setCursor(17, 3);
@@ -6932,13 +6932,13 @@ static void lcd_selftest_error(int _error_no, const char *_error_1, const char *
 		lcd.setCursor(18, 2);
 		lcd.print(_error_1);
 		lcd.setCursor(0, 3);
-		lcd_printPGM(MSG_SELFTEST_ENDSTOP);
+		lcd_printPGM(_i("Endstop"));////MSG_SELFTEST_ENDSTOP c=0 r=0
 		lcd.setCursor(18, 3);
 		lcd.print(_error_2);
 		break;
 	case 5:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(MSG_SELFTEST_ENDSTOP_NOTHIT);
+		lcd_printPGM(_i("Endstop not hit"));////MSG_SELFTEST_ENDSTOP_NOTHIT c=20 r=1
 		lcd.setCursor(0, 3);
 		lcd_printPGM(MSG_SELFTEST_MOTOR);
 		lcd.setCursor(18, 3);
@@ -6962,7 +6962,7 @@ static void lcd_selftest_error(int _error_no, const char *_error_1, const char *
 		break;
 	case 8:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(MSG_LOOSE_PULLEY);
+		lcd_printPGM(_i("Loose pulley"));////MSG_LOOSE_PULLEY c=20 r=1
 		lcd.setCursor(0, 3);
 		lcd_printPGM(MSG_SELFTEST_MOTOR);
 		lcd.setCursor(18, 3);
@@ -6970,23 +6970,23 @@ static void lcd_selftest_error(int _error_no, const char *_error_1, const char *
 		break;
 	case 9:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(MSG_SELFTEST_AXIS_LENGTH);
+		lcd_printPGM(_i("Axis length"));////MSG_SELFTEST_AXIS_LENGTH c=0 r=0
 		lcd.setCursor(0, 3);
-		lcd_printPGM(MSG_SELFTEST_AXIS);
+		lcd_printPGM(_i("Axis"));////MSG_SELFTEST_AXIS c=0 r=0
 		lcd.setCursor(18, 3);
 		lcd.print(_error_1);
 		break;
 	case 10:
 		lcd.setCursor(0, 2);
-		lcd_printPGM(MSG_SELFTEST_FANS);
+		lcd_printPGM(_i("Front/left fans"));////MSG_SELFTEST_FANS c=0 r=0
 		lcd.setCursor(0, 3);
-		lcd_printPGM(MSG_SELFTEST_SWAPPED);
+		lcd_printPGM(_i("Swapped"));////MSG_SELFTEST_SWAPPED c=0 r=0
 		lcd.setCursor(18, 3);
 		lcd.print(_error_1);
 		break;
 	case 11: 
 		lcd.setCursor(0, 2);
-		lcd_printPGM(MSG_FILAMENT_SENSOR);
+		lcd_printPGM(_i("Filament sensor"));////MSG_FILAMENT_SENSOR c=20 r=0
 		lcd.setCursor(0, 3);
 		lcd_printPGM(MSG_SELFTEST_WIRINGERROR);
 		break;
@@ -7189,16 +7189,16 @@ static int lcd_selftest_screen(int _step, int _progress, int _progress_scale, bo
 	if (_step == -1) lcd_printPGM(MSG_SELFTEST_FAN);
 	if (_step == 0) lcd_printPGM(MSG_SELFTEST_FAN);
 	if (_step == 1) lcd_printPGM(MSG_SELFTEST_FAN);
-	if (_step == 2) lcd_printPGM(MSG_SELFTEST_CHECK_ENDSTOPS);
-	if (_step == 3) lcd_printPGM(MSG_SELFTEST_CHECK_HOTEND);
-	if (_step == 4) lcd_printPGM(MSG_SELFTEST_CHECK_X);
-	if (_step == 5) lcd_printPGM(MSG_SELFTEST_CHECK_Y);
-	if (_step == 6) lcd_printPGM(MSG_SELFTEST_CHECK_Z);
+	if (_step == 2) lcd_printPGM(_i("Checking endstops"));////MSG_SELFTEST_CHECK_ENDSTOPS c=20 r=0
+	if (_step == 3) lcd_printPGM(_i("Checking hotend  "));////MSG_SELFTEST_CHECK_HOTEND c=20 r=0
+	if (_step == 4) lcd_printPGM(_i("Checking X axis  "));////MSG_SELFTEST_CHECK_X c=20 r=0
+	if (_step == 5) lcd_printPGM(_i("Checking Y axis  "));////MSG_SELFTEST_CHECK_Y c=20 r=0
+	if (_step == 6) lcd_printPGM(_i("Checking Z axis  "));////MSG_SELFTEST_CHECK_Z c=20 r=0
 	if (_step == 7) lcd_printPGM(MSG_SELFTEST_CHECK_BED);
 	if (_step == 8) lcd_printPGM(MSG_SELFTEST_CHECK_BED);
 	if (_step == 9) lcd_printPGM(MSG_SELFTEST_CHECK_FSENSOR);
 	if (_step == 10) lcd_printPGM(MSG_SELFTEST_CHECK_FSENSOR);
-	if (_step == 11) lcd_printPGM(MSG_SELFTEST_CHECK_ALLCORRECT);
+	if (_step == 11) lcd_printPGM(_i("All correct      "));////MSG_SELFTEST_CHECK_ALLCORRECT c=20 r=0
 	if (_step == 12) lcd_printPGM(MSG_SELFTEST_FAILED);
 	if (_step == 13) lcd_printPGM(PSTR("Calibrating home"));
 
@@ -7207,16 +7207,16 @@ static int lcd_selftest_screen(int _step, int _progress, int _progress_scale, bo
 	if ((_step >= -1) && (_step <= 1))
 	{
 		//SERIAL_ECHOLNPGM("Fan test");
-		lcd_print_at_PGM(0, 2, MSG_SELFTEST_EXTRUDER_FAN_SPEED);
+		lcd_print_at_PGM(0, 2, _i("Extruder fan:"));////MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18 r=0
 		lcd.setCursor(18, 2);
 		(_step < 0) ? lcd.print(_indicator) : lcd.print("OK");
-		lcd_print_at_PGM(0, 3, MSG_SELFTEST_PRINT_FAN_SPEED);
+		lcd_print_at_PGM(0, 3, _i("Print fan:"));////MSG_SELFTEST_PRINT_FAN_SPEED c=18 r=0
 		lcd.setCursor(18, 3);
 		(_step < 1) ? lcd.print(_indicator) : lcd.print("OK");
 	}
 	else if (_step >= 9 && _step <= 10)
 	{
-		lcd_print_at_PGM(0, 2, MSG_SELFTEST_FILAMENT_SENSOR);
+		lcd_print_at_PGM(0, 2, _i("Filament sensor:"));////MSG_SELFTEST_FILAMENT_SENSOR c=18 r=0
 		lcd.setCursor(18, 2);
 		(_step == 9) ? lcd.print(_indicator) : lcd.print("OK");
 	}
@@ -7359,7 +7359,7 @@ static void menu_action_sdfile(const char* filename, char* longFilename)
   }
   
   if (!check_file(filename)) {
-	  result = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_FILE_INCOMPLETE, false, false);
+	  result = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("File incomplete. Continue anyway?"), false, false);////MSG_FILE_INCOMPLETE c=20 r=2
 	  lcd_update_enable(true);
   }
   if (result) {
@@ -7513,13 +7513,13 @@ void lcd_update(uint8_t lcdDrawUpdateOverride)
 	  if (lcd_oldcardstatus)
 	  {
 		  card.initsd();
-		  LCD_MESSAGERPGM(MSG_SD_INSERTED);
+		  LCD_MESSAGERPGM(_i("Card inserted"));////MSG_SD_INSERTED c=0 r=0
 		  //get_description();
 	  }
 	  else
 	  {
 		  card.release();
-		  LCD_MESSAGERPGM(MSG_SD_REMOVED);
+		  LCD_MESSAGERPGM(_i("Card removed"));////MSG_SD_REMOVED c=0 r=0
 	  }
   }
 #endif//CARDINSERTED

+ 3 - 3
Firmware/ultralcd_implementation_hitachi_HD44780.h

@@ -968,7 +968,7 @@ if (print_sd_status)
 					lcd.setCursor(0, 3);
 					lcd_printPGM(PSTR("                    "));
 					lcd.setCursor(0, 3);
-					lcd_printPGM(MSG_HOMEYZ_PROGRESS);
+					lcd_printPGM(_i("Calibrating Z"));////MSG_HOMEYZ_PROGRESS c=0 r=0
 					lcd_printPGM(PSTR(" : "));
 					lcd.print(custom_message_state-10);
 				}
@@ -986,7 +986,7 @@ if (print_sd_status)
 						lcd.setCursor(0, 3);
 						lcd_printPGM(PSTR("                   "));
 						lcd.setCursor(0, 3);
-						lcd_printPGM(MSG_HOMEYZ_DONE);
+						lcd_printPGM(_i("Calibration done"));////MSG_HOMEYZ_DONE c=0 r=0
 						custom_message_state--;
 					}
 				}
@@ -1020,7 +1020,7 @@ if (print_sd_status)
 			// temp compensation preheat
 			if (custom_message_type == 5) {
 				lcd.setCursor(0, 3);
-				lcd_printPGM(MSG_PINDA_PREHEAT);
+				lcd_printPGM(_i("PINDA Heating"));////MSG_PINDA_PREHEAT c=20 r=1
 				if (custom_message_state <= PINDA_HEAT_T) {
 					lcd_printPGM(PSTR(": "));
 					lcd.print(custom_message_state); //seconds

+ 2 - 2
Firmware/util.cpp

@@ -289,11 +289,11 @@ bool show_upgrade_dialog_if_version_newer(const char *version_string)
     }
 
     if (upgrade) {
-        lcd_display_message_fullscreen_P(MSG_NEW_FIRMWARE_AVAILABLE);
+        lcd_display_message_fullscreen_P(_i("New firmware version available:"));////MSG_NEW_FIRMWARE_AVAILABLE c=20 r=2
         lcd_print_at_PGM(0, 2, PSTR(""));
         for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c)
             lcd_implementation_write(*c);
-        lcd_print_at_PGM(0, 3, MSG_NEW_FIRMWARE_PLEASE_UPGRADE);
+        lcd_print_at_PGM(0, 3, _i("Please upgrade."));////MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20 r=0
         tone(BEEPER, 1000);
         delay_keep_alive(50);
         noTone(BEEPER);

Firmware/langtool.php → lang_backup/langtool.php


+ 0 - 0
Firmware/langtool.pl


+ 34 - 0
lang_backup/language.h

@@ -0,0 +1,34 @@
+#ifndef LANGUAGE_H
+#define LANGUAGE_H
+
+#define PROTOCOL_VERSION "1.0"
+
+#ifdef CUSTOM_MENDEL_NAME
+   // #define CUSTOM_MENDEL_NAME CUSTOM_MENDEL_NAME
+#else
+    #define MACHINE_NAME "Mendel"
+#endif
+
+#define _i PSTR
+#define _n PSTR
+
+#ifndef MACHINE_UUID
+   #define MACHINE_UUID "00000000-0000-0000-0000-000000000000"
+#endif
+
+#define MSG_FW_VERSION                   "Firmware"
+
+#define STRINGIFY_(n) #n
+#define STRINGIFY(n) STRINGIFY_(n)
+
+
+// Common serial messages
+#define MSG_MARLIN "Marlin"
+
+// Serial Console Messages (do not translate those!)
+
+
+// LCD Menu Messages
+#include "language_all.h"
+
+#endif //__LANGUAGE_H

Firmware/language_all.cpp → lang_backup/language_all.cpp


Firmware/language_all.h → lang_backup/language_all.h


Firmware/language_common.h → lang_backup/language_common.h


Firmware/language_cz.h → lang_backup/language_cz.h


Firmware/language_de.h → lang_backup/language_de.h


Firmware/language_en.h → lang_backup/language_en.h


Firmware/language_es.h → lang_backup/language_es.h


Firmware/language_it.h → lang_backup/language_it.h


Firmware/language_pl.h → lang_backup/language_pl.h