Browse Source

Merge branch 'MK3' into MK3_Dutch

Merge with MK3 and fix merge issues
3d-gussner 4 years ago
parent
commit
049cca297b
13 changed files with 997 additions and 428 deletions
  1. 2 2
      Firmware/menu.cpp
  2. 7 4
      Firmware/stepper.cpp
  3. 412 150
      Firmware/ultralcd.cpp
  4. 10 5
      README.md
  5. 55 35
      lang/lang-import.sh
  6. 6 3
      lang/lang_en.txt
  7. 16 12
      lang/lang_en_cz.txt
  8. 30 26
      lang/lang_en_de.txt
  9. 17 13
      lang/lang_en_es.txt
  10. 122 117
      lang/lang_en_fr.txt
  11. 28 24
      lang/lang_en_it.txt
  12. 40 37
      lang/lang_en_pl.txt
  13. 252 0
      lang/translations.md

+ 2 - 2
Firmware/menu.cpp

@@ -399,7 +399,7 @@ const char menu_fmt_float31[] PROGMEM = "%-12.12S%+8.1f";
 
 
 const char menu_fmt_float13[] PROGMEM = "%c%-13.13S%+5.3f";
 const char menu_fmt_float13[] PROGMEM = "%c%-13.13S%+5.3f";
 
 
-const char menu_fmt_float13off[] PROGMEM = "%c%-13.13S%6.6s";
+const char menu_fmt_float13off[] PROGMEM = "%c%-13.13S%6.6S";
 
 
 template<typename T>
 template<typename T>
 static void menu_draw_P(char chr, const char* str, int16_t val);
 static void menu_draw_P(char chr, const char* str, int16_t val);
@@ -423,7 +423,7 @@ void menu_draw_P<uint8_t*>(char chr, const char* str, int16_t val)
     float factor = 1.0f + static_cast<float>(val) / 1000.0f;
     float factor = 1.0f + static_cast<float>(val) / 1000.0f;
     if (val <= _md->minEditValue)
     if (val <= _md->minEditValue)
     {
     {
-        lcd_printf_P(menu_fmt_float13off, chr, str, " [off]");
+        lcd_printf_P(menu_fmt_float13off, chr, str, _i(" [off]"));
     }
     }
     else
     else
     {
     {

+ 7 - 4
Firmware/stepper.cpp

@@ -1561,11 +1561,14 @@ void EEPROM_read_st(int pos, uint8_t* value, uint8_t size)
 
 
 
 
 void st_current_init() //Initialize Digipot Motor Current
 void st_current_init() //Initialize Digipot Motor Current
-{  
+{
+#ifdef MOTOR_CURRENT_PWM_XY_PIN
   uint8_t SilentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT);
   uint8_t SilentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT);
-  if (SilentMode == 0xff) SilentMode = 0; //set power to High Power (MK2.5) or Normal Power (MK3, unused)
+  if (SilentMode == 0xff){ //set power to High Power (MK2.5) or Normal Power (MK3, unused)
+    SilentMode = SILENT_MODE_POWER;
+    eeprom_update_byte((uint8_t*)EEPROM_SILENT, SilentMode);
+  }
   SilentModeMenu = SilentMode;
   SilentModeMenu = SilentMode;
-  #ifdef MOTOR_CURRENT_PWM_XY_PIN
     pinMode(MOTOR_CURRENT_PWM_XY_PIN, OUTPUT);
     pinMode(MOTOR_CURRENT_PWM_XY_PIN, OUTPUT);
     pinMode(MOTOR_CURRENT_PWM_Z_PIN, OUTPUT);
     pinMode(MOTOR_CURRENT_PWM_Z_PIN, OUTPUT);
     pinMode(MOTOR_CURRENT_PWM_E_PIN, OUTPUT);
     pinMode(MOTOR_CURRENT_PWM_E_PIN, OUTPUT);
@@ -1587,7 +1590,7 @@ void st_current_init() //Initialize Digipot Motor Current
     st_current_set(2, motor_current_setting[2]);
     st_current_set(2, motor_current_setting[2]);
     //Set timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise)
     //Set timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise)
     TCCR5B = (TCCR5B & ~(_BV(CS50) | _BV(CS51) | _BV(CS52))) | _BV(CS50);
     TCCR5B = (TCCR5B & ~(_BV(CS50) | _BV(CS51) | _BV(CS52))) | _BV(CS50);
-  #endif
+#endif
 }
 }
 
 
 
 

+ 412 - 150
Firmware/ultralcd.cpp

@@ -1,4 +1,7 @@
 //! @file
 //! @file
+//! @date Aug 28, 2019
+//! @author mkbel
+//! @brief LCD
 
 
 #include "temperature.h"
 #include "temperature.h"
 #include "ultralcd.h"
 #include "ultralcd.h"
@@ -857,18 +860,23 @@ void lcdui_print_status_line(void)
 			lcd_print(' ');
 			lcd_print(' ');
 }
 }
 
 
+//! @brief Show Status Screen
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |N 000/000D  Z000.0  |
+//! |B 000/000D  F100%   |
+//! |USB100% T0  t--:--  |
+//! |Status line.........|
+//! ----------------------
+//! N - nozzle temp symbol	LCD_STR_THERMOMETER
+//! D - Degree sysmbol		LCD_STR_DEGREE
+//! B - bed temp symbol 	LCD_STR_BEDTEMP
+//! F - feedrate symbol 	LCD_STR_FEEDRATE
+//! t - clock symbol 		LCD_STR_THERMOMETER
+//! @endcode
 void lcdui_print_status_screen(void)
 void lcdui_print_status_screen(void)
 {
 {
-//|01234567890123456789|
-//|N 000/000D  Z000.0  |
-//|B 000/000D  F100%   |
-//|USB100% T0  t--:--  |
-//|Status line.........|
-//----------------------
-//N - nozzle temp symbol LCD_STR_THERMOMETER
-//B - bed temp symbol LCD_STR_BEDTEMP
-//F - feedrate symbol LCD_STR_FEEDRATE
-//t - clock symbol LCD_STR_THERMOMETER
 
 
     lcd_set_cursor(0, 0); //line 0
     lcd_set_cursor(0, 0); //line 0
 
 
@@ -1670,32 +1678,50 @@ static void lcd_cooldown()
   lcd_return_to_status();
   lcd_return_to_status();
 }
 }
 
 
+//! @brief append text label with a colon and format it into a fixed size output buffer
+//! It would have been much easier if there was a ':' in the labels.
+//! But since the texts like Bed, Nozzle and PINDA are used in other places
+//! it is better to reuse these texts even though it requires some extra formatting code.
+//! @param [in] ipgmLabel pointer to string in PROGMEM
+//! @param [out] pointer to string in RAM which will receive the formatted text. Must be allocated to appropriate size
+//! @param [in] dstSize allocated length of dst
+static void pgmtext_with_colon(const char *ipgmLabel, char *dst, uint8_t dstSize){
+    uint8_t i = 0;
+    for(; i < dstSize - 2; ++i){ // 2 byte less than buffer, we'd be adding a ':' to the end
+        uint8_t b = pgm_read_byte(ipgmLabel + i);
+        if( ! b )
+            break;
+        dst[i] = b;
+    }
+    dst[i] = ':';               // append the colon
+    ++i;
+    for(; i < dstSize - 1; ++i) // fill the rest with spaces
+        dst[i] = ' ';
+    dst[dstSize-1] = '\0';      // terminate the string properly
+}
 
 
+//! @brief Show Extruder Info
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |Nozzle FAN: 0000 RPM|	FAN c=10 r=1  SPEED c=3 r=1
+//! |Print FAN:  0000 RPM|	FAN c=10 r=1  SPEED c=3 r=1
+//! |Fil. Xd:000 Yd:000  |	Fil. c=4 r=1
+//! |Int:  000 Shut: 000 |	Int: c=4 r=1  Shut: c=4 r=1
+//! ----------------------
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 void lcd_menu_extruder_info()                     // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
 void lcd_menu_extruder_info()                     // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
 {
 {
-//|01234567890123456789|
-//|Nozzle FAN:      RPM|
-//|Print FAN:       RPM|
-//|Fil. Xd:    Yd:     |
-//|Int:      Shut:     |
-//----------------------
-	int fan_speed_RPM[2];
-	// Display Nozzle fan RPM
-	fan_speed_RPM[0] = 60*fan_speed[0];
-	fan_speed_RPM[1] = 60*fan_speed[1];
-
-	lcd_timeoutToStatus.stop(); //infinite timeout
 
 
-	lcd_home();
-	lcd_printf_P(_N(
-	  "%S: %4d RPM\n"
-	  "%S:  %4d RPM\n"
-	 ),
-	 _i("Nozzle FAN"),
-	 fan_speed_RPM[0],
-	 _i("Print FAN"),
-	 fan_speed_RPM[1]
-	);
+    // Display Nozzle fan RPM
+    lcd_timeoutToStatus.stop(); //infinite timeout
+    lcd_home();
+    static const size_t maxChars = 12;
+    char nozzle[maxChars], print[maxChars];
+    pgmtext_with_colon(_i("Nozzle FAN"), nozzle, maxChars);  ////c=10 r=1
+    pgmtext_with_colon(_i("Print FAN"), print, maxChars);  ////c=10 r=1
+    lcd_printf_P(_N("%s %4d RPM\n" "%s %4d RPM\n"), nozzle, 60*fan_speed[0], print, 60*fan_speed[1] ); 
 
 
 #ifdef PAT9125
 #ifdef PAT9125
 	// Display X and Y difference from Filament sensor    
 	// Display X and Y difference from Filament sensor    
@@ -1715,8 +1741,9 @@ void lcd_menu_extruder_info()                     // NOT static due to using ins
 			if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal))
 			if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal))
 				pat9125_update();
 				pat9125_update();
 			lcd_printf_P(_N(
 			lcd_printf_P(_N(
-				"Fil. Xd:%3d Yd:%3d\n"
-				"Int: %3d  Shut: %3d"
+				"Fil. Xd:%3d Yd:%3d\n" ////c=4 r=1
+				"Int: %3d  " ////c=4 r=1
+				"Shut: %3d"  ////c=4 r=1
 			),
 			),
 				pat9125_x, pat9125_y,
 				pat9125_x, pat9125_y,
 				pat9125_b, pat9125_s
 				pat9125_b, pat9125_s
@@ -1728,124 +1755,183 @@ void lcd_menu_extruder_info()                     // NOT static due to using ins
     menu_back_if_clicked();
     menu_back_if_clicked();
 }
 }
 
 
+//! @brief Show Fails Statistics MMU
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! | Main               |	c=18 r=1
+//! | Last print         |	c=18 r=1
+//! | Total              |	c=18 r=1
+//! |                    |
+//! ----------------------
+//! @endcode
 static void lcd_menu_fails_stats_mmu()
 static void lcd_menu_fails_stats_mmu()
 {
 {
 	MENU_BEGIN();
 	MENU_BEGIN();
 	MENU_ITEM_BACK_P(_T(MSG_MAIN));
 	MENU_ITEM_BACK_P(_T(MSG_MAIN));
-	MENU_ITEM_SUBMENU_P(_i("Last print"), lcd_menu_fails_stats_mmu_print);
-	MENU_ITEM_SUBMENU_P(_i("Total"), lcd_menu_fails_stats_mmu_total);
+	MENU_ITEM_SUBMENU_P(_i("Last print"), lcd_menu_fails_stats_mmu_print); ////c=18 r=1
+	MENU_ITEM_SUBMENU_P(_i("Total"), lcd_menu_fails_stats_mmu_total); ////c=18 r=1
 	MENU_END();
 	MENU_END();
 }
 }
 
 
+//! @brief Show Last Print Failures Statistics MMU
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |Last print failures |	c=20 r=1
+//! | MMU fails:      000|	c=14 r=1
+//! | MMU load fails: 000|	c=14 r=1
+//! |                    |
+//! ----------------------
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_fails_stats_mmu_print()
 static void lcd_menu_fails_stats_mmu_print()
 {
 {
-//01234567890123456789
-//Last print failures
-// MMU fails  000
-// MMU load fails  000
-//
-//////////////////////
 	lcd_timeoutToStatus.stop(); //infinite timeout
 	lcd_timeoutToStatus.stop(); //infinite timeout
     uint8_t fails = eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL);
     uint8_t fails = eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL);
     uint16_t load_fails = eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL);
     uint16_t load_fails = eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL);
-	lcd_home();
-	lcd_printf_P(PSTR("%S\n" " %S  %-3d\n" " %S  %-3d"), _i("Last print failures"), _i("MMU fails"), fails, _i("MMU load fails"), load_fails);
-	menu_back_if_clicked_fb();
+    lcd_home();
+    lcd_printf_P(PSTR("%S\n" " %-16.16S%-3d\n" " %-16.16S%-3d"), 
+        _i("Last print failures"), ////c=20 r=1
+        _i("MMU fails"), fails, ////c=14 r=1
+        _i("MMU load fails"), load_fails); ////c=14 r=1
+    menu_back_if_clicked_fb();
 }
 }
 
 
+//! @brief Show Total Failures Statistics MMU
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |Total failures      |	c=20 r=1
+//! | MMU fails:      000|	c=14 r=1
+//! | MMU load fails: 000|	c=14 r=1
+//! | MMU power fails:000|	c=14 r=1
+//! ----------------------
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_fails_stats_mmu_total()
 static void lcd_menu_fails_stats_mmu_total()
 {
 {
-//01234567890123456789
-//Last print failures
-// MMU fails  000
-// MMU load fails  000
-//
-//////////////////////
 	mmu_command(MmuCmd::S3);
 	mmu_command(MmuCmd::S3);
 	lcd_timeoutToStatus.stop(); //infinite timeout
 	lcd_timeoutToStatus.stop(); //infinite timeout
     uint8_t fails = eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL_TOT);
     uint8_t fails = eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL_TOT);
     uint16_t load_fails = eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL_TOT);
     uint16_t load_fails = eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL_TOT);
-	lcd_home();
-	lcd_printf_P(PSTR("%S\n" " %S  %-3d\n" " %S  %-3d\n" " %S %-3d"), _i("Total failures"), _i("MMU fails"), fails, _i("MMU load fails"), load_fails, _i("MMU power fails"), mmu_power_failures);
-	menu_back_if_clicked_fb();
+    lcd_home();
+    lcd_printf_P(PSTR("%S\n" " %-16.16S%-3d\n" " %-16.16S%-3d\n" " %-16.16S%-3d"), 
+        _i("Total failures"), ////c=20 r=1
+        _i("MMU fails"), fails, ////c=14 r=1
+        _i("MMU load fails"), load_fails, ////c=14 r=1
+        _i("MMU power fails"), mmu_power_failures); ////c=14 r=1
+    menu_back_if_clicked_fb();
 }
 }
 
 
 #if defined(TMC2130) && defined(FILAMENT_SENSOR)
 #if defined(TMC2130) && defined(FILAMENT_SENSOR)
+static const char failStatsFmt[] PROGMEM = "%S\n" " %-16.16S%-3d\n" " %-16.16S%-3d\n" " %-7.7SX %-3d  Y %-3d";
+
+//! @brief Show Total Failures Statistics MMU
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |Total failures      |	c=20 r=1
+//! | Power failures: 000|	c=14 r=1
+//! | Filam. runouts: 000|	c=14 r=1
+//! | Crash   X:000 Y:000|	c=7 r=1
+//! ----------------------
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_fails_stats_total()
 static void lcd_menu_fails_stats_total()
 {
 {
-//01234567890123456789
-//Total failures
-// Power failures  000
-// Filam. runouts  000
-// Crash  X 000  Y 000
-//////////////////////
 	lcd_timeoutToStatus.stop(); //infinite timeout
 	lcd_timeoutToStatus.stop(); //infinite timeout
     uint16_t power = eeprom_read_word((uint16_t*)EEPROM_POWER_COUNT_TOT);
     uint16_t power = eeprom_read_word((uint16_t*)EEPROM_POWER_COUNT_TOT);
     uint16_t filam = eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT);
     uint16_t filam = eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT);
     uint16_t crashX = eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT);
     uint16_t crashX = eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT);
     uint16_t crashY = eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT);
     uint16_t crashY = eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT);
-	lcd_home();
-	lcd_printf_P(PSTR("%S\n" " %S  %-3d\n" " %S  %-3d\n" " %S  X %-3d  Y %-3d"), _i("Total failures"), _i("Power failures"), power, _i("Filam. runouts"), filam, _i("Crash"), crashX, crashY);
-	menu_back_if_clicked_fb();
+    lcd_home();
+    lcd_printf_P(failStatsFmt, 
+        _i("Total failures"),   ////c=20 r=1
+        _i("Power failures"), power,   ////c=14 r=1
+        _i("Filam. runouts"), filam,   ////c=14 r=1
+        _i("Crash"), crashX, crashY);  ////c=7 r=1
+    menu_back_if_clicked_fb();
 }
 }
 
 
+//! @brief Show Last Print Failures Statistics
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |Last print failures |	c=20 r=1
+//! | Power failures: 000|	c=14 r=1
+//! | Filam. runouts: 000|	c=14 r=1
+//! | Crash   X:000 Y:000|	c=7 r=1
+//! ----------------------
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_fails_stats_print()
 static void lcd_menu_fails_stats_print()
 {
 {
-//01234567890123456789
-//Last print failures
-// Power failures  000
-// Filam. runouts  000
-// Crash  X 000  Y 000
-//////////////////////
 	lcd_timeoutToStatus.stop(); //infinite timeout
 	lcd_timeoutToStatus.stop(); //infinite timeout
     uint8_t power = eeprom_read_byte((uint8_t*)EEPROM_POWER_COUNT);
     uint8_t power = eeprom_read_byte((uint8_t*)EEPROM_POWER_COUNT);
     uint8_t filam = eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT);
     uint8_t filam = eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT);
     uint8_t crashX = eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_X);
     uint8_t crashX = eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_X);
     uint8_t crashY = eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_Y);
     uint8_t crashY = eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT_Y);
-	lcd_home();
-	lcd_printf_P(PSTR("%S\n" " %S  %-3d\n" " %S  %-3d\n" " %S  X %-3d  Y %-3d"), _i("Last print failures"), _i("Power failures"), power, _i("Filam. runouts"), filam, _i("Crash"), crashX, crashY);
-	menu_back_if_clicked_fb();
-}
+    lcd_home();
+    lcd_printf_P(failStatsFmt,
+        _i("Last print failures"),  ////c=20 r=1
+        _i("Power failures"), power,  ////c=14 r=1
+        _i("Filam. runouts"), filam,  ////c=14 r=1
+        _i("Crash"), crashX, crashY);  ////c=7 r=1
+    menu_back_if_clicked_fb();
+}
+
+//! @brief Open fail statistics menu
+//! 
+//! This version of function is used, when there is filament sensor,
+//! power failure and crash detection.
+//! There are Last print and Total menu items.
+//! 
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! | Main               |	c=18 r=1
+//! | Last print         |	c=18 r=1
+//! | Total              |	c=18 r=1
+//! |                    |
+//! ----------------------
+//! @endcode
 
 
-/**
- * @brief Open fail statistics menu
- *
- * This version of function is used, when there is filament sensor,
- * power failure and crash detection.
- * There are Last print and Total menu items.
- */
 static void lcd_menu_fails_stats()
 static void lcd_menu_fails_stats()
 {
 {
 	MENU_BEGIN();
 	MENU_BEGIN();
 	MENU_ITEM_BACK_P(_T(MSG_MAIN));
 	MENU_ITEM_BACK_P(_T(MSG_MAIN));
-	MENU_ITEM_SUBMENU_P(_i("Last print"), lcd_menu_fails_stats_print);
-	MENU_ITEM_SUBMENU_P(_i("Total"), lcd_menu_fails_stats_total);
+	MENU_ITEM_SUBMENU_P(_i("Last print"), lcd_menu_fails_stats_print);  ////c=18 r=1
+	MENU_ITEM_SUBMENU_P(_i("Total"), lcd_menu_fails_stats_total);  ////c=18 r=1
 	MENU_END();
 	MENU_END();
 }
 }
 
 
 #elif defined(FILAMENT_SENSOR)
 #elif defined(FILAMENT_SENSOR)
-/**
- * @brief Print last print and total filament run outs
- *
- * This version of function is used, when there is filament sensor,
- * but no other sensors (e.g. power failure, crash detection).
- *
- * Example screen:
- * @code
- * 01234567890123456789
- * Last print failures
- *  Filam. runouts  0
- * Total failures
- *  Filam. runouts  5
- * @endcode
- */
+//! 
+//! @brief Print last print and total filament run outs
+//! 
+//! This version of function is used, when there is filament sensor,
+//! but no other sensors (e.g. power failure, crash detection).
+//! 
+//! Example screen:
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |Last print failures |	c=20 r=1
+//! | Filam. runouts: 000|	c=14 r=1
+//! |Total failures      |	c=20 r=1
+//! | Filam. runouts: 000|	c=14 r=1
+//! ----------------------
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_fails_stats()
 static void lcd_menu_fails_stats()
 {
 {
 	lcd_timeoutToStatus.stop(); //infinite timeout
 	lcd_timeoutToStatus.stop(); //infinite timeout
     uint8_t filamentLast = eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT);
     uint8_t filamentLast = eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT);
     uint16_t filamentTotal = eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT);
     uint16_t filamentTotal = eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT);
 	lcd_home();
 	lcd_home();
-    lcd_printf_P(PSTR("Last print failures\n" " Filam. runouts  %-3d\n" "Total failures\n" " Filam. runouts  %-3d"), filamentLast, filamentTotal);
+    lcd_printf_P(PSTR("Last print failures\n"  ////c=20 r=1 
+        " Filam. runouts  %-3d\n"   ////c=14 r=1
+        "Total failures\n"  ////c=20 r=1
+        " Filam. runouts  %-3d"), filamentLast, filamentTotal);  ////c=14 r=1
     menu_back_if_clicked();
     menu_back_if_clicked();
 }
 }
 #else
 #else
@@ -1866,27 +1952,64 @@ extern char* __malloc_heap_start;
 extern char* __malloc_heap_end;
 extern char* __malloc_heap_end;
 #endif //DEBUG_STACK_MONITOR
 #endif //DEBUG_STACK_MONITOR
 
 
+//! @brief Show Debug Information
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |RAM statistics      |	c=20 r=1
+//! | SP_min:        0000|	c=14 r=1
+//! | heap_start:    0000|	c=14 r=1
+//! | heap_end:      0000|	c=14 r=1
+//! ----------------------
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_debug()
 static void lcd_menu_debug()
 {
 {
 #ifdef DEBUG_STACK_MONITOR
 #ifdef DEBUG_STACK_MONITOR
 	lcd_home();
 	lcd_home();
-	lcd_printf_P(PSTR("RAM statistics\n" " SP_min: 0x%04x\n" " heap_start: 0x%04x\n" " heap_end: 0x%04x"), SP_min, __malloc_heap_start, __malloc_heap_end);
+	lcd_printf_P(PSTR("RAM statistics\n"  ////c=20 r=1
+        " SP_min: 0x%04x\n"   ////c=14 r=1
+        " heap_start: 0x%04x\n"   ////c=14 r=1
+        " heap_end: 0x%04x"), SP_min, __malloc_heap_start, __malloc_heap_end);  ////c=14 r=1
 #endif //DEBUG_STACK_MONITOR
 #endif //DEBUG_STACK_MONITOR
 
 
 	menu_back_if_clicked_fb();
 	menu_back_if_clicked_fb();
 }
 }
 #endif /* DEBUG_BUILD */
 #endif /* DEBUG_BUILD */
 
 
+//! @brief common line print for lcd_menu_temperatures
+//! @param [in] ipgmLabel pointer to string in PROGMEM
+//! @param [in] value to be printed behind the label
+static void lcd_menu_temperatures_line(const char *ipgmLabel, int value){
+    static const size_t maxChars = 15;    
+    char tmp[maxChars];
+    pgmtext_with_colon(ipgmLabel, tmp, maxChars);
+    lcd_printf_P(PSTR(" %s%3d\x01 \n"), tmp, value); // no need to add -14.14 to string alignment
+}
+
+//! @brief Show Temperatures
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! | Nozzle:        000D|	c=14 r=1
+//! | Bed:           000D|	c=14 r=1
+//! | Ambient:       000D|	c=14 r=1
+//! | PINDA:         000D|	c=14 r=1
+//! ----------------------
+//! D - Degree sysmbol		LCD_STR_DEGREE
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_temperatures()
 static void lcd_menu_temperatures()
 {
 {
-	lcd_timeoutToStatus.stop(); //infinite timeout
-	lcd_home();
-	lcd_printf_P(PSTR(" %S:   %d%c \n" " %S:      %d%c \n"), _i("Nozzle"), (int)current_temperature[0], '\x01', _i("Bed"), (int)current_temperature_bed, '\x01');
+    lcd_timeoutToStatus.stop(); //infinite timeout
+    lcd_home();
+    lcd_menu_temperatures_line( _T(MSG_NOZZLE), (int)current_temperature[0] ); ////c=14 r=1
+    lcd_menu_temperatures_line( _T(MSG_BED), (int)current_temperature_bed );  ////c=14 r=1
 #ifdef AMBIENT_THERMISTOR
 #ifdef AMBIENT_THERMISTOR
-	lcd_printf_P(PSTR(" %S:  %d%c\n" " PINDA:    %d%c"), _i("Ambient"), (int)current_temperature_ambient, '\x01', (int)current_temperature_pinda, '\x01');
-#else //AMBIENT_THERMISTOR
-	lcd_printf_P(PSTR(" PINDA:    %d%c"), (int)current_temperature_pinda, '\x01');
-#endif //AMBIENT_THERMISTOR
+    lcd_menu_temperatures_line( _i("Ambient"), (int)current_temperature_ambient );  ////c=14 r=1
+#endif
+    lcd_menu_temperatures_line( _i("PINDA"), (int)current_temperature_pinda );  ////c=14 r=1
+
 
 
     menu_back_if_clicked();
     menu_back_if_clicked();
 }
 }
@@ -1896,6 +2019,17 @@ static void lcd_menu_temperatures()
 #define VOLT_DIV_R2 2370
 #define VOLT_DIV_R2 2370
 #define VOLT_DIV_FAC ((float)VOLT_DIV_R2 / (VOLT_DIV_R2 + VOLT_DIV_R1))
 #define VOLT_DIV_FAC ((float)VOLT_DIV_R2 / (VOLT_DIV_R2 + VOLT_DIV_R1))
 #define VOLT_DIV_REF 5
 #define VOLT_DIV_REF 5
+//! @brief Show Voltages
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |                    |
+//! | PWR:         00.0V |	c=12 r=1
+//! | Bed:         00.0V |	c=12 r=1
+//! |                    |
+//! ----------------------
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_voltages()
 static void lcd_menu_voltages()
 {
 {
 	lcd_timeoutToStatus.stop(); //infinite timeout
 	lcd_timeoutToStatus.stop(); //infinite timeout
@@ -1908,6 +2042,17 @@ static void lcd_menu_voltages()
 #endif //defined VOLT_BED_PIN || defined VOLT_PWR_PIN
 #endif //defined VOLT_BED_PIN || defined VOLT_PWR_PIN
 
 
 #ifdef TMC2130
 #ifdef TMC2130
+//! @brief Show Belt Status
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! | Belt status        |	c=18 r=1
+//! |  X:            000 |
+//! |  Y:            000 |
+//! |                    |
+//! ----------------------
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_belt_status()
 static void lcd_menu_belt_status()
 {
 {
 	lcd_home();
 	lcd_home();
@@ -1931,12 +2076,85 @@ static void lcd_menu_test_restore()
 }
 }
 #endif //RESUME_DEBUG 
 #endif //RESUME_DEBUG 
 
 
+//! @brief Show Preheat Menu
 static void lcd_preheat_menu()
 static void lcd_preheat_menu()
 {
 {
     eFilamentAction = FilamentAction::Preheat;
     eFilamentAction = FilamentAction::Preheat;
     mFilamentMenu();
     mFilamentMenu();
 }
 }
 
 
+//! @brief Show Support Menu
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! | Main               |
+//! | Firmware:          |	c=18 r=1
+//! |  3.7.2.-2363       |	c=16 r=1
+//! | prusa3d.com        |	MSG_PRUSA3D
+//! | forum.prusa3d.com  |	MSG_PRUSA3D_FORUM
+//! | howto.prusa3d.com  |	MSG_PRUSA3D_HOWTO
+//! | --------------     |	STR_SEPARATOR
+//! | 1_75mm_MK3         |	FILAMENT_SIZE
+//! | howto.prusa3d.com  |	ELECTRONICS
+//! | howto.prusa3d.com  |	NOZZLE_TYPE
+//! | --------------     |	STR_SEPARATOR
+//! | Date:              |	c=17 r=1
+//! | MMM DD YYYY        |	__DATE__
+//! | --------------     |	STR_SEPARATOR
+//! @endcode
+//! 
+//! If MMU is connected
+//! 
+//! 	@code{.unparsed}
+//! 	| MMU2 connected     |	c=18 r=1
+//! 	|  FW: 1.0.6-7064523 |
+//! 	@endcode
+//! 
+//! If MMU is not connected
+//! 
+//! 	@code{.unparsed}
+//! 	| MMU2       N/A     |	c=18 r=1
+//! 	@endcode
+//! 
+//! If Flash Air is connected
+//! 
+//! 	@code{.unparsed}
+//! 	| --------------     |	STR_SEPARATOR
+//! 	| FlashAir IP Addr:  |	c=18 r=1
+//! 	|  192.168.1.100     |
+//! 	@endcode
+//! 
+//! @code{.unparsed}
+//! | --------------     |	STR_SEPARATOR
+//! | XYZ cal. details   |	MSG_XYZ_DETAILS
+//! | Extruder info      |	MSG_INFO_EXTRUDER
+//! | XYZ cal. details   |	MSG_INFO_SENSORS
+//! @endcode
+//! 
+//! If TMC2130 defined
+//! 
+//! 	@code{.unparsed}
+//! 	| Belt status        |	MSG_MENU_BELT_STATUS
+//! @endcode
+//! 
+//! @code{.unparsed}
+//! | Temperatures       |	MSG_MENU_TEMPERATURES
+//! @endcode
+//! 
+//! If Voltage Bed and PWR Pin are defined
+//! 
+//! 	@code{.unparsed}
+//! 	| Voltages           |	MSG_MENU_VOLTAGES
+//! 	@endcode
+//! 
+//! 
+//! If DEBUG_BUILD is defined
+//! 
+//! 	@code{.unparsed}
+//! 	| Debug              |	c=18 r=1
+//! 	@endcode
+//! ----------------------
+//! @endcode
 static void lcd_support_menu()
 static void lcd_support_menu()
 {
 {
 	typedef struct
 	typedef struct
@@ -1998,8 +2216,8 @@ static void lcd_support_menu()
 	MENU_ITEM_BACK_P(STR_SEPARATOR);
 	MENU_ITEM_BACK_P(STR_SEPARATOR);
 	if (mmu_enabled)
 	if (mmu_enabled)
 	{
 	{
-		MENU_ITEM_BACK_P(_i("MMU2 connected"));
-		MENU_ITEM_BACK_P(PSTR(" FW:"));
+		MENU_ITEM_BACK_P(_i("MMU2 connected"));  ////c=18 r=1
+		MENU_ITEM_BACK_P(PSTR(" FW:"));  ////c=17 r=1
 		if (((menu_item - 1) == menu_line) && lcd_draw_update)
 		if (((menu_item - 1) == menu_line) && lcd_draw_update)
 		{
 		{
 		    lcd_set_cursor(6, menu_row);
 		    lcd_set_cursor(6, menu_row);
@@ -2016,7 +2234,7 @@ static void lcd_support_menu()
   // Show the FlashAir IP address, if the card is available.
   // Show the FlashAir IP address, if the card is available.
   if (_md->is_flash_air) {
   if (_md->is_flash_air) {
       MENU_ITEM_BACK_P(STR_SEPARATOR);
       MENU_ITEM_BACK_P(STR_SEPARATOR);
-      MENU_ITEM_BACK_P(PSTR("FlashAir IP Addr:"));
+      MENU_ITEM_BACK_P(PSTR("FlashAir IP Addr:"));  //c=18 r=1
 ///!      MENU_ITEM(back_RAM, _md->ip_str, 0);
 ///!      MENU_ITEM(back_RAM, _md->ip_str, 0);
   }
   }
 
 
@@ -2037,7 +2255,7 @@ static void lcd_support_menu()
 #endif //defined VOLT_BED_PIN || defined VOLT_PWR_PIN
 #endif //defined VOLT_BED_PIN || defined VOLT_PWR_PIN
 
 
 #ifdef DEBUG_BUILD
 #ifdef DEBUG_BUILD
-  MENU_ITEM_SUBMENU_P(PSTR("Debug"), lcd_menu_debug);
+  MENU_ITEM_SUBMENU_P(PSTR("Debug"), lcd_menu_debug);////c=18 r=1
 #endif /* DEBUG_BUILD */
 #endif /* DEBUG_BUILD */
 
 
   #endif //MK1BP
   #endif //MK1BP
@@ -2629,9 +2847,9 @@ if(0)
 //!
 //!
 //! @code{.unparsed}
 //! @code{.unparsed}
 //! |01234567890123456789|
 //! |01234567890123456789|
-//! |Filament used:      |
+//! |Filament used:      | c=18 r=1
 //! |         00.00m     |
 //! |         00.00m     |
-//! |Print time:         |
+//! |Print time:         | c=18 r=1
 //! |        00h 00m 00s |
 //! |        00h 00m 00s |
 //! ----------------------
 //! ----------------------
 //! @endcode
 //! @endcode
@@ -2640,12 +2858,13 @@ if(0)
 //!
 //!
 //! @code{.unparsed}
 //! @code{.unparsed}
 //! |01234567890123456789|
 //! |01234567890123456789|
-//! |Total filament :    |
+//! |Total filament :    | c=18 r=1
 //! |           000.00 m |
 //! |           000.00 m |
-//! |Total print time :  |
+//! |Total print time :  | c=18 r=1
 //! |     00d :00h :00 m |
 //! |     00d :00h :00 m |
 //! ----------------------
 //! ----------------------
 //! @endcode
 //! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations. Translations missing for "d"days, "h"ours, "m"inutes", "s"seconds".
 void lcd_menu_statistics()
 void lcd_menu_statistics()
 {
 {
 	if (IS_SD_PRINTING)
 	if (IS_SD_PRINTING)
@@ -2659,10 +2878,12 @@ void lcd_menu_statistics()
 		lcd_clear();
 		lcd_clear();
 		lcd_printf_P(_N(
 		lcd_printf_P(_N(
 			"%S:\n"
 			"%S:\n"
-			"%8.2fm\n"
+			"%17.2fm  \n"
 			"%S:\n"
 			"%S:\n"
 			"%2dh %02dm %02ds"
 			"%2dh %02dm %02ds"
-		),_i("Filament used"), _met, _i("Print time"), _h, _m, _s);
+		    ),
+            _i("Filament used"), _met,  ////c=18 r=1
+            _i("Print time"), _h, _m, _s);  ////c=18 r=1
 		menu_back_if_clicked_fb();
 		menu_back_if_clicked_fb();
 	}
 	}
 	else
 	else
@@ -2681,7 +2902,7 @@ void lcd_menu_statistics()
 		lcd_clear();
 		lcd_clear();
 		lcd_printf_P(_N(
 		lcd_printf_P(_N(
 			"%S:\n"
 			"%S:\n"
-			"%8.2fm\n"
+			"%17.2fm  \n"
 			"%S:\n"
 			"%S:\n"
 			"%7ldd :%2hhdh :%02hhdm"
 			"%7ldd :%2hhdh :%02hhdm"
 		), _i("Total filament"), _filament_m, _i("Total print time"), _days, _hours, _minutes);
 		), _i("Total filament"), _filament_m, _i("Total print time"), _days, _hours, _minutes);
@@ -2769,17 +2990,20 @@ static void lcd_move_e()
 }
 }
 
 
 
 
-//@brief Show measured Y distance of front calibration points from Y_MIN_POS
-//If those points are detected too close to edge of reachable area, their confidence is lowered.
-//This functionality is applied more often for MK2 printers.
+//! @brief Show measured Y distance of front calibration points from Y_MIN_POS
+//! If those points are detected too close to edge of reachable area, their confidence is lowered.
+//! This functionality is applied more often for MK2 printers.
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |Y distance from min |	c=19 r=1
+//! | --------------     |	STR_SEPARATOR
+//! |Left:       00.00mm |	c=11 r=1
+//! |Right:      00.00mm |	c=11 r=1
+//! ----------------------
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_xyz_y_min()
 static void lcd_menu_xyz_y_min()
 {
 {
-//|01234567890123456789|
-//|Y distance from min:|
-//|--------------------|
-//|Left:      N/A      |
-//|Right:     N/A      |
-//----------------------
 	float distanceMin[2];
 	float distanceMin[2];
     count_xyz_details(distanceMin);
     count_xyz_details(distanceMin);
 	lcd_home();
 	lcd_home();
@@ -2789,15 +3013,15 @@ static void lcd_menu_xyz_y_min()
 	  "%S:\n"
 	  "%S:\n"
 	  "%S:"
 	  "%S:"
 	 ),
 	 ),
-	 _i("Y distance from min"),
+	 _i("Y distance from min"),  ////c=19 r=1
 	 separator,
 	 separator,
-	 _i("Left"),
-	 _i("Right")
+	 _i("Left"),  ////c=11 r=1
+	 _i("Right")  ////c=11 r=1
 	);
 	);
 	for (uint8_t i = 0; i < 2; i++)
 	for (uint8_t i = 0; i < 2; i++)
 	{
 	{
 		lcd_set_cursor(11,2+i);
 		lcd_set_cursor(11,2+i);
-		if (distanceMin[i] >= 200) lcd_puts_P(_N("N/A"));
+		if (distanceMin[i] >= 200) lcd_puts_P(_N("N/A"));  ////c=3 r=1
 		else lcd_printf_P(_N("%6.2fmm"), distanceMin[i]);
 		else lcd_printf_P(_N("%6.2fmm"), distanceMin[i]);
 	}
 	}
     if (lcd_clicked())
     if (lcd_clicked())
@@ -2810,30 +3034,36 @@ float _deg(float rad)
 	return rad * 180 / M_PI;
 	return rad * 180 / M_PI;
 }
 }
 
 
+//! @brief Show Measured XYZ Skew
+//! 
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |Measured skew: 0.00D|	c=13 r=1
+//! | --------------     |	STR_SEPARATOR
+//! |Slight skew:   0.12D|	c=13 r=1  c=4 r=1
+//! |Severe skew:   0.25D|	c=13 r=1  c=4 r=1
+//! ----------------------
+//! D - Degree sysmbol		LCD_STR_DEGREE
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_xyz_skew()
 static void lcd_menu_xyz_skew()
 {
 {
-//|01234567890123456789|
-//|Measured skew:  N/A |
-//|--------------------|
-//|Slight skew:   0.12d|
-//|Severe skew:   0.25d|
-//----------------------
     float angleDiff = eeprom_read_float((float*)(EEPROM_XYZ_CAL_SKEW));
     float angleDiff = eeprom_read_float((float*)(EEPROM_XYZ_CAL_SKEW));
 	lcd_home();
 	lcd_home();
 	lcd_printf_P(_N(
 	lcd_printf_P(_N(
 	  "%S:\n"
 	  "%S:\n"
 	  "%S\n"
 	  "%S\n"
-	  "%S:  %5.2f\x01\n"
-	  "%S:  %5.2f\x01"
+	  "%-15.15S%3.2f\x01\n"
+	  "%-15.15S%3.2f\x01"
 	 ),
 	 ),
-	 _i("Measured skew"),
+	 _i("Measured skew"),  ////c=13 r=1
 	 separator,
 	 separator,
-	 _i("Slight skew"), _deg(bed_skew_angle_mild),
-	 _i("Severe skew"), _deg(bed_skew_angle_extreme)
+	 _i("Slight skew:"), _deg(bed_skew_angle_mild),  ////c=13 r=1  c=4 r=1
+	 _i("Severe skew:"), _deg(bed_skew_angle_extreme)  ////c=13 r=1  c=4 r=1
 	);
 	);
 	if (angleDiff < 100){
 	if (angleDiff < 100){
 		lcd_set_cursor(15,0);
 		lcd_set_cursor(15,0);
-		lcd_printf_P(_N("%4.2f\x01"), _deg(angleDiff));
+		lcd_printf_P(_N("%3.2f\x01"), _deg(angleDiff));
 	}
 	}
 	else{
 	else{
 		lcd_set_cursor(15,0);
 		lcd_set_cursor(15,0);
@@ -2842,16 +3072,24 @@ static void lcd_menu_xyz_skew()
     if (lcd_clicked())
     if (lcd_clicked())
         menu_goto(lcd_menu_xyz_offset, 0, true, true);
         menu_goto(lcd_menu_xyz_offset, 0, true, true);
 }
 }
-/**
- * @brief Show measured bed offset from expected position
- */
+//! @brief Show measured bed offset from expected position
+//! 
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |[0;0] point offset  |	c=20 r=1
+//! | --------------     |	STR_SEPARATOR
+//! |X:          000.00mm|	c=10 r=1
+//! |Y:          000.00mm|	c=10 r=1
+//! ----------------------
+//! @endcode
+//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
 static void lcd_menu_xyz_offset()
 static void lcd_menu_xyz_offset()
 {
 {
     lcd_set_cursor(0,0);
     lcd_set_cursor(0,0);
     lcd_puts_P(_i("[0;0] point offset"));////MSG_MEASURED_OFFSET
     lcd_puts_P(_i("[0;0] point offset"));////MSG_MEASURED_OFFSET
     lcd_puts_at_P(0, 1, separator);
     lcd_puts_at_P(0, 1, separator);
-    lcd_puts_at_P(0, 2, PSTR("X"));
-    lcd_puts_at_P(0, 3, PSTR("Y"));
+    lcd_puts_at_P(0, 2, PSTR("X"));  ////c=10 r=1
+    lcd_puts_at_P(0, 3, PSTR("Y"));  ////c=10 r=1
 
 
     float vec_x[2];
     float vec_x[2];
     float vec_y[2];
     float vec_y[2];
@@ -2860,9 +3098,9 @@ static void lcd_menu_xyz_offset()
 
 
     for (uint_least8_t i = 0; i < 2; i++)
     for (uint_least8_t i = 0; i < 2; i++)
     {
     {
-        lcd_puts_at_P(11, i + 2, PSTR(""));
+        lcd_set_cursor((cntr[i] < 0) ? 10 : 11, i+2);
         lcd_print(cntr[i]);
         lcd_print(cntr[i]);
-        lcd_puts_at_P((cntr[i] < 0) ? 17 : 16, i + 2, PSTR("mm"));
+        lcd_puts_at_P(16, i + 2, PSTR("mm"));
     }
     }
     menu_back_if_clicked();
     menu_back_if_clicked();
 }
 }
@@ -3010,6 +3248,18 @@ void lcd_adjust_bed_reset(void)
 	_md->status = 0;
 	_md->status = 0;
 }
 }
 
 
+//! @brief Show Bed level correct
+//! 
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |Settings:           |	MSG_SETTINGS
+//! |Left side [um]:     |	MSG_BED_CORRECTION_LEFT
+//! |Right side[um]:     |	MSG_BED_CORRECTION_RIGHT
+//! |Front side[um]:     |	MSG_BED_CORRECTION_FRONT
+//! |Rear side [um]:     |	MSG_BED_CORRECTION_REAR
+//! |Reset               |	MSG_BED_CORRECTION_RESET
+//! ----------------------
+//! @endcode
 void lcd_adjust_bed(void)
 void lcd_adjust_bed(void)
 {
 {
 	_menu_data_adjust_bed_t* _md = (_menu_data_adjust_bed_t*)&(menu_data[0]);
 	_menu_data_adjust_bed_t* _md = (_menu_data_adjust_bed_t*)&(menu_data[0]);
@@ -3047,6 +3297,16 @@ void lcd_adjust_bed(void)
     MENU_END();
     MENU_END();
 }
 }
 
 
+//! @brief Show PID Extruder
+//! 
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! | Set temperature:   |	MSG_SET_TEMPERATURE
+//! |                    |
+//! | 210                |
+//! |                    |
+//! ----------------------
+//! @endcode
 void pid_extruder()
 void pid_extruder()
 {
 {
 	lcd_clear();
 	lcd_clear();
@@ -4516,7 +4776,9 @@ void lcd_v2_calibration()
 {
 {
 	if (mmu_enabled)
 	if (mmu_enabled)
 	{
 	{
-	    const uint8_t filament = choose_menu_P(_i("Select PLA filament:"),_T(MSG_FILAMENT),_i("Cancel")); ////c=20 r=1  ////c=19 r=1
+	    const uint8_t filament = choose_menu_P(
+            _i("Select PLA filament:"), ////c=20 r=1
+            _T(MSG_FILAMENT),_i("Cancel"));  ////c=19 r=1
 	    if (filament < 5)
 	    if (filament < 5)
 	    {
 	    {
 	        lcd_commands_step = 20 + filament;
 	        lcd_commands_step = 20 + filament;

+ 10 - 5
README.md

@@ -111,7 +111,9 @@ Now your Ubuntu subsystem is ready to use the automatic `PF-build.sh` script and
 - Unix and windows have different line endings (LF vs CRLF), try dos2unix to convert
 - Unix and windows have different line endings (LF vs CRLF), try dos2unix to convert
   - This should fix the `"$'\r': command not found"` error
   - This should fix the `"$'\r': command not found"` error
   - to install run `apt-get install dos2unix`
   - to install run `apt-get install dos2unix`
-
+- If your Windows isn't in English the Paths may look different
+  Example in other languages
+  - English `/mnt/c/Users/<your-username>/Downloads/Prusa-Firmware-MK3` will be on a German Windows`/mnt/c/Anwender/<your-username>/Downloads/Prusa-Firmware-MK3`
 #### Compile Prusa-firmware with Ubuntu Linux subsystem installed
 #### Compile Prusa-firmware with Ubuntu Linux subsystem installed
 - open Ubuntu bash
 - open Ubuntu bash
 - change to your source code folder (case sensitive)
 - change to your source code folder (case sensitive)
@@ -123,11 +125,14 @@ _notes: Script and instructions contributed by 3d-gussner. Use at your own risk.
 - Download and install the 64bit Git version https://git-scm.com/download/win
 - Download and install the 64bit Git version https://git-scm.com/download/win
 - Also follow these instructions https://gist.github.com/evanwill/0207876c3243bbb6863e65ec5dc3f058
 - Also follow these instructions https://gist.github.com/evanwill/0207876c3243bbb6863e65ec5dc3f058
 - Download and install 7z-zip from its official website https://www.7-zip.org/
 - Download and install 7z-zip from its official website https://www.7-zip.org/
-  By default, it is installed under the directory /c/Program Files/7-Zip in Windows 10
+  By default, it is installed under the directory /c/Program\ Files/7-Zip in Windows 10
 - Run `Git-Bash` under Administrator privilege
 - Run `Git-Bash` under Administrator privilege
-- navigate to the directory /c/Program Files/Git/mingw64/bin
-- run `ln -s /c/Program Files/7-Zip/7z.exe zip.exe`
-
+- navigate to the directory /c/Program\ Files/Git/mingw64/bin
+- run `ln -s /c/Program\ Files/7-Zip/7z.exe zip.exe`
+- If your Windows isn't in English the Paths may look different
+  Example in other languages
+  - English `/mnt/c/Users/<your-username>/Downloads/Prusa-Firmware-MK3` will be on a German Windows`/mnt/c/Anwender/<your-username>/Downloads/Prusa-Firmware-MK3`
+  - English `ln -s /c/Program\ Files/7-Zip/7z.exe zip.exe` will be on a Spanish Windows `ln -s /c/Archivos\ de\ programa/7-Zip/7z.exe zip.exe`
 #### Compile Prusa-firmware with Git-bash installed
 #### Compile Prusa-firmware with Git-bash installed
 - open Git-bash
 - open Git-bash
 - change to your source code folder
 - change to your source code folder

+ 55 - 35
lang/lang-import.sh

@@ -4,7 +4,19 @@
 #  for importing translated xx.po
 #  for importing translated xx.po
 
 
 LNG=$1
 LNG=$1
-if [ -z "$LNG" ]; then exit -1; fi
+# if no arguments, 'all' is selected (all po and also pot will be generated)
+if [ -z "$LNG" ]; then LNG=all; fi
+
+# if 'all' is selected, script will generate all po files and also pot file
+if [ "$LNG" = "all" ]; then
+ ./lang-import.sh cz
+ ./lang-import.sh de
+ ./lang-import.sh es
+ ./lang-import.sh fr
+ ./lang-import.sh it
+ ./lang-import.sh pl
+ exit 0
+fi
 
 
 # language code (iso639-1) is equal to LNG
 # language code (iso639-1) is equal to LNG
 LNGISO=$LNG
 LNGISO=$LNG
@@ -28,51 +40,51 @@ sed -i 's/ \\n/ /g;s/\\n/ /g' $LNG'_filtered.po'
 
 
 #replace in czech translation
 #replace in czech translation
 if [ "$LNG" = "cz" ]; then
 if [ "$LNG" = "cz" ]; then
- #replace 'ž' with 'z'
+ #replace 'ž' with 'z'
  sed -i 's/\xc5\xbe/z/g' $LNG'_filtered.po'
  sed -i 's/\xc5\xbe/z/g' $LNG'_filtered.po'
- #replace 'ì' with 'e'
+ #replace 'ì' with 'e'
  sed -i 's/\xc4\x9b/e/g' $LNG'_filtered.po'
  sed -i 's/\xc4\x9b/e/g' $LNG'_filtered.po'
- #replace 'í' with 'i'
+ #replace 'í' with 'i'
  sed -i 's/\xc3\xad/i/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xad/i/g' $LNG'_filtered.po'
- #replace 'ø' with 'r'
+ #replace 'ø' with 'r'
  sed -i 's/\xc5\x99/r/g' $LNG'_filtered.po'
  sed -i 's/\xc5\x99/r/g' $LNG'_filtered.po'
- #replace 'è' with 'c'
+ #replace 'è' with 'c'
  sed -i 's/\xc4\x8d/c/g' $LNG'_filtered.po'
  sed -i 's/\xc4\x8d/c/g' $LNG'_filtered.po'
- #replace 'á' with 'a'
+ #replace 'á' with 'a'
  sed -i 's/\xc3\xa1/a/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xa1/a/g' $LNG'_filtered.po'
- #replace 'é' with 'e'
+ #replace 'é' with 'e'
  sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
 fi
 fi
 
 
-#replace in german translation
+#replace in german translation https://en.wikipedia.org/wiki/German_orthography
 if [ "$LNG" = "de" ]; then
 if [ "$LNG" = "de" ]; then
- #replace 'ä' with 'ae'
+ #replace 'ä' with 'ae'
  sed -i 's/\xc3\xa4/ae/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xa4/ae/g' $LNG'_filtered.po'
- #replace 'ü' with 'ue'
- sed -i 's/\xc3\xbc/ue/g' $LNG'_filtered.po'
- #replace 'ö' with 'oe'
- sed -i 's/\xc3\xb6/oe/g' $LNG'_filtered.po'
- #replace 'Ä' with 'Ae'
+ #replace 'Ä' with 'Ae'
  sed -i 's/\xc3\x84/Ae/g' $LNG'_filtered.po'
  sed -i 's/\xc3\x84/Ae/g' $LNG'_filtered.po'
- #replace 'Ü' with 'Ue'
+ #replace 'ü' with 'ue'
+ sed -i 's/\xc3\xbc/ue/g' $LNG'_filtered.po'
+ #replace 'Ü' with 'Ue'
  sed -i 's/\xc3\x9c/Ue/g' $LNG'_filtered.po'
  sed -i 's/\xc3\x9c/Ue/g' $LNG'_filtered.po'
- #replace 'Ö' with 'Oe'
+ #replace 'ö' with 'oe'
+ sed -i 's/\xc3\xb6/oe/g' $LNG'_filtered.po'
+ #replace 'Ö' with 'Oe'
  sed -i 's/\xc3\x96/Oe/g' $LNG'_filtered.po'
  sed -i 's/\xc3\x96/Oe/g' $LNG'_filtered.po'
- #replace 'ß' with 'ss'
+ #replace 'ß' with 'ss'
  sed -i 's/\xc3\x9f/ss/g' $LNG'_filtered.po'
  sed -i 's/\xc3\x9f/ss/g' $LNG'_filtered.po'
 fi
 fi
 
 
 #replace in spain translation
 #replace in spain translation
 if [ "$LNG" = "es" ]; then
 if [ "$LNG" = "es" ]; then
- #replace 'á' with 'a'
+ #replace 'á' with 'a'
  sed -i 's/\xc3\xa1/a/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xa1/a/g' $LNG'_filtered.po'
- #replace '?' with '?'
+ #replace '¿' with '?'
  sed -i 's/\xc2\xbf/?/g' $LNG'_filtered.po'
  sed -i 's/\xc2\xbf/?/g' $LNG'_filtered.po'
- #replace 'ó' with 'o'
+ #replace 'ó' with 'o'
  sed -i 's/\xc3\xb3/o/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xb3/o/g' $LNG'_filtered.po'
- #replace 'é' with 'e'
+ #replace 'é' with 'e'
  sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
- #replace 'í' with 'i'
+ #replace 'í' with 'i'
  sed -i 's/\xc3\xad/i/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xad/i/g' $LNG'_filtered.po'
  #replace '!' with '!'
  #replace '!' with '!'
  sed -i 's/\xc2\xa1/!/g' $LNG'_filtered.po'
  sed -i 's/\xc2\xa1/!/g' $LNG'_filtered.po'
@@ -80,31 +92,39 @@ if [ "$LNG" = "es" ]; then
  sed -i 's/\xc3\xb1/n/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xb1/n/g' $LNG'_filtered.po'
 fi
 fi
 
 
-#replace in french translation
+#replace in french translation https://en.wikipedia.org/wiki/French_orthography
 if [ "$LNG" = "fr" ]; then
 if [ "$LNG" = "fr" ]; then
- #replace 'é' with 'e'
+ #replace 'á' with 'a' (right)
+ sed -i 's/\xc3\xa1/a/g' $LNG'_filtered.po'
+ #replace '�' with 'A' (right)
+ sed -i 's/\xc3\x81/A/g' $LNG'_filtered.po'
+ #replace 'à' with 'a' (left)
+ sed -i 's/\xc3\xa0/a/g' $LNG'_filtered.po'
+ #replace 'À' with 'A' (left)
+ sed -i 's/\xc3\x80/A/g' $LNG'_filtered.po'
+ #replace 'é' with 'e' (right)
  sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
- #replace 'É' with 'E'
+ #replace 'É' with 'E' (right)
  sed -i 's/\xc3\x89/E/g' $LNG'_filtered.po'
  sed -i 's/\xc3\x89/E/g' $LNG'_filtered.po'
- #replace 'é' with 'e' (left)
+ #replace 'è' with 'e' (left)
  sed -i 's/\xc3\xa8/e/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xa8/e/g' $LNG'_filtered.po'
- #replace 'á' with 'a' (left)
- sed -i 's/\xc3\xa0/a/g' $LNG'_filtered.po'
+ #replace 'È' with 'E' (left)
+ sed -i 's/\xc3\x88/E/g' $LNG'_filtered.po'
 fi
 fi
 
 
 #replace in italian translation
 #replace in italian translation
 if [ "$LNG" = "it" ]; then
 if [ "$LNG" = "it" ]; then
- #replace 'é' with 'e' (left)
+ #replace 'é' with 'e' (left)
  sed -i 's/\xc3\xa8/e/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xa8/e/g' $LNG'_filtered.po'
- #replace 'á' with 'a' (left)
+ #replace 'á' with 'a' (left)
  sed -i 's/\xc3\xa0/a/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xa0/a/g' $LNG'_filtered.po'
- #replace 'ó' with 'o' (left)
+ #replace 'ó' with 'o' (left)
  sed -i 's/\xc3\xb2/o/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xb2/o/g' $LNG'_filtered.po'
- #replace 'ú' with 'u' (left)
+ #replace 'ú' with 'u' (left)
  sed -i 's/\xc3\xb9/u/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xb9/u/g' $LNG'_filtered.po'
- #replace 'é' with 'e'
+ #replace 'é' with 'e'
  sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
  sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
- #replace 'É' with 'E' (left)
+ #replace 'É' with 'E' (left)
  sed -i 's/\xc3\x88/E/g' $LNG'_filtered.po'
  sed -i 's/\xc3\x88/E/g' $LNG'_filtered.po'
 fi
 fi
 
 

+ 6 - 3
lang/lang_en.txt

@@ -734,7 +734,7 @@
 "Sort       [time]"
 "Sort       [time]"
 
 
 #
 #
-"Severe skew"
+"Severe skew:"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
 "Sort   [alphabet]"
 "Sort   [alphabet]"
@@ -746,7 +746,7 @@
 "Sound      [loud]"
 "Sound      [loud]"
 
 
 #
 #
-"Slight skew"
+"Slight skew:"
 
 
 #MSG_SOUND_MUTE c=17 r=1
 #MSG_SOUND_MUTE c=17 r=1
 "Sound      [mute]"
 "Sound      [mute]"
@@ -1061,7 +1061,7 @@
 "Sheet"
 "Sheet"
 
 
 #
 #
-"Sound     [assist]"
+"Sound    [assist]"
 
 
 #
 #
 "Steel sheets"
 "Steel sheets"
@@ -1074,3 +1074,6 @@
 
 
 #
 #
 "Z-probe nr.    [3]"
 "Z-probe nr.    [3]"
+
+#
+"Z-probe nr.    [5]"

+ 16 - 12
lang/lang_en_cz.txt

@@ -92,7 +92,7 @@
 
 
 #MSG_BED_HEATING
 #MSG_BED_HEATING
 "Bed Heating"
 "Bed Heating"
-"Zahrivani bed"
+"Zahrivani bedu"
 
 
 #MSG_BED_CORRECTION_MENU
 #MSG_BED_CORRECTION_MENU
 "Bed level correct"
 "Bed level correct"
@@ -508,7 +508,7 @@
 
 
 #
 #
 "Left"
 "Left"
-"Vlevo:"
+"Vlevo"
 
 
 #MSG_BED_CORRECTION_LEFT c=14 r=1
 #MSG_BED_CORRECTION_LEFT c=14 r=1
 "Left side [um]"
 "Left side [um]"
@@ -688,7 +688,7 @@
 
 
 #
 #
 "Nozzle FAN"
 "Nozzle FAN"
-"Tryska V."
+"Vent. trysky"
 
 
 #MSG_PAUSE_PRINT
 #MSG_PAUSE_PRINT
 "Pause print"
 "Pause print"
@@ -819,8 +819,8 @@
 "Predehrev k vyjmuti"
 "Predehrev k vyjmuti"
 
 
 #MSG_SELFTEST_PRINT_FAN_SPEED c=18
 #MSG_SELFTEST_PRINT_FAN_SPEED c=18
-"Print fan:"
-"Tiskovy v:"
+"Print fan"
+"Tiskovy vent."
 
 
 #MSG_CARD_MENU
 #MSG_CARD_MENU
 "Print from SD"
 "Print from SD"
@@ -844,7 +844,7 @@
 
 
 #
 #
 "Print FAN"
 "Print FAN"
-"Tiskovy v"
+"Tiskovy vent."
 
 
 #MSG_PRUSA3D
 #MSG_PRUSA3D
 "prusa3d.com"
 "prusa3d.com"
@@ -979,8 +979,8 @@
 "Trideni     [cas]"
 "Trideni     [cas]"
 
 
 #
 #
-"Severe skew"
-"Tezke zkoseni"
+"Severe skew:"
+"Tezke zkoseni:"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
 "Sort   [alphabet]"
 "Sort   [alphabet]"
@@ -995,8 +995,8 @@
 "Zvuk    [hlasity]"
 "Zvuk    [hlasity]"
 
 
 #
 #
-"Slight skew"
-"Lehke zkoseni"
+"Slight skew:"
+"Lehke zkoseni:"
 
 
 #MSG_SOUND_MUTE c=17 r=1
 #MSG_SOUND_MUTE c=17 r=1
 "Sound      [mute]"
 "Sound      [mute]"
@@ -1415,8 +1415,8 @@
 "Plat"
 "Plat"
 
 
 #
 #
-"Sound     [assist]"
-"Zvuk      [Asist.]"
+"Sound    [assist]"
+"Zvuk     [Asist.]"
 
 
 #
 #
 "Steel sheets"
 "Steel sheets"
@@ -1433,3 +1433,7 @@
 #
 #
 "Z-probe nr.    [3]"
 "Z-probe nr.    [3]"
 "Pocet mereni Z [3]"
 "Pocet mereni Z [3]"
+
+#
+"Z-probe nr.    [5]"
+"Pocet mereni Z [5]"

+ 30 - 26
lang/lang_en_de.txt

@@ -64,7 +64,7 @@
 
 
 #MSG_AUTOLOAD_FILAMENT c=17
 #MSG_AUTOLOAD_FILAMENT c=17
 "AutoLoad filament"
 "AutoLoad filament"
-"Auto-Laden Filament"
+"AutoLaden Filament"
 
 
 #MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
 #MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
 "Autoloading filament available only when filament sensor is turned on..."
 "Autoloading filament available only when filament sensor is turned on..."
@@ -320,7 +320,7 @@
 
 
 #MSG_FILAMENT_CLEAN c=20 r=2
 #MSG_FILAMENT_CLEAN c=20 r=2
 "Filament extruding & with correct color?"
 "Filament extruding & with correct color?"
-"Filament extrudiert + richtige Farbe?"
+"Filament extrudiert mit richtiger Farbe?"
 
 
 #MSG_NOT_LOADED c=19
 #MSG_NOT_LOADED c=19
 "Filament not loaded"
 "Filament not loaded"
@@ -556,11 +556,11 @@
 
 
 #MSG_MESH_BED_LEVELING
 #MSG_MESH_BED_LEVELING
 "Mesh Bed Leveling"
 "Mesh Bed Leveling"
-"Mesh Bett Ausgleich"
+"MeshBett Ausgleich"
 
 
 #MSG_MMU_OK_RESUMING_POSITION c=20 r=4
 #MSG_MMU_OK_RESUMING_POSITION c=20 r=4
 "MMU OK. Resuming position..."
 "MMU OK. Resuming position..."
-"MMU OK. Position    wiederherstellen... "
+"MMU OK. Position wiederherstellen..."
 
 
 #MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
 #MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
 "MMU OK. Resuming temperature..."
 "MMU OK. Resuming temperature..."
@@ -828,7 +828,7 @@
 
 
 #
 #
 "Press the knob"
 "Press the knob"
-"Knopf druecken"
+"Knopf druecken zum"
 
 
 #MSG_PRINT_PAUSED c=20 r=1
 #MSG_PRINT_PAUSED c=20 r=1
 "Print paused"
 "Print paused"
@@ -844,7 +844,7 @@
 
 
 #
 #
 "Print FAN"
 "Print FAN"
-"Druckvent"
+"Druckvent."
 
 
 #MSG_PRUSA3D
 #MSG_PRUSA3D
 "prusa3d.com"
 "prusa3d.com"
@@ -868,7 +868,7 @@
 
 
 #MSG_CALIBRATE_BED_RESET
 #MSG_CALIBRATE_BED_RESET
 "Reset XYZ calibr."
 "Reset XYZ calibr."
-"XYZ Kalibr. zuruecksetzen."
+"Reset XYZ Kalibr."
 
 
 #MSG_BED_CORRECTION_RESET
 #MSG_BED_CORRECTION_RESET
 "Reset"
 "Reset"
@@ -936,7 +936,7 @@
 
 
 #MSG_SELFTEST_FAILED c=20
 #MSG_SELFTEST_FAILED c=20
 "Selftest failed  "
 "Selftest failed  "
-"Selbsttest misslang  "
+"Selbsttest Error "
 
 
 #MSG_FORCE_SELFTEST c=20 r=8
 #MSG_FORCE_SELFTEST c=20 r=8
 "Selftest will be run to calibrate accurate sensorless rehoming."
 "Selftest will be run to calibrate accurate sensorless rehoming."
@@ -979,8 +979,8 @@
 "Sort.      [Zeit]"
 "Sort.      [Zeit]"
 
 
 #
 #
-"Severe skew"
-"Schwer.Schr"
+"Severe skew:"
+"Schwer.Schr:"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
 "Sort   [alphabet]"
 "Sort   [alphabet]"
@@ -995,8 +995,8 @@
 "Sound      [laut]"
 "Sound      [laut]"
 
 
 #
 #
-"Slight skew"
-"Leicht.Schr"
+"Slight skew:"
+"Leicht.Schr:"
 
 
 #MSG_SOUND_MUTE c=17 r=1
 #MSG_SOUND_MUTE c=17 r=1
 "Sound      [mute]"
 "Sound      [mute]"
@@ -1104,11 +1104,11 @@
 
 
 #
 #
 "to load filament"
 "to load filament"
-"zum Filament laden"
+"Filament laden"
 
 
 #
 #
 "to unload filament"
 "to unload filament"
-"zum Filament entladen"
+"Filament entladen"
 
 
 #MSG_UNLOAD_FILAMENT c=17
 #MSG_UNLOAD_FILAMENT c=17
 "Unload filament"
 "Unload filament"
@@ -1249,7 +1249,7 @@
 
 
 #
 #
 "Checks"
 "Checks"
-"\x00"
+"Kontrolle"
 
 
 #
 #
 "False triggering"
 "False triggering"
@@ -1265,11 +1265,11 @@
 
 
 #
 #
 "Firmware [strict]"
 "Firmware [strict]"
-"Firmware [streng]"
+"Firmware [strikt]"
 
 
 #
 #
 "Firmware   [warn]"
 "Firmware   [warn]"
-"\x00"
+"Firmware [warnen]"
 
 
 #
 #
 "HW Setup"
 "HW Setup"
@@ -1293,15 +1293,15 @@
 
 
 #
 #
 "Mesh         [3x3]"
 "Mesh         [3x3]"
-"\x00"
+"Gitter       [3x3]"
 
 
 #
 #
 "Mesh         [7x7]"
 "Mesh         [7x7]"
-"\x00"
+"Gitter       [7x7]"
 
 
 #
 #
 "Mesh bed leveling"
 "Mesh bed leveling"
-"Mesh Bett Ausgleich"
+"MeshBett Ausgleich"
 
 
 #
 #
 "MK3S firmware detected on MK3 printer"
 "MK3S firmware detected on MK3 printer"
@@ -1325,11 +1325,11 @@
 
 
 #
 #
 "Model    [strict]"
 "Model    [strict]"
-"Modell   [streng]"
+"Modell   [strikt]"
 
 
 #
 #
 "Model      [warn]"
 "Model      [warn]"
-"Modell     [warn]"
+"Modell   [warnen]"
 
 
 #
 #
 "Nozzle d.  [0.25]"
 "Nozzle d.  [0.25]"
@@ -1349,11 +1349,11 @@
 
 
 #
 #
 "Nozzle   [strict]"
 "Nozzle   [strict]"
-"Duese    [streng]"
+"Duese    [strikt]"
 
 
 #
 #
 "Nozzle     [warn]"
 "Nozzle     [warn]"
-"Duese      [warn]"
+"Duese    [warnen]"
 
 
 #
 #
 "G-code sliced for a different level. Continue?"
 "G-code sliced for a different level. Continue?"
@@ -1416,8 +1416,8 @@
 "Blech"
 "Blech"
 
 
 #
 #
-"Sound     [assist]"
-"Sound     [Assist]"
+"Sound    [assist]"
+"Sound    [Assist]"
 
 
 #
 #
 "Steel sheets"
 "Steel sheets"
@@ -1434,3 +1434,7 @@
 #
 #
 "Z-probe nr.    [3]"
 "Z-probe nr.    [3]"
 "Z-Probe Nr.    [3]"
 "Z-Probe Nr.    [3]"
+
+#
+"Z-probe nr.    [5]"
+"Z-Probe Nr.    [5]"

+ 17 - 13
lang/lang_en_es.txt

@@ -24,7 +24,7 @@
 
 
 #MSG_BABYSTEPPING_Z c=15
 #MSG_BABYSTEPPING_Z c=15
 "Adjusting Z:"
 "Adjusting Z:"
-"Ajustando Z:"
+"Ajustar-Z:"
 
 
 #MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #MSG_SELFTEST_CHECK_ALLCORRECT c=20
 "All correct      "
 "All correct      "
@@ -216,7 +216,7 @@
 
 
 #MSG_EXTRUDER_CORRECTION c=10
 #MSG_EXTRUDER_CORRECTION c=10
 "E-correct:"
 "E-correct:"
-"Correccion-E:"
+"Corregir-E:"
 
 
 #MSG_EJECT_FILAMENT c=17 r=1
 #MSG_EJECT_FILAMENT c=17 r=1
 "Eject filament"
 "Eject filament"
@@ -976,11 +976,11 @@
 
 
 #MSG_SORT_TIME c=17 r=1
 #MSG_SORT_TIME c=17 r=1
 "Sort       [time]"
 "Sort       [time]"
-"Ordenar  [tiempo]"
+"Ordenar   [fecha]"
 
 
 #
 #
-"Severe skew"
-"Incl.severa"
+"Severe skew:"
+"Incl.severa:"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
 "Sort   [alphabet]"
 "Sort   [alphabet]"
@@ -995,8 +995,8 @@
 "Sonido     [alto]"
 "Sonido     [alto]"
 
 
 #
 #
-"Slight skew"
-"Liger.incl."
+"Slight skew:"
+"Liger.incl.:"
 
 
 #MSG_SOUND_MUTE c=17 r=1
 #MSG_SOUND_MUTE c=17 r=1
 "Sound      [mute]"
 "Sound      [mute]"
@@ -1200,7 +1200,7 @@
 
 
 #
 #
 "X-correct:"
 "X-correct:"
-"Correccion-X:"
+"Corregir-X:"
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
@@ -1236,11 +1236,11 @@
 
 
 #
 #
 "Y-correct:"
 "Y-correct:"
-"Correccion-Y:"
+"Corregir-Y:"
 
 
 #MSG_OFF
 #MSG_OFF
 " [off]"
 " [off]"
-" [apagado]"
+"[apag]"
 
 
 #
 #
 "Back"
 "Back"
@@ -1415,8 +1415,8 @@
 "Lamina"
 "Lamina"
 
 
 #
 #
-"Sound     [assist]"
-"Sonido  [asistido]"
+"Sound    [assist]"
+"Sonido [asistido]"
 
 
 #
 #
 "Steel sheets"
 "Steel sheets"
@@ -1424,7 +1424,7 @@
 
 
 #
 #
 "Z-correct:"
 "Z-correct:"
-"Correccion-Z:"
+"Corregir-Z:"
 
 
 #
 #
 "Z-probe nr.    [1]"
 "Z-probe nr.    [1]"
@@ -1433,3 +1433,7 @@
 #
 #
 "Z-probe nr.    [3]"
 "Z-probe nr.    [3]"
 "Z-sensor nr.   [3]"
 "Z-sensor nr.   [3]"
+
+#
+"Z-probe nr.    [5]"
+"Z-sensor nr.   [5]"

+ 122 - 117
lang/lang_en_fr.txt

@@ -16,7 +16,7 @@
 
 
 #MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
 #MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
 "WARNING:\x0aCrash detection\x0adisabled in\x0aStealth mode"
 "WARNING:\x0aCrash detection\x0adisabled in\x0aStealth mode"
-"ATTENTION:\x0aDetection de crash\x0adesactivee en\x0amode Furtif"
+"ATTENTION:\x0aDetection de crash\x0adesactivee en\x0amode feutre"
 
 
 #
 #
 ">Cancel"
 ">Cancel"
@@ -24,7 +24,7 @@
 
 
 #MSG_BABYSTEPPING_Z c=15
 #MSG_BABYSTEPPING_Z c=15
 "Adjusting Z:"
 "Adjusting Z:"
-"Ajuster Z :"
+"Ajuster Z:"
 
 
 #MSG_SELFTEST_CHECK_ALLCORRECT c=20
 #MSG_SELFTEST_CHECK_ALLCORRECT c=20
 "All correct      "
 "All correct      "
@@ -32,7 +32,7 @@
 
 
 #MSG_WIZARD_DONE c=20 r=8
 #MSG_WIZARD_DONE c=20 r=8
 "All is done. Happy printing!"
 "All is done. Happy printing!"
-"Tout est pret. Bonne impression !"
+"Tout est pret. Bonne impression!"
 
 
 #
 #
 "Ambient"
 "Ambient"
@@ -62,9 +62,9 @@
 "Auto home"
 "Auto home"
 "Mise a 0 des axes"
 "Mise a 0 des axes"
 
 
-#MSG_AUTOLOAD_FILAMENT c=17
+#MSG_AUTOLOAD_FILAMENT c=18
 "AutoLoad filament"
 "AutoLoad filament"
-"AutoCharge du filament"
+"Autocharge du fil."
 
 
 #MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
 #MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
 "Autoloading filament available only when filament sensor is turned on..."
 "Autoloading filament available only when filament sensor is turned on..."
@@ -72,7 +72,7 @@
 
 
 #MSG_AUTOLOADING_ENABLED c=20 r=4
 #MSG_AUTOLOADING_ENABLED c=20 r=4
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
-"Chargement auto du filament actif, appuyez sur le btn et inserez le fil."
+"Chargement auto. du fil. active, appuyez sur le bouton et inserez le fil."
 
 
 #MSG_SELFTEST_AXIS_LENGTH
 #MSG_SELFTEST_AXIS_LENGTH
 "Axis length"
 "Axis length"
@@ -100,7 +100,7 @@
 
 
 #MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=4
 #MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=4
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
-"Echec bed leveling. Capt. non declenche. Debris sur buse ? En attente d'un reset."
+"Echec bed leveling. Capt. non declenche. Debris sur buse? En attente d'un reset."
 
 
 #MSG_BED
 #MSG_BED
 "Bed"
 "Bed"
@@ -112,7 +112,7 @@
 
 
 #MSG_RECOVER_PRINT c=20 r=2
 #MSG_RECOVER_PRINT c=20 r=2
 "Blackout occurred. Recover print?"
 "Blackout occurred. Recover print?"
-"Coupure detectee. Recup. impression ?"
+"Coupure detectee. Reprendre impression?"
 
 
 #
 #
 "Calibrating home"
 "Calibrating home"
@@ -132,15 +132,15 @@
 
 
 #MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 #MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
-"Calibration de XYZ. Tournez le bouton pour monter le chariot de l'axe Z jusqu'aux butees. Cliquez une fois fait."
+"Calibration de XYZ. Tournez le bouton pour faire monter l'extrudeur dans l'axe Z jusqu'aux butees. Cliquez une fois fait."
 
 
 #MSG_CALIBRATE_Z_AUTO c=20 r=2
 #MSG_CALIBRATE_Z_AUTO c=20 r=2
 "Calibrating Z"
 "Calibrating Z"
-"Calibration de Z"
+"Calibration Z"
 
 
 #MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 #MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
 "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."
-"Calibration de Z. Tournez le bouton pour monter le chariot de l'axe Z jusqu'aux butees. Cliquez une fois fait."
+"Calibration de Z. Tournez le bouton pour faire monter l'extrudeur dans l'axe Z jusqu'aux butees. Cliquez une fois fait."
 
 
 #MSG_HOMEYZ_DONE
 #MSG_HOMEYZ_DONE
 "Calibration done"
 "Calibration done"
@@ -168,7 +168,7 @@
 
 
 #
 #
 "Copy selected language?"
 "Copy selected language?"
-"Copier la langue selectionne ?"
+"Copier la langue selectionne?"
 
 
 #MSG_CRASHDETECT_ON
 #MSG_CRASHDETECT_ON
 "Crash det.   [on]"
 "Crash det.   [on]"
@@ -188,7 +188,7 @@
 
 
 #
 #
 "Crash detected. Resume print?"
 "Crash detected. Resume print?"
-"Crash detecte. Poursuivre l'impression ?"
+"Crash detecte. Poursuivre l'impression?"
 
 
 #
 #
 "Crash"
 "Crash"
@@ -200,7 +200,7 @@
 
 
 #MSG_DATE c=17 r=1
 #MSG_DATE c=17 r=1
 "Date:"
 "Date:"
-"Date :"
+"Date:"
 
 
 #MSG_DISABLE_STEPPERS
 #MSG_DISABLE_STEPPERS
 "Disable steppers"
 "Disable steppers"
@@ -212,7 +212,7 @@
 
 
 #MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 #MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
 "Do you want to repeat last step to readjust distance between nozzle and heatbed?"
-"Voulez-vous repeter la derniere etape pour reajuster la distance entre la buse et le plateau chauffant ?"
+"Voulez-vous repeter la derniere etape pour reajuster la distance entre la buse et le plateau chauffant?"
 
 
 #MSG_EXTRUDER_CORRECTION c=10
 #MSG_EXTRUDER_CORRECTION c=10
 "E-correct:"
 "E-correct:"
@@ -220,15 +220,15 @@
 
 
 #MSG_EJECT_FILAMENT c=17 r=1
 #MSG_EJECT_FILAMENT c=17 r=1
 "Eject filament"
 "Eject filament"
-"Ejecter le fil."
+"Remonter le fil."
 
 
 #
 #
 "Eject"
 "Eject"
-"Ejecter"
+"Remonter"
 
 
 #MSG_EJECTING_FILAMENT c=20 r=1
 #MSG_EJECTING_FILAMENT c=20 r=1
 "Ejecting filament"
 "Ejecting filament"
-"Ejection filament"
+"Le fil. remonte"
 
 
 #MSG_SELFTEST_ENDSTOP_NOTHIT c=20 r=1
 #MSG_SELFTEST_ENDSTOP_NOTHIT c=20 r=1
 "Endstop not hit"
 "Endstop not hit"
@@ -248,11 +248,11 @@
 
 
 #MSG_FSENS_NOT_RESPONDING c=20 r=4
 #MSG_FSENS_NOT_RESPONDING c=20 r=4
 "ERROR: Filament sensor is not responding, please check connection."
 "ERROR: Filament sensor is not responding, please check connection."
-"ERREUR : Le capteur de filament ne repond pas, verifiez le branchement."
+"ERREUR: Le capteur de filament ne repond pas, verifiez le branchement."
 
 
 #MSG_ERROR
 #MSG_ERROR
 "ERROR:"
 "ERROR:"
-"ERREUR :"
+"ERREUR:"
 
 
 #MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
 #MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
 "Extruder fan:"
 "Extruder fan:"
@@ -268,23 +268,23 @@
 
 
 #
 #
 "Fail stats MMU"
 "Fail stats MMU"
-"Stat. echecs MMU"
+"Stat. d'echec MMU"
 
 
 #MSG_FSENS_AUTOLOAD_ON c=17 r=1
 #MSG_FSENS_AUTOLOAD_ON c=17 r=1
 "F. autoload  [on]"
 "F. autoload  [on]"
-"ChargAuto f. [on]"
+"Autochargeur [on]"
 
 
 #MSG_FSENS_AUTOLOAD_NA c=17 r=1
 #MSG_FSENS_AUTOLOAD_NA c=17 r=1
 "F. autoload [N/A]"
 "F. autoload [N/A]"
-"AutoCharg F [N/A]"
+"Autochargeur[N/A]"
 
 
 #MSG_FSENS_AUTOLOAD_OFF c=17 r=1
 #MSG_FSENS_AUTOLOAD_OFF c=17 r=1
 "F. autoload [off]"
 "F. autoload [off]"
-"AutoCharg F [off]"
+"Autochargeur[off]"
 
 
 #
 #
 "Fail stats"
 "Fail stats"
-"Statist. d'echec"
+"Stat. d'echec"
 
 
 #MSG_FAN_SPEED c=14
 #MSG_FAN_SPEED c=14
 "Fan speed"
 "Fan speed"
@@ -292,15 +292,15 @@
 
 
 #MSG_SELFTEST_FAN c=20
 #MSG_SELFTEST_FAN c=20
 "Fan test"
 "Fan test"
-"Test ventilateur"
+"Test du ventilateur"
 
 
 #MSG_FANS_CHECK_ON c=17 r=1
 #MSG_FANS_CHECK_ON c=17 r=1
 "Fans check   [on]"
 "Fans check   [on]"
-"Verif ventilo[on]"
+"Verif vent.  [on]"
 
 
 #MSG_FANS_CHECK_OFF c=17 r=1
 #MSG_FANS_CHECK_OFF c=17 r=1
 "Fans check  [off]"
 "Fans check  [off]"
-"Verif venti [off]"
+"Verif vent. [off]"
 
 
 #MSG_FSENSOR_ON
 #MSG_FSENSOR_ON
 "Fil. sensor  [on]"
 "Fil. sensor  [on]"
@@ -308,7 +308,7 @@
 
 
 #MSG_FSENSOR_NA
 #MSG_FSENSOR_NA
 "Fil. sensor [N/A]"
 "Fil. sensor [N/A]"
-"Capteur Fil. [N/A]"
+"Capteur Fil.[N/A]"
 
 
 #MSG_FSENSOR_OFF
 #MSG_FSENSOR_OFF
 "Fil. sensor [off]"
 "Fil. sensor [off]"
@@ -320,7 +320,7 @@
 
 
 #MSG_FILAMENT_CLEAN c=20 r=2
 #MSG_FILAMENT_CLEAN c=20 r=2
 "Filament extruding & with correct color?"
 "Filament extruding & with correct color?"
-"Filament extrude et avec bonne couleur ?"
+"Filament extrude et avec bonne couleur?"
 
 
 #MSG_NOT_LOADED c=19
 #MSG_NOT_LOADED c=19
 "Filament not loaded"
 "Filament not loaded"
@@ -340,11 +340,11 @@
 
 
 #MSG_FILE_INCOMPLETE c=20 r=2
 #MSG_FILE_INCOMPLETE c=20 r=2
 "File incomplete. Continue anyway?"
 "File incomplete. Continue anyway?"
-"Fichier incomplet. Continuer qd meme ?"
+"Fichier incomplet. Continuer qd meme?"
 
 
 #MSG_FINISHING_MOVEMENTS c=20 r=1
 #MSG_FINISHING_MOVEMENTS c=20 r=1
 "Finishing movements"
 "Finishing movements"
-"Mouvements de fin"
+"Mouvement final"
 
 
 #MSG_V2_CALIBRATION c=17 r=1
 #MSG_V2_CALIBRATION c=17 r=1
 "First layer cal."
 "First layer cal."
@@ -352,11 +352,11 @@
 
 
 #MSG_WIZARD_SELFTEST c=20 r=8
 #MSG_WIZARD_SELFTEST c=20 r=8
 "First, I will run the selftest to check most common assembly problems."
 "First, I will run the selftest to check most common assembly problems."
-"D'abord, je vais lancer le Selftest pour verifier les problemes d'assemblage les plus communs."
+"D'abord, je vais lancer le Auto-test pour verifier les problemes d'assemblage les plus communs."
 
 
 #
 #
 "Fix the issue and then press button on MMU unit."
 "Fix the issue and then press button on MMU unit."
-"Corrigez le probleme et appuyez sur le bouton de l'unite MMU."
+"Corrigez le probleme et appuyez sur le bouton sur la MMU."
 
 
 #MSG_FLOW
 #MSG_FLOW
 "Flow"
 "Flow"
@@ -368,7 +368,7 @@
 
 
 #MSG_SELFTEST_COOLING_FAN c=20
 #MSG_SELFTEST_COOLING_FAN c=20
 "Front print fan?"
 "Front print fan?"
-"Ventilo impr avant ?"
+"Ventilo impr avant?"
 
 
 #MSG_BED_CORRECTION_FRONT c=14 r=1
 #MSG_BED_CORRECTION_FRONT c=14 r=1
 "Front side[um]"
 "Front side[um]"
@@ -384,7 +384,7 @@
 
 
 #MSG_BED_HEATING_SAFETY_DISABLED
 #MSG_BED_HEATING_SAFETY_DISABLED
 "Heating disabled by safety timer."
 "Heating disabled by safety timer."
-"Chauffe desactivee par le compteur de securite."
+"Chauffage desactivee par le compteur de securite."
 
 
 #MSG_HEATING_COMPLETE c=20
 #MSG_HEATING_COMPLETE c=20
 "Heating done."
 "Heating done."
@@ -396,7 +396,7 @@
 
 
 #MSG_WIZARD_WELCOME c=20 r=7
 #MSG_WIZARD_WELCOME c=20 r=7
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
 "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"
-"Bonjour, je suis votre imprimante Original Prusa i3. Voulez-vous que je vous guide a travers le processus d'installation ?"
+"Bonjour, je suis votre imprimante Original Prusa i3. Voulez-vous que je vous guide a travers le processus d'installation?"
 
 
 #MSG_PRUSA3D_HOWTO
 #MSG_PRUSA3D_HOWTO
 "howto.prusa3d.com"
 "howto.prusa3d.com"
@@ -420,11 +420,11 @@
 
 
 #MSG_SELFTEST_CHECK_ENDSTOPS c=20
 #MSG_SELFTEST_CHECK_ENDSTOPS c=20
 "Checking endstops"
 "Checking endstops"
-"Verifications butees"
+"Verification butees"
 
 
 #MSG_SELFTEST_CHECK_HOTEND c=20
 #MSG_SELFTEST_CHECK_HOTEND c=20
 "Checking hotend  "
 "Checking hotend  "
-"Verif. tete impr."
+"Verif. du hotend"
 
 
 #MSG_SELFTEST_CHECK_FSENSOR c=20
 #MSG_SELFTEST_CHECK_FSENSOR c=20
 "Checking sensors "
 "Checking sensors "
@@ -444,11 +444,11 @@
 
 
 #MSG_CHOOSE_EXTRUDER c=20 r=1
 #MSG_CHOOSE_EXTRUDER c=20 r=1
 "Choose extruder:"
 "Choose extruder:"
-"Choisir extrudeur :"
+"Choisir extrudeur:"
 
 
 #MSG_CHOOSE_FILAMENT c=20 r=1
 #MSG_CHOOSE_FILAMENT c=20 r=1
 "Choose filament:"
 "Choose filament:"
-"Choix du filament :"
+"Choix du filament:"
 
 
 #MSG_FILAMENT c=17 r=1
 #MSG_FILAMENT c=17 r=1
 "Filament"
 "Filament"
@@ -456,11 +456,11 @@
 
 
 #MSG_WIZARD_XYZ_CAL c=20 r=8
 #MSG_WIZARD_XYZ_CAL c=20 r=8
 "I will run xyz calibration now. It will take approx. 12 mins."
 "I will run xyz calibration now. It will take approx. 12 mins."
-"Je vais maintenant lancer la calibration xyz. Cela prendra 12 min environ."
+"Je vais maintenant lancer la calibration XYZ. Cela prendra 12 min environ."
 
 
 #MSG_WIZARD_Z_CAL c=20 r=8
 #MSG_WIZARD_Z_CAL c=20 r=8
 "I will run z calibration now."
 "I will run z calibration now."
-"Je vais maintenant lancer la calibration z."
+"Je vais maintenant lancer la calibration Z."
 
 
 #MSG_WIZARD_V2_CAL_2 c=20 r=12
 #MSG_WIZARD_V2_CAL_2 c=20 r=12
 "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."
 "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."
@@ -472,7 +472,7 @@
 
 
 #
 #
 "Is filament 1 loaded?"
 "Is filament 1 loaded?"
-"Le filament 1 est-il charge ?"
+"Fil.1 est-il charge?"
 
 
 #MSG_INSERT_FILAMENT c=20
 #MSG_INSERT_FILAMENT c=20
 "Insert filament"
 "Insert filament"
@@ -480,27 +480,27 @@
 
 
 #MSG_WIZARD_FILAMENT_LOADED c=20 r=2
 #MSG_WIZARD_FILAMENT_LOADED c=20 r=2
 "Is filament loaded?"
 "Is filament loaded?"
-"Le filament est-il charge ?"
+"Fil. est-il charge?"
 
 
 #MSG_WIZARD_PLA_FILAMENT c=20 r=2
 #MSG_WIZARD_PLA_FILAMENT c=20 r=2
 "Is it PLA filament?"
 "Is it PLA filament?"
-"Est-ce du filament PLA ?"
+"Est-ce du filament PLA?"
 
 
 #MSG_PLA_FILAMENT_LOADED c=20 r=2
 #MSG_PLA_FILAMENT_LOADED c=20 r=2
 "Is PLA filament loaded?"
 "Is PLA filament loaded?"
-"Le filament PLA est-il charge ?"
+"Fil. PLA est-il charge?"
 
 
 #MSG_STEEL_SHEET_CHECK c=20 r=2
 #MSG_STEEL_SHEET_CHECK c=20 r=2
 "Is steel sheet on heatbed?"
 "Is steel sheet on heatbed?"
-"Feuille d'acier sur plateau chauffant ?"
+"Plaque d'impression sur le lit chauffant?"
 
 
 #
 #
 "Last print failures"
 "Last print failures"
-"Echecs derniere impr"
+"Echecs derniere imp."
 
 
 #
 #
 "Last print"
 "Last print"
-"Derniere impression"
+"Derniere impres."
 
 
 #MSG_SELFTEST_EXTRUDER_FAN c=20
 #MSG_SELFTEST_EXTRUDER_FAN c=20
 "Left hotend fan?"
 "Left hotend fan?"
@@ -520,7 +520,7 @@
 
 
 #MSG_BABYSTEP_Z
 #MSG_BABYSTEP_Z
 "Live adjust Z"
 "Live adjust Z"
-"Ajuster Z en direct"
+"Ajuster Z en dir."
 
 
 #MSG_LOAD_FILAMENT c=17
 #MSG_LOAD_FILAMENT c=17
 "Load filament"
 "Load filament"
@@ -528,11 +528,11 @@
 
 
 #MSG_LOADING_COLOR
 #MSG_LOADING_COLOR
 "Loading color"
 "Loading color"
-"Chargement couleur"
+"Charg. de la couleur"
 
 
 #MSG_LOADING_FILAMENT c=20
 #MSG_LOADING_FILAMENT c=20
 "Loading filament"
 "Loading filament"
-"Chargement filament"
+"Chargement du fil."
 
 
 #MSG_LOOSE_PULLEY c=20 r=1
 #MSG_LOOSE_PULLEY c=20 r=1
 "Loose pulley"
 "Loose pulley"
@@ -540,7 +540,7 @@
 
 
 #
 #
 "Load to nozzle"
 "Load to nozzle"
-"Charger dans la buse"
+"Charger la buse"
 
 
 #MSG_M117_V2_CALIBRATION c=25 r=1
 #MSG_M117_V2_CALIBRATION c=25 r=1
 "M117 First layer cal."
 "M117 First layer cal."
@@ -548,7 +548,7 @@
 
 
 #MSG_MAIN
 #MSG_MAIN
 "Main"
 "Main"
-"Principal"
+"Menu principal"
 
 
 #MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60
 #MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 c=60
 "Measuring reference height of calibration point"
 "Measuring reference height of calibration point"
@@ -564,15 +564,15 @@
 
 
 #MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
 #MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
 "MMU OK. Resuming temperature..."
 "MMU OK. Resuming temperature..."
-"MMU OK. Remontee en temperature..."
+"MMU OK. Rechauffage de la buse..."
 
 
 #
 #
 "Measured skew"
 "Measured skew"
-"Deviation mesuree"
+"Deviat.mesuree"
 
 
 #
 #
 "MMU fails"
 "MMU fails"
-"Echec MMU"
+"Echecs MMU"
 
 
 #
 #
 "MMU load failed     "
 "MMU load failed     "
@@ -592,7 +592,7 @@
 
 
 #MSG_SILENT_MODE_ON
 #MSG_SILENT_MODE_ON
 "Mode     [silent]"
 "Mode     [silent]"
-"Mode [silencieux]"
+"Mode     [feutre]"
 
 
 #
 #
 "MMU needs user attention."
 "MMU needs user attention."
@@ -604,7 +604,7 @@
 
 
 #MSG_STEALTH_MODE_ON
 #MSG_STEALTH_MODE_ON
 "Mode    [Stealth]"
 "Mode    [Stealth]"
-"Mode     [Furtif]"
+"Mode     [furtif]"
 
 
 #MSG_AUTO_MODE_ON
 #MSG_AUTO_MODE_ON
 "Mode [auto power]"
 "Mode [auto power]"
@@ -684,7 +684,7 @@
 
 
 #
 #
 "Now remove the test print from steel sheet."
 "Now remove the test print from steel sheet."
-"Retirez maintenant l'impression de test de la feuille d'acier."
+"Retirez maintenant l'impression de test de la plaque en acier."
 
 
 #
 #
 "Nozzle FAN"
 "Nozzle FAN"
@@ -716,7 +716,7 @@
 
 
 #MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 #MSG_WIZARD_CLEAN_HEATBED c=20 r=8
 "Please clean heatbed and then press the knob."
 "Please clean heatbed and then press the knob."
-"Nettoyez le plateau chauffant et appuyez sur le bouton."
+"Nettoyez la plaque en acier et appuyez sur le bouton."
 
 
 #MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 "Please clean the nozzle for calibration. Click when done."
 "Please clean the nozzle for calibration. Click when done."
@@ -724,11 +724,11 @@
 
 
 #MSG_SELFTEST_PLEASECHECK
 #MSG_SELFTEST_PLEASECHECK
 "Please check :"
 "Please check :"
-"Verifiez :"
+"Verifiez:"
 
 
 #MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 #MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
 "Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."
 "Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."
-"Merci de verifier notre manuel et de corriger le probleme. Poursuivez alors l'assistant en redemarrant l'imprimante."
+"Merci de consulter notre manuel et de corriger le probleme. Poursuivez alors l'assistant en redemarrant l'imprimante."
 
 
 #MSG_WIZARD_LOAD_FILAMENT c=20 r=8
 #MSG_WIZARD_LOAD_FILAMENT c=20 r=8
 "Please insert PLA filament to the extruder, then press knob to load it."
 "Please insert PLA filament to the extruder, then press knob to load it."
@@ -744,7 +744,7 @@
 
 
 #MSG_PLACE_STEEL_SHEET c=20 r=4
 #MSG_PLACE_STEEL_SHEET c=20 r=4
 "Please place steel sheet on heatbed."
 "Please place steel sheet on heatbed."
-"Placez la feuille d'acier sur le plateau chauffant."
+"Placez la plaque en acier sur le plateau chauffant."
 
 
 #MSG_PRESS_TO_UNLOAD c=20 r=4
 #MSG_PRESS_TO_UNLOAD c=20 r=4
 "Please press the knob to unload filament"
 "Please press the knob to unload filament"
@@ -752,7 +752,7 @@
 
 
 #
 #
 "Please insert PLA filament to the first tube of MMU, then press the knob to load it."
 "Please insert PLA filament to the first tube of MMU, then press the knob to load it."
-"Veuillez inserer du filament PLA dans le premier tube du MMU, et pressez sur le bouton pour le charger."
+"Inserez du PLA dans le 1er tube du MMU, appuyez sur le bouton pour le charger."
 
 
 #MSG_PULL_OUT_FILAMENT c=20 r=4
 #MSG_PULL_OUT_FILAMENT c=20 r=4
 "Please pull out filament immediately"
 "Please pull out filament immediately"
@@ -764,7 +764,7 @@
 
 
 #MSG_REMOVE_STEEL_SHEET c=20 r=4
 #MSG_REMOVE_STEEL_SHEET c=20 r=4
 "Please remove steel sheet from heatbed."
 "Please remove steel sheet from heatbed."
-"Retirez la feuille d'acier du plateau chauffant."
+"Retirez la plaque en acier du plateau chauffant."
 
 
 #MSG_RUN_XYZ c=20 r=4
 #MSG_RUN_XYZ c=20 r=4
 "Please run XYZ calibration first."
 "Please run XYZ calibration first."
@@ -780,7 +780,7 @@
 
 
 #
 #
 "Please remove shipping helpers first."
 "Please remove shipping helpers first."
-"Veuillez retirer d'abord les protections d'envoi."
+"Retirez d'abord les protections de transport."
 
 
 #MSG_PREHEAT_NOZZLE c=20
 #MSG_PREHEAT_NOZZLE c=20
 "Preheat the nozzle!"
 "Preheat the nozzle!"
@@ -810,21 +810,21 @@
 "Print aborted"
 "Print aborted"
 "Impression annulee"
 "Impression annulee"
 
 
-#
+# c=20 r=1
 "Preheating to load"
 "Preheating to load"
 "Chauffe pour charger"
 "Chauffe pour charger"
 
 
-#
+# c=20 r=1
 "Preheating to unload"
 "Preheating to unload"
-"Chauffe pr decharger"
+"Chauf.pour decharger"
 
 
 #MSG_SELFTEST_PRINT_FAN_SPEED c=18
 #MSG_SELFTEST_PRINT_FAN_SPEED c=18
 "Print fan:"
 "Print fan:"
-"Vent.impr:"
+"Vent. impr:"
 
 
 #MSG_CARD_MENU
 #MSG_CARD_MENU
 "Print from SD"
 "Print from SD"
-"Impr depuis la SD"
+"Impr. depuis la SD"
 
 
 #
 #
 "Press the knob"
 "Press the knob"
@@ -836,7 +836,7 @@
 
 
 #
 #
 "Press the knob to resume nozzle temperature."
 "Press the knob to resume nozzle temperature."
-"Appuyez sur le bouton pour poursuivre la mise en temperature de la buse."
+"Appuyez sur le bouton pour rechauffer la buse."
 
 
 #MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 "Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."
 "Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."
@@ -844,7 +844,7 @@
 
 
 #
 #
 "Print FAN"
 "Print FAN"
-"Vent.impr"
+"Vent. impr"
 
 
 #MSG_PRUSA3D
 #MSG_PRUSA3D
 "prusa3d.com"
 "prusa3d.com"
@@ -868,7 +868,7 @@
 
 
 #MSG_CALIBRATE_BED_RESET
 #MSG_CALIBRATE_BED_RESET
 "Reset XYZ calibr."
 "Reset XYZ calibr."
-"Reinit.calibr. XYZ"
+"Reinit. calib. XYZ"
 
 
 #MSG_BED_CORRECTION_RESET
 #MSG_BED_CORRECTION_RESET
 "Reset"
 "Reset"
@@ -896,7 +896,7 @@
 
 
 #MSG_WIZARD_RERUN c=20 r=7
 #MSG_WIZARD_RERUN c=20 r=7
 "Running Wizard will delete current calibration results and start from the beginning. Continue?"
 "Running Wizard will delete current calibration results and start from the beginning. Continue?"
-"Lancer l'Assistant supprimera les resultats actuels de calibration et commencera du debut. Continuer ?"
+"Lancement de l'Assistant supprimera les resultats actuels de calibration et commencera du debut. Continuer?"
 
 
 #MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF c=19 r=1
 #MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF c=19 r=1
 "SD card  [normal]"
 "SD card  [normal]"
@@ -904,7 +904,7 @@
 
 
 #MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON c=19 r=1
 #MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON c=19 r=1
 "SD card [flshAir]"
 "SD card [flshAir]"
-"CarteSD[flashAir]"
+"CarteSD [flshAir]"
 
 
 #
 #
 "Right"
 "Right"
@@ -932,7 +932,7 @@
 
 
 #MSG_SELFTEST_ERROR
 #MSG_SELFTEST_ERROR
 "Selftest error !"
 "Selftest error !"
-"Erreur auto-test !"
+"Erreur auto-test!"
 
 
 #MSG_SELFTEST_FAILED c=20
 #MSG_SELFTEST_FAILED c=20
 "Selftest failed  "
 "Selftest failed  "
@@ -948,11 +948,11 @@
 
 
 #
 #
 "Select PLA filament:"
 "Select PLA filament:"
-"Selectionnez le filament PLA :"
+"Selectionnez le fil. PLA:"
 
 
 #MSG_SET_TEMPERATURE c=19 r=1
 #MSG_SET_TEMPERATURE c=19 r=1
 "Set temperature:"
 "Set temperature:"
-"Regler temp. :"
+"Regler temp.:"
 
 
 #MSG_SETTINGS
 #MSG_SETTINGS
 "Settings"
 "Settings"
@@ -979,8 +979,8 @@
 "Tri       [heure]"
 "Tri       [heure]"
 
 
 #
 #
-"Severe skew"
-"Deviat.sev."
+"Severe skew:"
+"Deviat.sev.:"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
 "Sort   [alphabet]"
 "Sort   [alphabet]"
@@ -995,8 +995,8 @@
 "Son        [fort]"
 "Son        [fort]"
 
 
 #
 #
-"Slight skew"
-"Deviat.leg."
+"Slight skew:"
+"Deviat.leg.:"
 
 
 #MSG_SOUND_MUTE c=17 r=1
 #MSG_SOUND_MUTE c=17 r=1
 "Sound      [mute]"
 "Sound      [mute]"
@@ -1004,7 +1004,7 @@
 
 
 #
 #
 "Some problem encountered, Z-leveling enforced ..."
 "Some problem encountered, Z-leveling enforced ..."
-"Problemes rencontres, nivellement de l'axe Z applique..."
+"Probleme rencontre, cliquez sur le bouton pour niveller l'axe Z..."
 
 
 #MSG_SOUND_ONCE c=17 r=1
 #MSG_SOUND_ONCE c=17 r=1
 "Sound      [once]"
 "Sound      [once]"
@@ -1012,7 +1012,7 @@
 
 
 #MSG_SOUND_SILENT c=17 r=1
 #MSG_SOUND_SILENT c=17 r=1
 "Sound    [silent]"
 "Sound    [silent]"
-"Son  [silencieux]"
+"Son      [feutre]"
 
 
 #MSG_SPEED
 #MSG_SPEED
 "Speed"
 "Speed"
@@ -1080,7 +1080,7 @@
 
 
 #MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=4
 #MSG_FOLLOW_Z_CALIBRATION_FLOW c=20 r=4
 "There is still a need to make Z calibration. Please follow the manual, chapter First steps, section Calibration flow."
 "There is still a need to make Z calibration. Please follow the manual, chapter First steps, section Calibration flow."
-"Il y a encore besoin d'effectuer la calibration Z. Veuillez suivre le manuel, chapitre Premiers pas, section Processus de calibration."
+"Il faut toujours effectuer la Calibration Z. Veuillez suivre le manuel, chapitre Premiers pas, section Processus de calibration."
 
 
 #
 #
 "Total filament"
 "Total filament"
@@ -1148,23 +1148,23 @@
 
 
 #
 #
 "Use unload to remove filament 1 if it protrudes outside of the rear MMU tube. Use eject if it is hidden in tube."
 "Use unload to remove filament 1 if it protrudes outside of the rear MMU tube. Use eject if it is hidden in tube."
-"Utilisez decharger pour retirer le filament 1 s'il depasse du  tube arriere du MMU. Utilisez ejecter s'il est cache dans le tube."
+"Utilisez Remonter le fil. pour retirer le filament 1 s'il depasse du tube arriere du MMU. Utilisez ejecter s'il est cache dans le tube."
 
 
 #MSG_CHANGED_BOTH c=20 r=4
 #MSG_CHANGED_BOTH c=20 r=4
 "Warning: both printer type and motherboard type changed."
 "Warning: both printer type and motherboard type changed."
-"Attention : Types d'imprimante et de carte mere modifies"
+"Attention: Types d'imprimante et de carte mere modifies"
 
 
 #MSG_CHANGED_MOTHERBOARD c=20 r=4
 #MSG_CHANGED_MOTHERBOARD c=20 r=4
 "Warning: motherboard type changed."
 "Warning: motherboard type changed."
-"Attention : Type de carte mere modifie."
+"Attention: Type de carte mere modifie."
 
 
 #MSG_CHANGED_PRINTER c=20 r=4
 #MSG_CHANGED_PRINTER c=20 r=4
 "Warning: printer type changed."
 "Warning: printer type changed."
-"Attention : Type d'imprimante modifie"
+"Attention: Type d'imprimante modifie"
 
 
 #MSG_UNLOAD_SUCCESSFUL c=20 r=2
 #MSG_UNLOAD_SUCCESSFUL c=20 r=2
 "Was filament unload successful?"
 "Was filament unload successful?"
-"Dechargement du filament reussi ?"
+"Dechargement du filament reussi?"
 
 
 #MSG_SELFTEST_WIRINGERROR
 #MSG_SELFTEST_WIRINGERROR
 "Wiring error"
 "Wiring error"
@@ -1188,7 +1188,7 @@
 
 
 #MSG_WIZARD_QUIT c=20 r=8
 #MSG_WIZARD_QUIT c=20 r=8
 "You can always resume the Wizard from Calibration -> Wizard."
 "You can always resume the Wizard from Calibration -> Wizard."
-"Vous pouvez toujours relancer l'assistant dans Calibration-> Assistant."
+"Vous pouvez toujours relancer l'Assistant dans Calibration > Assistant."
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
 "XYZ calibration all right. Skew will be corrected automatically."
 "XYZ calibration all right. Skew will be corrected automatically."
@@ -1196,7 +1196,7 @@
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
 "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
 "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"
-"Calibration XYZ OK. Les axes X/Y sont legerement non perpendiculaires. Bon boulot !"
+"Calibration XYZ OK. Les axes X/Y sont legerement non perpendiculaires. Bon boulot!"
 
 
 #
 #
 "X-correct:"
 "X-correct:"
@@ -1204,11 +1204,11 @@
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
 "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
-"Calibration XYZ OK. Les axes X/Y sont perpendiculaires. Felicitations !"
+"Calibration XYZ OK. Les axes X/Y sont perpendiculaires. Felicitations!"
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
 "XYZ calibration compromised. Front calibration points not reachable."
 "XYZ calibration compromised. Front calibration points not reachable."
-"Calibration XYZ compromise. Les points de calibration avant ne sont pas atteignables."
+"Calibration XYZ compromise. Les points de calibration en avant ne sont pas atteignables."
 
 
 #MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 #MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
 "XYZ calibration compromised. Right front calibration point not reachable."
 "XYZ calibration compromised. Right front calibration point not reachable."
@@ -1216,7 +1216,7 @@
 
 
 #MSG_LOAD_ALL c=17
 #MSG_LOAD_ALL c=17
 "Load all"
 "Load all"
-"Tout charger"
+"Charger un par un"
 
 
 #
 #
 "XYZ calibration failed. Bed calibration point was not found."
 "XYZ calibration failed. Bed calibration point was not found."
@@ -1224,7 +1224,7 @@
 
 
 #
 #
 "XYZ calibration failed. Front calibration points not reachable."
 "XYZ calibration failed. Front calibration points not reachable."
-"Echec calibration XYZ. Les points de calibration avant ne sont pas atteignables."
+"Echec calibration XYZ. Les points de calibration en avant ne sont pas atteignables."
 
 
 #
 #
 "XYZ calibration failed. Right front calibration point not reachable."
 "XYZ calibration failed. Right front calibration point not reachable."
@@ -1280,15 +1280,15 @@
 
 
 #
 #
 "Magnets comp.[N/A]"
 "Magnets comp.[N/A]"
-"Comp. aimants[N/A]"
+"Compens. aim.[N/A]"
 
 
 #
 #
 "Magnets comp.[Off]"
 "Magnets comp.[Off]"
-"Comp. aimants[Off]"
+"Compens. aim.[off]"
 
 
 #
 #
 "Magnets comp. [On]"
 "Magnets comp. [On]"
-"Comp. aimants [On]"
+"Compens. aim. [on]"
 
 
 #
 #
 "Mesh         [3x3]"
 "Mesh         [3x3]"
@@ -1308,11 +1308,11 @@
 
 
 #
 #
 "MMU Mode [Normal]"
 "MMU Mode [Normal]"
-"Mode MMU [Normal]"
+"Mode MMU [normal]"
 
 
 #
 #
 "MMU Mode[Stealth]"
 "MMU Mode[Stealth]"
-"Mode MMU [Furtif]"
+"Mode MMU [feutre]"
 
 
 #
 #
 "Mode change in progress ..."
 "Mode change in progress ..."
@@ -1368,7 +1368,7 @@
 
 
 #
 #
 "G-code sliced for a different printer type. Please re-slice the model again. Print cancelled."
 "G-code sliced for a different printer type. Please re-slice the model again. Print cancelled."
-"Le G-code a ete prepare pour une autre version de l'imprimante. Veuillez decouper le modele a nouveau. L'impression a ete annulee. "
+"Le G-code a ete prepare pour une autre version de l'imprimante. Veuillez decouper le modele a nouveau. L'impression a ete annulee."
 
 
 #
 #
 "G-code sliced for a newer firmware. Continue?"
 "G-code sliced for a newer firmware. Continue?"
@@ -1376,27 +1376,27 @@
 
 
 #
 #
 "G-code sliced for a newer firmware. Please update the firmware. Print cancelled."
 "G-code sliced for a newer firmware. Please update the firmware. Print cancelled."
-"Le G-code a ete prepare pour une version plus recente du firmware. Veuillez mettre a jour le firmware. L'impression  annulee."
+"Le G-code a ete prepare pour une version plus recente du firmware. Veuillez mettre a jour le firmware. L'impression annulee."
 
 
 #
 #
 "PINDA:"
 "PINDA:"
 "PINDA:"
 "PINDA:"
 
 
-#
+# c=20 r=1
 "Preheating to cut"
 "Preheating to cut"
-"Prechauffage pour couper"
+"Chauffe pour couper"
 
 
-#
+# c=20 r=1
 "Preheating to eject"
 "Preheating to eject"
-"Prechauffage pour ejecter"
+"Chauf. pour remonter"
 
 
 #
 #
 "Printer nozzle diameter differs from the G-code. Continue?"
 "Printer nozzle diameter differs from the G-code. Continue?"
-"Diametre de la  buse de l'imprimante different du G-Code. Continuer ?"
+"Diametre de la buse dans les reglages ne correspond pas a celui dans le G-Code. Continuer?"
 
 
 #
 #
 "Printer nozzle diameter differs from the G-code. Please check the value in settings. Print cancelled."
 "Printer nozzle diameter differs from the G-code. Please check the value in settings. Print cancelled."
-"Diametre de la  buse de l'imprimante different du G-Code. Merci de verifier le parametre dans les reglages. Impression annulee."
+"Diametre de la buse dans les reglages ne correspond pas a celui dans le G-Code. Merci de verifier le parametre dans les reglages. Impression annulee."
 
 
 #
 #
 "Rename"
 "Rename"
@@ -1412,11 +1412,11 @@
 
 
 #
 #
 "Sheet"
 "Sheet"
-"Feuille"
+"Plaque"
 
 
 #
 #
-"Sound     [assist]"
-"Son       [Assist]"
+"Sound    [assist]"
+"Son      [assist]"
 
 
 #
 #
 "Steel sheets"
 "Steel sheets"
@@ -1428,8 +1428,13 @@
 
 
 #
 #
 "Z-probe nr.    [1]"
 "Z-probe nr.    [1]"
-"Sonde-Z num.   [1]"
+"Mesurer x-fois [1]"
 
 
 #
 #
 "Z-probe nr.    [3]"
 "Z-probe nr.    [3]"
-"Sonde-Z num.   [3]"
+"Mesurer x-fois [3]"
+
+#
+"Z-probe nr.    [5]"
+"Mesurer x-fois [5]"
+ 

+ 28 - 24
lang/lang_en_it.txt

@@ -72,7 +72,7 @@
 
 
 #MSG_AUTOLOADING_ENABLED c=20 r=4
 #MSG_AUTOLOADING_ENABLED c=20 r=4
 "Autoloading filament is active, just press the knob and insert filament..."
 "Autoloading filament is active, just press the knob and insert filament..."
-"Il caricamento automatico e attivo, premete la manopola e inserite il filamento..."
+"Caricamento automatico attivo, premi la manopola e inserisci il filamento."
 
 
 #MSG_SELFTEST_AXIS_LENGTH
 #MSG_SELFTEST_AXIS_LENGTH
 "Axis length"
 "Axis length"
@@ -108,7 +108,7 @@
 
 
 #MSG_MENU_BELT_STATUS c=15 r=1
 #MSG_MENU_BELT_STATUS c=15 r=1
 "Belt status"
 "Belt status"
-"Stato delle cinghie"
+"Stato cinghie"
 
 
 #MSG_RECOVER_PRINT c=20 r=2
 #MSG_RECOVER_PRINT c=20 r=2
 "Blackout occurred. Recover print?"
 "Blackout occurred. Recover print?"
@@ -172,15 +172,15 @@
 
 
 #MSG_CRASHDETECT_ON
 #MSG_CRASHDETECT_ON
 "Crash det.   [on]"
 "Crash det.   [on]"
-"Rilevam.imp. [on]"
+"Rileva.crash [on]"
 
 
 #MSG_CRASHDETECT_NA
 #MSG_CRASHDETECT_NA
 "Crash det.  [N/A]"
 "Crash det.  [N/A]"
-"Rilevam.imp.[N/A]"
+"Rileva.crash[N/A]"
 
 
 #MSG_CRASHDETECT_OFF
 #MSG_CRASHDETECT_OFF
 "Crash det.  [off]"
 "Crash det.  [off]"
-"Rilevam.imp.[off]"
+"Rileva.crash[off]"
 
 
 #MSG_CRASH_DETECTED c=20 r=1
 #MSG_CRASH_DETECTED c=20 r=1
 "Crash detected."
 "Crash detected."
@@ -272,7 +272,7 @@
 
 
 #MSG_FSENS_AUTOLOAD_ON c=17 r=1
 #MSG_FSENS_AUTOLOAD_ON c=17 r=1
 "F. autoload  [on]"
 "F. autoload  [on]"
-"Autocar.filam[on]"
+"Autocar.fil. [on]"
 
 
 #MSG_FSENS_AUTOLOAD_NA c=17 r=1
 #MSG_FSENS_AUTOLOAD_NA c=17 r=1
 "F. autoload [N/A]"
 "F. autoload [N/A]"
@@ -304,15 +304,15 @@
 
 
 #MSG_FSENSOR_ON
 #MSG_FSENSOR_ON
 "Fil. sensor  [on]"
 "Fil. sensor  [on]"
-"Sensor filam.[on]"
+"Sensore fil. [on]"
 
 
 #MSG_FSENSOR_NA
 #MSG_FSENSOR_NA
 "Fil. sensor [N/A]"
 "Fil. sensor [N/A]"
-"Sensor filam[N/A]"
+"Sensore fil.[N/A]"
 
 
 #MSG_FSENSOR_OFF
 #MSG_FSENSOR_OFF
 "Fil. sensor [off]"
 "Fil. sensor [off]"
-"Sensor filam[off]"
+"Sensore fil.[off]"
 
 
 #
 #
 "Filam. runouts"
 "Filam. runouts"
@@ -348,7 +348,7 @@
 
 
 #MSG_V2_CALIBRATION c=17 r=1
 #MSG_V2_CALIBRATION c=17 r=1
 "First layer cal."
 "First layer cal."
-"Calibrazione primo layer."
+"Cal. primo strato"
 
 
 #MSG_WIZARD_SELFTEST c=20 r=8
 #MSG_WIZARD_SELFTEST c=20 r=8
 "First, I will run the selftest to check most common assembly problems."
 "First, I will run the selftest to check most common assembly problems."
@@ -516,7 +516,7 @@
 
 
 #
 #
 "Lin. correction"
 "Lin. correction"
-"Correzione lin."
+"Correzione lineare"
 
 
 #MSG_BABYSTEP_Z
 #MSG_BABYSTEP_Z
 "Live adjust Z"
 "Live adjust Z"
@@ -556,7 +556,7 @@
 
 
 #MSG_MESH_BED_LEVELING
 #MSG_MESH_BED_LEVELING
 "Mesh Bed Leveling"
 "Mesh Bed Leveling"
-"Mesh livel. letto"
+"Livel. piatto"
 
 
 #MSG_MMU_OK_RESUMING_POSITION c=20 r=4
 #MSG_MMU_OK_RESUMING_POSITION c=20 r=4
 "MMU OK. Resuming position..."
 "MMU OK. Resuming position..."
@@ -588,11 +588,11 @@
 
 
 #MSG_STEALTH_MODE_OFF
 #MSG_STEALTH_MODE_OFF
 "Mode     [Normal]"
 "Mode     [Normal]"
-"Modo    [normale]"
+"Mod.    [normale]"
 
 
 #MSG_SILENT_MODE_ON
 #MSG_SILENT_MODE_ON
 "Mode     [silent]"
 "Mode     [silent]"
-"Modo [silenzioso]"
+"Mod. [silenziosa]"
 
 
 #
 #
 "MMU needs user attention."
 "MMU needs user attention."
@@ -604,15 +604,15 @@
 
 
 #MSG_STEALTH_MODE_ON
 #MSG_STEALTH_MODE_ON
 "Mode    [Stealth]"
 "Mode    [Stealth]"
-"Modo [Silenziosa]"
+"Mod. [silenziosa]"
 
 
 #MSG_AUTO_MODE_ON
 #MSG_AUTO_MODE_ON
 "Mode [auto power]"
 "Mode [auto power]"
-"Modo       [auto]"
+"Mod.       [auto]"
 
 
 #MSG_SILENT_MODE_OFF
 #MSG_SILENT_MODE_OFF
 "Mode [high power]"
 "Mode [high power]"
-"Mode      [forte]"
+"Mod.      [forte]"
 
 
 #
 #
 "MMU2 connected"
 "MMU2 connected"
@@ -976,11 +976,11 @@
 
 
 #MSG_SORT_TIME c=17 r=1
 #MSG_SORT_TIME c=17 r=1
 "Sort       [time]"
 "Sort       [time]"
-"Ordina    [tempo]"
+"Ordina    [cron.]"
 
 
 #
 #
-"Severe skew"
-"Devia.grave"
+"Severe skew:"
+"Devia.grave:"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
 "Sort   [alphabet]"
 "Sort   [alphabet]"
@@ -995,8 +995,8 @@
 "Suono     [forte]"
 "Suono     [forte]"
 
 
 #
 #
-"Slight skew"
-"Devia.lieve"
+"Slight skew:"
+"Devia.lieve:"
 
 
 #MSG_SOUND_MUTE c=17 r=1
 #MSG_SOUND_MUTE c=17 r=1
 "Sound      [mute]"
 "Sound      [mute]"
@@ -1415,8 +1415,8 @@
 "Piano"
 "Piano"
 
 
 #
 #
-"Sound     [assist]"
-"Suono  [assistito]"
+"Sound    [assist]"
+"Suono   [assist.]"
 
 
 #
 #
 "Steel sheets"
 "Steel sheets"
@@ -1433,3 +1433,7 @@
 #
 #
 "Z-probe nr.    [3]"
 "Z-probe nr.    [3]"
 "Z-probe nr.    [3]"
 "Z-probe nr.    [3]"
+
+#
+"Z-probe nr.    [5]"
+"Z-probe nr.    [5]"

+ 40 - 37
lang/lang_en_pl.txt

@@ -52,7 +52,7 @@
 
 
 #
 #
 "SpoolJoin   [N/A]"
 "SpoolJoin   [N/A]"
-"SpoolJoin    [nd]"
+"SpoolJoin   [N/D]"
 
 
 #MSG_AUTO_DEPLETE_OFF c=17 r=1
 #MSG_AUTO_DEPLETE_OFF c=17 r=1
 "SpoolJoin   [off]"
 "SpoolJoin   [off]"
@@ -64,7 +64,7 @@
 
 
 #MSG_AUTOLOAD_FILAMENT c=17
 #MSG_AUTOLOAD_FILAMENT c=17
 "AutoLoad filament"
 "AutoLoad filament"
-"AutoLadowanie fil."
+"Autoladowanie fil."
 
 
 #MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
 #MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
 "Autoloading filament available only when filament sensor is turned on..."
 "Autoloading filament available only when filament sensor is turned on..."
@@ -96,7 +96,7 @@
 
 
 #MSG_BED_CORRECTION_MENU
 #MSG_BED_CORRECTION_MENU
 "Bed level correct"
 "Bed level correct"
-"Korekta poziomowania stolu"
+"Korekta stolu"
 
 
 #MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=4
 #MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=4
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
 "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
@@ -176,7 +176,7 @@
 
 
 #MSG_CRASHDETECT_NA
 #MSG_CRASHDETECT_NA
 "Crash det.  [N/A]"
 "Crash det.  [N/A]"
-"Wykr.zderzen[n/d]"
+"Wykr.zderzen[N/D]"
 
 
 #MSG_CRASHDETECT_OFF
 #MSG_CRASHDETECT_OFF
 "Crash det.  [off]"
 "Crash det.  [off]"
@@ -204,7 +204,7 @@
 
 
 #MSG_DISABLE_STEPPERS
 #MSG_DISABLE_STEPPERS
 "Disable steppers"
 "Disable steppers"
-"Wylaczenie silnikow"
+"Wylacz silniki"
 
 
 #MSG_BABYSTEP_Z_NOT_SET c=20 r=12
 #MSG_BABYSTEP_Z_NOT_SET c=20 r=12
 "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."
 "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."
@@ -256,11 +256,11 @@
 
 
 #MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
 #MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
 "Extruder fan:"
 "Extruder fan:"
-"Went. ekstr:"
+"WentHotend:"
 
 
 #MSG_INFO_EXTRUDER c=15 r=1
 #MSG_INFO_EXTRUDER c=15 r=1
 "Extruder info"
 "Extruder info"
-"Informacje o ekstruderze"
+"Ekstruder - info"
 
 
 #MSG_MOVE_E
 #MSG_MOVE_E
 "Extruder"
 "Extruder"
@@ -272,7 +272,7 @@
 
 
 #MSG_FSENS_AUTOLOAD_ON c=17 r=1
 #MSG_FSENS_AUTOLOAD_ON c=17 r=1
 "F. autoload  [on]"
 "F. autoload  [on]"
-"Autolad. fil [wl]"
+"Autolad.fil. [wl]"
 
 
 #MSG_FSENS_AUTOLOAD_NA c=17 r=1
 #MSG_FSENS_AUTOLOAD_NA c=17 r=1
 "F. autoload [N/A]"
 "F. autoload [N/A]"
@@ -320,7 +320,7 @@
 
 
 #MSG_FILAMENT_CLEAN c=20 r=2
 #MSG_FILAMENT_CLEAN c=20 r=2
 "Filament extruding & with correct color?"
 "Filament extruding & with correct color?"
-"Filament wychodzi z dyszy a kolor jest czysty?"
+"Filament wychodzi z dyszy, kolor jest ok?"
 
 
 #MSG_NOT_LOADED c=19
 #MSG_NOT_LOADED c=19
 "Filament not loaded"
 "Filament not loaded"
@@ -516,7 +516,7 @@
 
 
 #
 #
 "Lin. correction"
 "Lin. correction"
-"Korekcja lin."
+"Korekcja liniowa"
 
 
 #MSG_BABYSTEP_Z
 #MSG_BABYSTEP_Z
 "Live adjust Z"
 "Live adjust Z"
@@ -604,7 +604,7 @@
 
 
 #MSG_STEALTH_MODE_ON
 #MSG_STEALTH_MODE_ON
 "Mode    [Stealth]"
 "Mode    [Stealth]"
-"Tryb    [Stealth]"
+"Tryb      [cichy]"
 
 
 #MSG_AUTO_MODE_ON
 #MSG_AUTO_MODE_ON
 "Mode [auto power]"
 "Mode [auto power]"
@@ -688,7 +688,7 @@
 
 
 #
 #
 "Nozzle FAN"
 "Nozzle FAN"
-"Went. Hotend"
+"WentHotend"
 
 
 #MSG_PAUSE_PRINT
 #MSG_PAUSE_PRINT
 "Pause print"
 "Pause print"
@@ -720,7 +720,7 @@
 
 
 #MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 #MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
 "Please clean the nozzle for calibration. Click when done."
 "Please clean the nozzle for calibration. Click when done."
-"Dla prawidl. kalibracji nalezy oczyscic dysze. Potw. guzikiem."
+"Dla prawidlowej kalibracji nalezy oczyscic dysze. Potwierdz guzikiem."
 
 
 #MSG_SELFTEST_PLEASECHECK
 #MSG_SELFTEST_PLEASECHECK
 "Please check :"
 "Please check :"
@@ -820,7 +820,7 @@
 
 
 #MSG_SELFTEST_PRINT_FAN_SPEED c=18
 #MSG_SELFTEST_PRINT_FAN_SPEED c=18
 "Print fan:"
 "Print fan:"
-"Went.wydr:"
+"WentWydruk:"
 
 
 #MSG_CARD_MENU
 #MSG_CARD_MENU
 "Print from SD"
 "Print from SD"
@@ -840,11 +840,11 @@
 
 
 #MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 #MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
 "Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."
 "Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."
-"Drukarka nie zostala jeszcze skalibrowana. Kieruj sie Samouczkiem: rozdzial Pierwsze Kroki, sekcja Konfiguracja przed drukowaniem."
+"Drukarka nie byla jeszcze kalibrowana. Kieruj sie Samouczkiem: rozdzial Pierwsze Kroki, sekcja Konfiguracja przed drukowaniem."
 
 
 #
 #
 "Print FAN"
 "Print FAN"
-"Went.wydr"
+"WentWydruk"
 
 
 #MSG_PRUSA3D
 #MSG_PRUSA3D
 "prusa3d.com"
 "prusa3d.com"
@@ -924,7 +924,7 @@
 
 
 #MSG_SELFTEST_START c=20
 #MSG_SELFTEST_START c=20
 "Self test start  "
 "Self test start  "
-"Rozpoczynanie Selftestu"
+"Selftest startuje"
 
 
 #MSG_SELFTEST
 #MSG_SELFTEST
 "Selftest         "
 "Selftest         "
@@ -932,7 +932,7 @@
 
 
 #MSG_SELFTEST_ERROR
 #MSG_SELFTEST_ERROR
 "Selftest error !"
 "Selftest error !"
-"Blad selftest !"
+"Blad selftest!"
 
 
 #MSG_SELFTEST_FAILED c=20
 #MSG_SELFTEST_FAILED c=20
 "Selftest failed  "
 "Selftest failed  "
@@ -952,7 +952,7 @@
 
 
 #MSG_SET_TEMPERATURE c=19 r=1
 #MSG_SET_TEMPERATURE c=19 r=1
 "Set temperature:"
 "Set temperature:"
-"Ustaw. temperatury:"
+"Ustaw temperature:"
 
 
 #MSG_SETTINGS
 #MSG_SETTINGS
 "Settings"
 "Settings"
@@ -979,12 +979,12 @@
 "Sortowanie [czas]"
 "Sortowanie [czas]"
 
 
 #
 #
-"Severe skew"
-"ZnacznySkos"
+"Severe skew:"
+"Znaczny skos:"
 
 
 #MSG_SORT_ALPHA c=17 r=1
 #MSG_SORT_ALPHA c=17 r=1
 "Sort   [alphabet]"
 "Sort   [alphabet]"
-"Sortowan[alfabet]"
+"Sortowanie[alfab]"
 
 
 #MSG_SORTING c=20 r=1
 #MSG_SORTING c=20 r=1
 "Sorting files"
 "Sorting files"
@@ -992,19 +992,19 @@
 
 
 #MSG_SOUND_LOUD c=17 r=1
 #MSG_SOUND_LOUD c=17 r=1
 "Sound      [loud]"
 "Sound      [loud]"
-"Dzwiek   [Glosny]"
+"Dzwiek   [glosny]"
 
 
 #
 #
-"Slight skew"
-"Lekki skos"
+"Slight skew:"
+"Lekki skos:"
 
 
 #MSG_SOUND_MUTE c=17 r=1
 #MSG_SOUND_MUTE c=17 r=1
 "Sound      [mute]"
 "Sound      [mute]"
-"Dzwiek[Wylaczony]"
+"Dzwiek[wylaczony]"
 
 
 #
 #
 "Some problem encountered, Z-leveling enforced ..."
 "Some problem encountered, Z-leveling enforced ..."
-"Wykryto problem, wymuszono poziomowanie osi Z ..."
+"Wykryto problem, wymuszono poziomowanie osi Z."
 
 
 #MSG_SOUND_ONCE c=17 r=1
 #MSG_SOUND_ONCE c=17 r=1
 "Sound      [once]"
 "Sound      [once]"
@@ -1012,7 +1012,7 @@
 
 
 #MSG_SOUND_SILENT c=17 r=1
 #MSG_SOUND_SILENT c=17 r=1
 "Sound    [silent]"
 "Sound    [silent]"
-"Dzwiek    [Cichy]"
+"Dzwiek    [cichy]"
 
 
 #MSG_SPEED
 #MSG_SPEED
 "Speed"
 "Speed"
@@ -1084,11 +1084,11 @@
 
 
 #
 #
 "Total filament"
 "Total filament"
-"Calkowita dlugosc filamentu"
+"Zuzycie filamentu"
 
 
 #
 #
 "Total print time"
 "Total print time"
-"Calkowity czas druku"
+"Laczny czas druku"
 
 
 #MSG_TUNE
 #MSG_TUNE
 "Tune"
 "Tune"
@@ -1280,7 +1280,7 @@
 
 
 #
 #
 "Magnets comp.[N/A]"
 "Magnets comp.[N/A]"
-"Kor. magnesow [nd]"
+"Kor. magnesow[N/D]"
 
 
 #
 #
 "Magnets comp.[Off]"
 "Magnets comp.[Off]"
@@ -1300,7 +1300,7 @@
 
 
 #
 #
 "Mesh bed leveling"
 "Mesh bed leveling"
-"Poziomowanie wg siatki"
+"Poziomowanie stolu"
 
 
 #
 #
 "MK3S firmware detected on MK3 printer"
 "MK3S firmware detected on MK3 printer"
@@ -1413,10 +1413,9 @@
 #
 #
 "Sheet"
 "Sheet"
 "Plyta"
 "Plyta"
-
 #
 #
-"Sound     [assist]"
-"Dzwiek    [asyst.]"
+"Sound    [assist]"
+"Dzwiek   [asyst.]"
 
 
 #
 #
 "Steel sheets"
 "Steel sheets"
@@ -1428,8 +1427,12 @@
 
 
 #
 #
 "Z-probe nr.    [1]"
 "Z-probe nr.    [1]"
-"Pomiar-Z       [1]"
+"Ilosc Pomiarow [1]"
 
 
 #
 #
 "Z-probe nr.    [3]"
 "Z-probe nr.    [3]"
-"Pomiar-Z       [3]"
+"Ilosc Pomiarow [3]"
+
+#
+"Z-probe nr.    [5]"
+"Ilosc Pomiarow [5]"

+ 252 - 0
lang/translations.md

@@ -0,0 +1,252 @@
+# Translations
+
+## Workflow
+
+- Build firmware
+  - using `build.sh`
+  - using `PF-build.sh` with a `break` before `# build languages`
+- change to `lang` folder
+- check if lang scripts being able to run with `config.sh`
+  - if you get `Arduino main folder: NG` message change in `config.sh` `export ARDUINO=C:/arduino-1.8.5` to `export ARDUINO=<Path to your Arduino IDE folder>`
+    -example: `export ARDUINO=D:/Github/Prusa-Firmware/PF-build-env-1.0.6/windows-64`
+- run `lang-build.sh en` to create english `lang_en.tmp`, `lang_en.dat` and `lang_en.bin` files
+- change in `fw-build.sh` `IGNORE_MISSING_TEXT=1` to `IGNORE_MISSING_TEXT=0` so it stops with error and generates `not_used.txt` and `not_tran.txt`
+- run modified `fw-build.sh`
+  - `not_tran.txt` should be reviewed and added as these are potential missing translations
+    - copy `not_tran.txt` as `lang_add.txt` 
+	  - check if there are things you don't want to translate or must be modifed
+	  - als check that the strings do not start with `spaces` as the scripts doesn't handle these well at this moment.
+	  - run `lang-add.sh lang_add.txt` to add the missing translations to `lang_en.txt` and `lang_en_??.txt`
+  - `not_used.txt` should only contain mesages that aren't used in this variant like MK2.5 vs MK3
+- run `fw-clean.sh` to cleanup firmware related files
+- delete `not_used.txt` and `not_tran.txt`
+- run `lang-clean.sh` to cleanup language related files
+- run `lang-export.sh all` to create PO files for translation these are stored in `/lang/po` folder
+  - Send them to translators and reviewers or
+  - copy these to `/lang/po/new` and 
+  - translate these with POEdit the newly added messages
+    - easiest way is to choose `Validate`in POEdit as it shows you `errors` and the `missing transalations` / most likely the newly added at the top.
+- The new translated files are expected in `/lang/po/new` folder so store the received files these
+- run `lang-import.sh <language code (iso639-1)>` for each newly translated language
+  - script improvement to import "all" and other things would be great.
+- Double check if something is missing or faulty
+  - run `lang-build.sh` to to create `lang_en.tmp/.dat/.bin` and `lang_en_??.tmp/.dat/.bin` files
+  - run `fw-build.sh` and check if there are still some messages in `not_tran.txt` that need attention
+- After approval
+  - run `fw-clean.sh` to cleanup firmware related files
+  - run `lang-clean.sh` to cleanup language related files
+  - change in `fw-build.sh` back to `IGNORE_MISSING_TEXT=1`
+  - remove `break` from `PF-build.sh` script if that has been modified
+  - build your firmware with `build.sh`, `PF-build.sh` or how you normally do it.
+  - Check/Test firmware on printer
+
+## Code / usage
+There are 2 modes of operation. If `LANG_MODE==0`, only one language is being used (the default compilation approach from plain Arduino IDE).
+The reset of this explanation is devoted to `LANG_MODE==1`:
+
+`language.h`:
+```C++
+// section .loc_sec (originaly .progmem0) will be used for localized translated strings
+#define PROGMEM_I2 __attribute__((section(".loc_sec")))
+// section .loc_pri (originaly .progmem1) will be used for localized strings in english
+#define PROGMEM_I1 __attribute__((section(".loc_pri")))
+// section .noloc (originaly progmem2) will be used for not localized strings in english
+#define PROGMEM_N1 __attribute__((section(".noloc")))
+#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)
+```
+That explains the macros:
+- `_i` expands into `lang_get_translation((__extension__({static const char __c[] PROGMEM_I1 = "\xff\xff" s; &__c[0];})))` . Note the two 0xff's in the beginning of the string. `_i` allows for declaring a string directly inplace of C++ code, no string table is used. The downside of this approach is obvious - the compiler is not able/willing to merge duplicit strings into one.
+- `_T` expands into `lang_get_translation(s)` without the two 0xff's at the beginning. Must be used in conjunction with MSG tables in `messages.h`. Allows to declare a string only once and use many times.
+- `_N` means not-translated. These strings reside in a different segment of memory.
+
+The two 0xff's are somehow magically replaced by real string ID's where the translations are available (still don't know where).
+```C++
+const char* lang_get_translation(const char* s){
+	if (lang_selected == 0) return s + 2; //primary language selected, return orig. str.
+	if (lang_table == 0) return s + 2; //sec. lang table not found, return orig. str.
+	uint16_t ui = pgm_read_word(((uint16_t*)s)); //read string id
+	if (ui == 0xffff) return s + 2; //translation not found, return orig. str.
+	ui = pgm_read_word(((uint16_t*)(((char*)lang_table + 16 + ui*2)))); //read relative offset
+	if (pgm_read_byte(((uint8_t*)((char*)lang_table + ui))) == 0) //read first character
+		return s + 2;//zero length string == not translated, return orig. str.
+	return (const char*)((char*)lang_table + ui); //return calculated pointer
+}
+```
+
+## Files
+
+### `lang_en.txt`
+```
+#MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
+"Crash detection can\x0abe turned on only in\x0aNormal mode"
+```
+
+### `lang_en_*.txt`
+```
+#MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
+"Crash detection can\x0abe turned on only in\x0aNormal mode"
+"Crash detekce muze\x0abyt zapnuta pouze v\x0aNormal modu"
+```
+1. a comment - usually a MSG define with number of characters (c) and rows (r)
+2. English text
+3. translated text
+
+### `not_tran.txt`
+A simple list of strings that are not translated yet.
+
+### `not_used.txt`
+A list os strings not currently used in this variant of the firmware or are obsolete.
+Example: There are MK2.5 specific messages that aren't used when you compile a MK3 variant and vice versa. So be carefull and double check the code if this message is obsolete or just not used due to the chosen variant.
+
+## Scripts
+
+### `config.sh`
+- Checks setup and sets auxiliary env vars used in many other scripts. 
+- Looks for env var `ARDUINO`. If not found/empty, a default `C:/arduino-1.8.5` is used.
+- Sets env var `CONFIG_OK=1` when all good, otherwise sets `CONFIG_OK=0`
+
+### `fw-build.sh`
+Joins firmware HEX and language binaries into one file.
+
+### `fw-clean.sh`
+
+### `lang-add.sh`
+Adds new messages into the dictionary regardless of whether there have been any older versions.
+
+### `lang-build.sh`
+Generates lang_xx.bin (language binary files) for the whole firmware build.
+
+Arguments:
+- `$1` : language code (`en`, `cz`, `de`, `es`, `fr`, `it`, `pl`) or `all`
+- empty/no arguments defaults to `all`
+
+Input: `lang_en.txt` or `lang_en_xx.txt`
+
+Output: `lang_xx.bin`
+
+Temporary files: `lang_xx.tmp` and `lang_xx.dat`
+
+Description of the process:
+The script first runs `lang-check.py $1` and removes empty lines and comments (and non-translated texts) into `lang_$1.tmp`.
+The tmp file now contains all translated texts (some of them empty, i.e. "").
+The tmp file is then transformed into `lang_$1.dat`, which is a simple dump of all texts together, each terminated with a `\x00`.
+Format of the `bin` file:
+- 00-01: `A5 5A`
+- 02-03: `B4 4B`
+- 04-05: 2B size
+- 06-07: 2B number of strings
+- 08-09: 2B checksum
+- 0A-0B: 2B lang code hex data: basically `en` converted into `ne`, i.e. characters swapped. Only `cz` is changed into `sc` (old `cs` ISO code).
+- 0C-0D: 2B signature low
+- 0E-0F: 2B signature high
+- 10-(10 + 2*number of strings): table of string offsets from the beginning of this file
+- after the table there are the strings themselves, each terminated with `\x00`
+
+The signature is composed of 2B number of strings and 2B checksum in lang_en.bin. Signature in lang_en.bin is zero.
+
+### `lang-check.sh` and `lang-check.py`
+Both do the same, only lang-check.py is newer, i.e. lang-check.sh is not used anymore.
+lang-check.py makes a binary comparison between what's in the dictionary and what's in the binary.
+
+### `lang-clean.sh`
+Removes all language output files from lang folder. That means deleting:
+-  if [ "$1" = "en" ]; then
+  rm_if_exists lang_$1.tmp
+ else
+  rm_if_exists lang_$1.tmp
+  rm_if_exists lang_en_$1.tmp
+  rm_if_exists lang_en_$1.dif
+  rm_if_exists lang_$1.ofs
+  rm_if_exists lang_$1.txt
+ fi
+ rm_if_exists lang_$1_check.dif
+ rm_if_exists lang_$1.bin
+ rm_if_exists lang_$1.dat
+ rm_if_exists lang_$1_1.tmp
+ rm_if_exists lang_$1_2.tmp
+
+### `lang-export.sh`
+Exports PO (gettext) for external translators.
+
+### `lang-import.sh`
+Import from PO.
+
+Arguments:
+- `$1` : language code (`en`, `cz`, `de`, `es`, `fr`, `it`, `pl`)
+- empty/no arguments quits the script
+
+Input files: `<language code>.po` files like `de.po`, `es.po`, etc.
+
+Input folder: ´/lang/po/new´
+
+Output files:
+
+Output foler: ´/lang/po/new´
+
+Needed improments to scrpit:
+ - add `all` argument
+ - update `replace in <language> translations` to all known special characters the LCD display with Japanese ROM cannot display
+ - move `lang_en_<language code>.txt` to folder `/lang`
+ - cleanup `<language code>_filtered.po`, `<language code>_new.po` and `nonasci.txt`
+
+### `progmem.sh`
+
+Examine content of progmem sections (default is progmem1).
+
+Input:
+- $OUTDIR/Firmware.ino.elf
+- $OUTDIR/sketch/*.o (all object files)
+
+Outputs:
+- text.sym     - formated symbol listing of section '.text'
+- $PROGMEM.sym - formated symbol listing of section '.progmemX'
+- $PROGMEM.lss - disassembly listing file
+- $PROGMEM.hex - variables - hex
+- $PROGMEM.chr - variables - char escape
+- $PROGMEM.var - variables - strings
+- $PROGMEM.txt - text data only (not used)
+
+Description of process:
+- check input files
+- remove output files
+- list symbol table of section '.text' from output elf file to text.sym (sorted by address)
+- calculate start and stop address of section '.$PROGMEM'
+- dump $PROGMEM data in hex format, cut disassembly (keep hex data only) into $PROGMEM.lss
+- convert $PROGMEM.lss to $PROGMEM.hex:
+ - replace empty lines with '|' (variables separated by empty lines)
+ - remove address from multiline variables (keep address at first variable line only)
+ - remove '<' and '>:', remove whitespace at end of lines
+ - remove line-endings, replace separator with '\n' (join hex data lines - each line will contain single variable)
+- convert $PROGMEM.hex to $PROGMEM.chr (prepare string data for character check and conversion)
+ - replace first space with tab
+ - replace second and third space with tab and space
+ - replace all remaining spaces with '\x'
+ - replace all tabs with spaces
+- convert $PROGMEM.chr to $PROGMEM.var (convert data to text) - a set of special characters is escaped here including `\x0a`
+
+
+### `textaddr.sh`
+
+Compiles `progmem1.var` and `lang_en.txt` files to `textaddr.txt` file (mapping of progmem addreses to text idenifiers).
+
+Description of process:
+- check if input files exists
+- create sorted list of strings from progmem1.var and lang_en.txt
+- lines from progmem1.var will contain addres (8 chars) and english text
+- lines from lang_en.txt will contain linenumber and english text
+- after sort this will generate pairs of lines (line from progmem1 first)
+- result of sort is compiled with simple script and stored into file textaddr.txt
+
+Input:
+- progmem1.var
+- lang_en.txt
+
+Output:
+- textaddr.txt
+
+
+
+update_lang.sh