From 43aa1680cb014ca1b558dd202a31e3565b5cd8e9 Mon Sep 17 00:00:00 2001
From: YuSanka <yusanka@gmail.com>
Date: Thu, 8 Feb 2018 10:58:13 +0100
Subject: [PATCH] Added menu item for selection of application language from
 the list of installed languages.

* m_Local and its functions moved to GUI.cpp.
* Strings in some files(GUI.cpp, Tab.cpp, Tab.hpp & Field.cpp) marked by _L() macro.
* Updated mo-files for En and Uk languages.
---
 lib/Slic3r/GUI/MainFrame.pm              |   6 +-
 resources/localization/en_US/Slic3rPE.mo | Bin 1775 -> 7892 bytes
 resources/localization/uk/Slic3rPE.mo    | Bin 2205 -> 10300 bytes
 xs/src/slic3r/GUI/BedShapeDialog.cpp     |  70 -------
 xs/src/slic3r/GUI/BedShapeDialog.hpp     |   6 -
 xs/src/slic3r/GUI/Field.cpp              |   6 +-
 xs/src/slic3r/GUI/GUI.cpp                | 130 ++++++++++++-
 xs/src/slic3r/GUI/GUI.hpp                |  11 +-
 xs/src/slic3r/GUI/Tab.cpp                | 231 ++++++++++++-----------
 xs/src/slic3r/GUI/Tab.hpp                |   8 +-
 10 files changed, 260 insertions(+), 208 deletions(-)

diff --git a/lib/Slic3r/GUI/MainFrame.pm b/lib/Slic3r/GUI/MainFrame.pm
index 1a06eb312..9f47b8d3e 100644
--- a/lib/Slic3r/GUI/MainFrame.pm
+++ b/lib/Slic3r/GUI/MainFrame.pm
@@ -410,9 +410,11 @@ sub _init_menubar {
         $menubar->Append($self->{object_menu}, "&Object") if $self->{object_menu};
         $menubar->Append($windowMenu, "&Window");
         $menubar->Append($self->{viewMenu}, "&View") if $self->{viewMenu};
-        $menubar->Append($helpMenu, "&Help");
-        # Add an optional debug menu. In production code, the add_debug_menu() call should do nothing.
+        # Add an optional debug menu 
+        # (Select application language from the list of installed languages)
+        # In production code, the add_debug_menu() call should do nothing.
         Slic3r::GUI::add_debug_menu($menubar);
+        $menubar->Append($helpMenu, "&Help");
         $self->SetMenuBar($menubar);
     }
 }
diff --git a/resources/localization/en_US/Slic3rPE.mo b/resources/localization/en_US/Slic3rPE.mo
index 46e2c85b9863630c7d7f68586a9d13c611be8f18..2b037fbb5969e75974cd135e997f759bc192e1c3 100644
GIT binary patch
literal 7892
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

delta 614
zcmbW!KTASU7{~Eb{;5n$Z)O=4Iz&VWSHcFfF(V2J38EU}79oOH;i^L|PVK?LH_%!{
z5ft?r3L2cFH7H!7E$I7%MRN~4_w$^~x##@Q=6owqe=^(+MH%!ceMXPbnGPP*1<v6m
zcH<j*@uR)|#C6u*PNj0Vja_(-5xhp(|A4*NL^<afJxbNp3xk^%Eu6x4oWyaLQcIXc
zUa4a|;4+O8D8Scp&=Sf8x%PS!CD1NPpc|AxJ~l}p17-gdk6!LqCW9Q5LH4Qzlt9ZU
zf!0t09ijv}K?(GV<WV8|r{sI704;m`w2zhm<o>N5Ciykg3>}o=PxUcN013q%-z9%f
ze|y%qkws6fQZ3v1bm+?KIAtdu(>u{&W7R3-3ni7?->X`se646X`Y|}7y`vM_GMrA^
z*7pNjU8z_ynNFp2A{_V6#*${*Oii0f)6|XdQE0`gR1@otRjL%NYS~H0baZe--$k<j
JxzT0Y>I=inSBU@s

diff --git a/resources/localization/uk/Slic3rPE.mo b/resources/localization/uk/Slic3rPE.mo
index 82aa2e48e4c875208f3f5500d4a13dd5bbf2269f..b0457326613f2fb8a7bce881e903d40642e39b62 100644
GIT binary patch
literal 10300
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
AcmMzZ

delta 718
zcmYk(OK1~87{KvKO<T3qCT(aFsm(?#B}!w`hll9FC`2mJhBRJ$92Tu@ArIN49=tRf
zy{a%&#0Tl2M=jBS)|#d_4}vf&UV0IadJr!ncqsUvpyCJL{AOn7@$GIs`NX~OsoS|I
zh;Fi<d`j*mk2+|GDjvb-xE;S?8~*$=-oiBFwiY2$cplqv1$*%&>h<rj13#iZ=QFkn
zu^_(EaWe58gZKl7aA2Dd6BtLP#64W(GKm)BAiG`o7<J*#a5ug~iJN#Gv)r!NeZd3x
z3j?^HDtozK#OZjMxQILP8g}9hJb`yGh99tu9?I7RKS1gcZt`z%XES!u>Z0{I`b@S8
z>i!oy=;^N^MoC@W|DoSPU!Xse{&YI@@9Apxc)K$lCtK$W#e7yC>#T(>D{lo1k;t2u
zjl!&Xb=tUM<+H|AIuQzm#H2MhGnW&o=}Sd3H#46xEtzrck&j%1a?5SCWV3R%XQF+~
z7#WF<9hR#-fzELw5{ZtE9}GvrVQF}7yAx)iIGnc3Tp?o?^H$W5%br^@*>_>cIAly7
zKSdim9j8sE&Q8UGQK25%CA+L@s-a$}RrOjfdHuC>z5z#9g{eAIZ`7Kq8UeY{KkTT;
z6`#LPs0y3z^0cAW?6Q4Rtv9#2{64Qx%c^0Qcvcl^i3P7z-M(*^<mSG(+!%c8tgE{C
E4dSJkAOHXW

diff --git a/xs/src/slic3r/GUI/BedShapeDialog.cpp b/xs/src/slic3r/GUI/BedShapeDialog.cpp
index 591188443..35238654e 100644
--- a/xs/src/slic3r/GUI/BedShapeDialog.cpp
+++ b/xs/src/slic3r/GUI/BedShapeDialog.cpp
@@ -8,18 +8,12 @@
 #include <wx/numformatter.h>
 #include "Model.hpp"
 #include "boost/nowide/iostream.hpp"
-#include <wx/config.h>
-#include <wx/dir.h>
-#include <wx/filename.h>
-#include "Utils.hpp"
 
 namespace Slic3r {
 namespace GUI {
 
 void BedShapeDialog::build_dialog(ConfigOptionPoints* default_pt)
 {
-	m_App = get_app();
-	LoadLanguage();
 	m_panel = new BedShapePanel(this);
 	m_panel->build_panel(default_pt);
 
@@ -38,70 +32,6 @@ void BedShapeDialog::build_dialog(ConfigOptionPoints* default_pt)
 	}));
 }
 
-bool BedShapeDialog::LoadLanguage()
-{
-//	wxConfigBase config(m_App->GetAppName());
-	long language;
-// 	if (!config.Read(wxT("wxTranslation_Language"),
-// 		&language, wxLANGUAGE_UNKNOWN))
-// 	{
-	language = wxLANGUAGE_UKRAINIAN;// wxLANGUAGE_UNKNOWN;
-// 	}
-// 	if (language == wxLANGUAGE_UNKNOWN) return false;
-	wxArrayString names;
-	wxArrayLong identifiers;
-	GetInstalledLanguages(names, identifiers);
-	for (size_t i = 0; i < identifiers.Count(); i++)
-	{
-		if (identifiers[i] == language)
-		{
- 			m_Locale = new wxLocale;
-			m_Locale->Init(identifiers[i]);
-			m_Locale->AddCatalogLookupPathPrefix(wxPathOnly(m_local_dir));
-			m_Locale->AddCatalog(m_App->GetAppName());
-			return true;
-		}
-	}
-	return false;
-}
-
-void BedShapeDialog::GetInstalledLanguages(wxArrayString & names,
-	wxArrayLong & identifiers)
-{
-	names.Clear();
-	identifiers.Clear();
-	m_local_dir = localization_dir();
-
-	wxDir dir(wxPathOnly(m_local_dir));
-	wxString filename;
-	const wxLanguageInfo * langinfo;
-	wxString name = wxLocale::GetLanguageName(wxLANGUAGE_DEFAULT);
-	if (!name.IsEmpty())
-	{
-		names.Add(_L("Default"));
-		identifiers.Add(wxLANGUAGE_DEFAULT);
-	}
-	for (bool cont = dir.GetFirst(&filename, wxEmptyString/*wxT("*.*")*/, wxDIR_DIRS);
-		cont; cont = dir.GetNext(&filename))
-	{
-		wxLogTrace(wxTraceMask(),
-			_L("L10n: Directory found = \"%s\""),
-			filename.GetData());
-		langinfo = wxLocale::FindLanguageInfo(filename);
-		if (langinfo != NULL)
-		{
-			auto full_file_name = dir.GetName() + wxFileName::GetPathSeparator() +
-				filename + wxFileName::GetPathSeparator() +
-				m_App->GetAppName() + wxT(".mo");
-			if (wxFileExists(full_file_name))
-			{
-				names.Add(langinfo->Description);
-				identifiers.Add(langinfo->Language);
-			}
-		}
-	}
-}
-
 void BedShapePanel::build_panel(ConfigOptionPoints* default_pt)
 {
 //	on_change(nullptr);
diff --git a/xs/src/slic3r/GUI/BedShapeDialog.hpp b/xs/src/slic3r/GUI/BedShapeDialog.hpp
index 5bd7d68b9..81b0a41e3 100644
--- a/xs/src/slic3r/GUI/BedShapeDialog.hpp
+++ b/xs/src/slic3r/GUI/BedShapeDialog.hpp
@@ -38,9 +38,6 @@ public:
 class BedShapeDialog : public wxDialog
 {
 	BedShapePanel*	m_panel;
-	wxLocale*		m_Locale;
-	wxApp*			m_App;
-	std::string		m_local_dir;
 public:
 	BedShapeDialog(wxWindow* parent) : wxDialog(parent, wxID_ANY, _L("Bed Shape"),
 		wxDefaultPosition, wxSize(350, 700), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER){}
@@ -48,9 +45,6 @@ public:
 
 	void		build_dialog(ConfigOptionPoints* default_pt);
 	std::vector<Pointf>	GetValue() { return m_panel->GetValue(); }
-
-	bool	LoadLanguage();
-	void	GetInstalledLanguages(wxArrayString & names, wxArrayLong & identifiers);
 };
 
 } // GUI
diff --git a/xs/src/slic3r/GUI/Field.cpp b/xs/src/slic3r/GUI/Field.cpp
index 291a83e4f..5bb41f93e 100644
--- a/xs/src/slic3r/GUI/Field.cpp
+++ b/xs/src/slic3r/GUI/Field.cpp
@@ -32,9 +32,9 @@ namespace Slic3r { namespace GUI {
 		wxString tooltip_text("");
 		wxString tooltip = wxString::FromUTF8(m_opt.tooltip.c_str());
 		if (tooltip.length() > 0)
-			tooltip_text = boost::iends_with(m_opt_id, "_gcode") ?
-						tooltip + "(" + _L("default") + ": \n" + default_string + ")" : 
-						tooltip + "(" + _L("default") + ": " + default_string + ")";
+			tooltip_text = tooltip + "(" + _L("default") + ": " +
+							(boost::iends_with(m_opt_id, "_gcode") ? "\n" : "") + 
+							default_string + ")";
 
 		return tooltip_text;
 	}
diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp
index 624962002..8063c98fd 100644
--- a/xs/src/slic3r/GUI/GUI.cpp
+++ b/xs/src/slic3r/GUI/GUI.cpp
@@ -35,6 +35,10 @@
 #include "Tab.hpp"
 #include "TabIface.hpp"
 #include "AppConfig.hpp"
+//#include <wx/config.h>
+#include <wx/dir.h>
+#include <wx/filename.h>
+#include "Utils.hpp"
 
 namespace Slic3r { namespace GUI {
 
@@ -162,6 +166,9 @@ wxApp       *g_wxApp        = nullptr;
 wxFrame     *g_wxMainFrame  = nullptr;
 wxNotebook  *g_wxTabPanel   = nullptr;
 
+wxLocale*		m_Locale;
+std::string		m_local_dir;
+
 void set_wxapp(wxApp *app)
 {
     g_wxApp = app;
@@ -177,13 +184,122 @@ void set_tab_panel(wxNotebook *tab_panel)
     g_wxTabPanel = tab_panel;
 }
 
+bool select_language(wxArrayString & names,
+	wxArrayLong & identifiers)
+{
+	wxCHECK_MSG(names.Count() == identifiers.Count(), false,
+		_L("Array of language names and identifiers should have the same size."));
+	long index = wxGetSingleChoiceIndex(_L("Select the language"),
+		_L("Language"), names);
+	if (index != -1)
+	{
+		m_Locale = new wxLocale;
+		m_Locale->Init(identifiers[index]);
+		m_Locale->AddCatalogLookupPathPrefix(wxPathOnly(m_local_dir));
+		wxLogTrace(wxTraceMask(),
+			_L("Slic3rPE: Path Prefix = \"%s\""),
+			wxPathOnly(m_local_dir).GetData());
+		m_Locale->AddCatalog(g_wxApp->GetAppName());
+		wxLogTrace(wxTraceMask(),
+			_L("Slic3rPE: Catalog Name = \"%s\""),
+			g_wxApp->GetAppName().GetData());
+		return true;
+	}
+	return false;
+}
+
+bool load_language()
+{
+// 	wxConfig config(g_wxApp->GetAppName());
+	long language;
+// 	if (!config.Read(wxT("wxTranslation_Language"),
+// 		&language, wxLANGUAGE_UNKNOWN))
+// 	{
+		language = wxLANGUAGE_UKRAINIAN;// wxLANGUAGE_UNKNOWN;
+// 	}
+// 	if (language == wxLANGUAGE_UNKNOWN) return false;
+	wxArrayString names;
+	wxArrayLong identifiers;
+	get_installed_languages(names, identifiers);
+	for (size_t i = 0; i < identifiers.Count(); i++)
+	{
+		if (identifiers[i] == language)
+		{
+			m_Locale = new wxLocale;
+			m_Locale->Init(identifiers[i]);
+			m_Locale->AddCatalogLookupPathPrefix(wxPathOnly(m_local_dir));
+			m_Locale->AddCatalog(g_wxApp->GetAppName());
+			return true;
+		}
+	}
+	return false;
+}
+
+void save_language(bool bReset)
+{
+//	wxConfig config(g_wxApp->GetAppName());
+	long language = wxLANGUAGE_UNKNOWN;
+	if (!bReset)
+	{
+		if (m_Locale)
+		{
+			language = m_Locale->GetLanguage();
+		}
+	}
+// 	config.Write(wxT("wxTranslation_Language"), language);
+// 	config.Flush();
+}
+
+void get_installed_languages(wxArrayString & names,
+	wxArrayLong & identifiers)
+{
+	names.Clear();
+	identifiers.Clear();
+	m_local_dir = localization_dir();
+
+	wxDir dir(wxPathOnly(m_local_dir));
+	wxString filename;
+	const wxLanguageInfo * langinfo;
+	wxString name = wxLocale::GetLanguageName(wxLANGUAGE_DEFAULT);
+	if (!name.IsEmpty())
+	{
+		names.Add(_L("Default"));
+		identifiers.Add(wxLANGUAGE_DEFAULT);
+	}
+	for (bool cont = dir.GetFirst(&filename, wxEmptyString, wxDIR_DIRS);
+		cont; cont = dir.GetNext(&filename))
+	{
+		wxLogTrace(wxTraceMask(),
+			"L10n: Directory found = \"%s\"",
+			filename.GetData());
+		langinfo = wxLocale::FindLanguageInfo(filename);
+		if (langinfo != NULL)
+		{
+			auto full_file_name = dir.GetName() + wxFileName::GetPathSeparator() +
+				filename + wxFileName::GetPathSeparator() +
+				g_wxApp->GetAppName() + wxT(".mo");
+			if (wxFileExists(full_file_name))
+			{
+				names.Add(langinfo->Description);
+				identifiers.Add(langinfo->Language);
+			}
+		}
+	}
+}
+
 void add_debug_menu(wxMenuBar *menu)
 {
-#if 0
-    auto debug_menu = new wxMenu();
-    debug_menu->Append(wxWindow::NewControlId(1), "Some debug");
-    menu->Append(debug_menu, _T("&Debug"));
-#endif
+//#if 0
+    auto local_menu = new wxMenu();
+	local_menu->Append(wxWindow::NewControlId(1), _L("Change Application Language"));
+	local_menu->Bind(wxEVT_MENU, [](wxEvent&){
+		wxArrayString names;
+		wxArrayLong identifiers;
+		get_installed_languages(names, identifiers);
+		select_language(names, identifiers);
+	});
+	menu->Append(local_menu, _T("&Localization"));
+//#endif
 }
 
 void create_preset_tabs(PresetBundle *preset_bundle, AppConfig *app_config,
@@ -315,12 +431,12 @@ void add_created_tab(Tab* panel, PresetBundle *preset_bundle, AppConfig *app_con
 }
 
 void show_error(wxWindow* parent, wxString message){
-	auto msg_wingow = new wxMessageDialog(parent, message, "Error", wxOK | wxICON_ERROR);
+	auto msg_wingow = new wxMessageDialog(parent, message, _L("Error"), wxOK | wxICON_ERROR);
 	msg_wingow->ShowModal();
 }
 
 void show_info(wxWindow* parent, wxString message, wxString title){
-	auto msg_wingow = new wxMessageDialog(parent, message, title.empty() ? "Notice" : title, wxOK | wxICON_INFORMATION);
+	auto msg_wingow = new wxMessageDialog(parent, message, title.empty() ? _L("Notice") : title, wxOK | wxICON_INFORMATION);
 	msg_wingow->ShowModal();
 }
 
diff --git a/xs/src/slic3r/GUI/GUI.hpp b/xs/src/slic3r/GUI/GUI.hpp
index cc6bae964..c8f156846 100644
--- a/xs/src/slic3r/GUI/GUI.hpp
+++ b/xs/src/slic3r/GUI/GUI.hpp
@@ -11,6 +11,8 @@ class wxWindow;
 class wxMenuBar;
 class wxNotebook;
 class wxString;
+class wxArrayString;
+class wxArrayLong;
 
 namespace Slic3r { 
 
@@ -72,7 +74,14 @@ void change_opt_value(DynamicPrintConfig& config, t_config_option_key opt_key, b
 void show_error(wxWindow* parent, wxString message);
 void show_info(wxWindow* parent, wxString message, wxString title);
 
-wxApp* get_app();
+// load language saved at application config 
+bool load_language();
+// save language at application config 
+void save_language(bool bReset);
+// get list of installed languages 
+void get_installed_languages(wxArrayString & names, wxArrayLong & identifiers);
+// select language from the list of installed languages
+bool select_language(wxArrayString & names, wxArrayLong & identifiers);
 
 } }
 
diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp
index 9b25f2444..77c441005 100644
--- a/xs/src/slic3r/GUI/Tab.cpp
+++ b/xs/src/slic3r/GUI/Tab.cpp
@@ -48,8 +48,8 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle)
 	m_bmp_hide_incompatible_presets = new wxBitmap(wxString::FromUTF8(Slic3r::var("flag-green-icon.png").c_str()), wxBITMAP_TYPE_PNG);
 	m_btn_hide_incompatible_presets = new wxBitmapButton(panel, wxID_ANY, *m_bmp_hide_incompatible_presets, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
 
-	m_btn_save_preset->SetToolTip(wxT("Save current ") + wxString(m_title));// (stTitle);
-	m_btn_delete_preset->SetToolTip(_T("Delete this preset"));
+	m_btn_save_preset->SetToolTip(_L("Save current ") + m_title);
+	m_btn_delete_preset->SetToolTip(_L("Delete this preset"));
 	m_btn_delete_preset->Disable();
 
 	m_hsizer = new wxBoxSizer(wxHORIZONTAL);
@@ -120,7 +120,7 @@ PageShp Tab::add_options_page(wxString title, std::string icon, bool is_extruder
 			// Add a new icon to the icon list.
 			const auto img_icon = new wxIcon(wxString::FromUTF8(Slic3r::var(icon).c_str()), wxBITMAP_TYPE_PNG);
 			m_icons->Add(*img_icon);
-			icon_idx = ++m_icon_count; //  $icon_idx = $self->{icon_count} + 1; $self->{icon_count} = $icon_idx;
+			icon_idx = ++m_icon_count;
 			m_icon_index[icon] = icon_idx;
 		}
 	}
@@ -299,7 +299,7 @@ void Tab::on_value_change(std::string opt_key, boost::any value)
 // to update the filament colors of the selection boxes,
 // to update the "dirty" flags of the selection boxes,
 // to uddate number of "filament" selection boxes when the number of extruders change.
-void Tab::on_presets_changed(/*std::vector<std::string> reload_dependent_tabs*/)
+void Tab::on_presets_changed()
 {
 	if (m_event_presets_changed > 0) {
 		wxCommandEvent event(m_event_presets_changed);
@@ -321,12 +321,12 @@ void TabPrint::build()
 	m_presets = &m_preset_bundle->prints;
 	m_config = &m_presets->get_edited_preset().config;
 
-	auto page = add_options_page("Layers and perimeters", "layers.png");
-		auto optgroup = page->new_optgroup("Layer height");
+	auto page = add_options_page(_L("Layers and perimeters"), "layers.png");
+		auto optgroup = page->new_optgroup(_L("Layer height"));
 		optgroup->append_single_option_line("layer_height");
 		optgroup->append_single_option_line("first_layer_height");
 
-		optgroup = page->new_optgroup("Vertical shells");
+		optgroup = page->new_optgroup(_L("Vertical shells"));
 		optgroup->append_single_option_line("perimeters");
 		optgroup->append_single_option_line("spiral_vase");
 
@@ -337,34 +337,34 @@ void TabPrint::build()
 		};
 		optgroup->append_line(line);
 
-		optgroup = page->new_optgroup("Horizontal shells");
-		line = { "Solid layers", "" };
+		optgroup = page->new_optgroup(_L("Horizontal shells"));
+		line = { _L("Solid layers"), "" };
 		line.append_option(optgroup->get_option("top_solid_layers"));
 		line.append_option(optgroup->get_option("bottom_solid_layers"));
 		optgroup->append_line(line);
 
-		optgroup = page->new_optgroup("Quality (slower slicing)");
+		optgroup = page->new_optgroup(_L("Quality (slower slicing)"));
 		optgroup->append_single_option_line("extra_perimeters");
 		optgroup->append_single_option_line("ensure_vertical_shell_thickness");
 		optgroup->append_single_option_line("avoid_crossing_perimeters");
 		optgroup->append_single_option_line("thin_walls");
 		optgroup->append_single_option_line("overhangs");
 
-		optgroup = page->new_optgroup("Advanced");
+		optgroup = page->new_optgroup(_L("Advanced"));
 		optgroup->append_single_option_line("seam_position");
 		optgroup->append_single_option_line("external_perimeters_first");
 
-	page = add_options_page("Infill", "infill.png");
-		optgroup = page->new_optgroup("Infill");
+	page = add_options_page(_L("Infill"), "infill.png");
+		optgroup = page->new_optgroup(_L("Infill"));
 		optgroup->append_single_option_line("fill_density");
 		optgroup->append_single_option_line("fill_pattern");
 		optgroup->append_single_option_line("external_fill_pattern");
 
-		optgroup = page->new_optgroup("Reducing printing time");
+		optgroup = page->new_optgroup(_L("Reducing printing time"));
 		optgroup->append_single_option_line("infill_every_layers");
 		optgroup->append_single_option_line("infill_only_where_needed");
 
-		optgroup = page->new_optgroup("Advanced");
+		optgroup = page->new_optgroup(_L("Advanced"));
 		optgroup->append_single_option_line("solid_infill_every_layers");
 		optgroup->append_single_option_line("fill_angle");
 		optgroup->append_single_option_line("solid_infill_below_area");
@@ -372,27 +372,27 @@ void TabPrint::build()
 		optgroup->append_single_option_line("only_retract_when_crossing_perimeters");
 		optgroup->append_single_option_line("infill_first");
 
-	page = add_options_page("Skirt and brim", "box.png");
-		optgroup = page->new_optgroup("Skirt");
+	page = add_options_page(_L("Skirt and brim"), "box.png");
+		optgroup = page->new_optgroup(_L("Skirt"));
 		optgroup->append_single_option_line("skirts");
 		optgroup->append_single_option_line("skirt_distance");
 		optgroup->append_single_option_line("skirt_height");
 		optgroup->append_single_option_line("min_skirt_length");
 
-		optgroup = page->new_optgroup("Brim");
+		optgroup = page->new_optgroup(_L("Brim"));
 		optgroup->append_single_option_line("brim_width");
 
-	page = add_options_page("Support material", "building.png");
-		optgroup = page->new_optgroup("Support material");
+	page = add_options_page(_L("Support material"), "building.png");
+		optgroup = page->new_optgroup(_L("Support material"));
 		optgroup->append_single_option_line("support_material");
 		optgroup->append_single_option_line("support_material_threshold");
 		optgroup->append_single_option_line("support_material_enforce_layers");
 
-		optgroup = page->new_optgroup("Raft");
+		optgroup = page->new_optgroup(_L("Raft"));
 		optgroup->append_single_option_line("raft_layers");
 //		# optgroup->append_single_option_line(get_option_("raft_contact_distance");
 
-		optgroup = page->new_optgroup("Options for support material and raft");
+		optgroup = page->new_optgroup(_L("Options for support material and raft"));
 		optgroup->append_single_option_line("support_material_contact_distance");
 		optgroup->append_single_option_line("support_material_pattern");
 		optgroup->append_single_option_line("support_material_with_sheath");
@@ -406,8 +406,8 @@ void TabPrint::build()
 		optgroup->append_single_option_line("dont_support_bridges");
 		optgroup->append_single_option_line("support_material_synchronize_layers");
 
-	page = add_options_page("Speed", "time.png");
-		optgroup = page->new_optgroup("Speed for print moves");
+	page = add_options_page(_L("Speed"), "time.png");
+		optgroup = page->new_optgroup(_L("Speed for print moves"));
 		optgroup->append_single_option_line("perimeter_speed");
 		optgroup->append_single_option_line("small_perimeter_speed");
 		optgroup->append_single_option_line("external_perimeter_speed");
@@ -419,49 +419,49 @@ void TabPrint::build()
 		optgroup->append_single_option_line("bridge_speed");
 		optgroup->append_single_option_line("gap_fill_speed");
 
-		optgroup = page->new_optgroup("Speed for non-print moves");
+		optgroup = page->new_optgroup(_L("Speed for non-print moves"));
 		optgroup->append_single_option_line("travel_speed");
 
-		optgroup = page->new_optgroup("Modifiers");
+		optgroup = page->new_optgroup(_L("Modifiers"));
 		optgroup->append_single_option_line("first_layer_speed");
 
-		optgroup = page->new_optgroup("Acceleration control (advanced)");
+		optgroup = page->new_optgroup(_L("Acceleration control (advanced)"));
 		optgroup->append_single_option_line("perimeter_acceleration");
 		optgroup->append_single_option_line("infill_acceleration");
 		optgroup->append_single_option_line("bridge_acceleration");
 		optgroup->append_single_option_line("first_layer_acceleration");
 		optgroup->append_single_option_line("default_acceleration");
 
-		optgroup = page->new_optgroup("Autospeed (advanced)");
+		optgroup = page->new_optgroup(_L("Autospeed (advanced)"));
 		optgroup->append_single_option_line("max_print_speed");
 		optgroup->append_single_option_line("max_volumetric_speed");
 		optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope_positive");
 		optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope_negative");
 
-	page = add_options_page("Multiple Extruders", "funnel.png");
-		optgroup = page->new_optgroup("Extruders");
+	page = add_options_page(_L("Multiple Extruders"), "funnel.png");
+		optgroup = page->new_optgroup(_L("Extruders"));
 		optgroup->append_single_option_line("perimeter_extruder");
 		optgroup->append_single_option_line("infill_extruder");
 		optgroup->append_single_option_line("solid_infill_extruder");
 		optgroup->append_single_option_line("support_material_extruder");
 		optgroup->append_single_option_line("support_material_interface_extruder");
 
-		optgroup = page->new_optgroup("Ooze prevention");
+		optgroup = page->new_optgroup(_L("Ooze prevention"));
 		optgroup->append_single_option_line("ooze_prevention");
 		optgroup->append_single_option_line("standby_temperature_delta");
 
-		optgroup = page->new_optgroup("Wipe tower");
+		optgroup = page->new_optgroup(_L("Wipe tower"));
 		optgroup->append_single_option_line("wipe_tower");
 		optgroup->append_single_option_line("wipe_tower_x");
 		optgroup->append_single_option_line("wipe_tower_y");
 		optgroup->append_single_option_line("wipe_tower_width");
 		optgroup->append_single_option_line("wipe_tower_per_color_wipe");
 
-		optgroup = page->new_optgroup("Advanced");
+		optgroup = page->new_optgroup(_L("Advanced"));
 		optgroup->append_single_option_line("interface_shells");
 
-	page = add_options_page("Advanced", "wrench.png");
-		optgroup = page->new_optgroup("Extrusion width", 180);
+	page = add_options_page(_L("Advanced"), "wrench.png");
+		optgroup = page->new_optgroup(_L("Extrusion width"), 180);
 		optgroup->append_single_option_line("extrusion_width");
 		optgroup->append_single_option_line("first_layer_extrusion_width");
 		optgroup->append_single_option_line("perimeter_extrusion_width");
@@ -471,21 +471,21 @@ void TabPrint::build()
 		optgroup->append_single_option_line("top_infill_extrusion_width");
 		optgroup->append_single_option_line("support_material_extrusion_width");
 
-		optgroup = page->new_optgroup("Overlap");
+		optgroup = page->new_optgroup(_L("Overlap"));
 		optgroup->append_single_option_line("infill_overlap");
 
-		optgroup = page->new_optgroup("Flow");
+		optgroup = page->new_optgroup(_L("Flow"));
 		optgroup->append_single_option_line("bridge_flow_ratio");
 
-		optgroup = page->new_optgroup("Other");
+		optgroup = page->new_optgroup(_L("Other"));
 		optgroup->append_single_option_line("clip_multipart_objects");
 		optgroup->append_single_option_line("elefant_foot_compensation");
 		optgroup->append_single_option_line("xy_size_compensation");
 //		#            optgroup->append_single_option_line("threads");
 		optgroup->append_single_option_line("resolution");
 
-	page = add_options_page("Output options", "page_white_go.png");
-		optgroup = page->new_optgroup("Sequential printing");
+	page = add_options_page(_L("Output options"), "page_white_go.png");
+		optgroup = page->new_optgroup(_L("Sequential printing"));
 		optgroup->append_single_option_line("complete_objects");
 		line = Line{ "Extruder clearance (mm)", "" };
 		Option option = optgroup->get_option("extruder_clearance_radius");
@@ -496,27 +496,27 @@ void TabPrint::build()
 		line.append_option(option);
 		optgroup->append_line(line);
 
-		optgroup = page->new_optgroup("Output file");
+		optgroup = page->new_optgroup(_L("Output file"));
 		optgroup->append_single_option_line("gcode_comments");
 		option = optgroup->get_option("output_filename_format");
 		option.opt.full_width = true;
 		optgroup->append_single_option_line(option);
 
-		optgroup = page->new_optgroup("Post-processing scripts", 0);	
+		optgroup = page->new_optgroup(_L("Post-processing scripts"), 0);	
 		option = optgroup->get_option("post_process");
 		option.opt.full_width = true;
 		option.opt.height = 50;
 		optgroup->append_single_option_line(option);
 
-	page = add_options_page("Notes", "note.png");
-		optgroup = page->new_optgroup("Notes", 0);						
+	page = add_options_page(_L("Notes"), "note.png");
+		optgroup = page->new_optgroup(_L("Notes"), 0);						
 		option = optgroup->get_option("notes");
 		option.opt.full_width = true;
 		option.opt.height = 250;
 		optgroup->append_single_option_line(option);
 
-	page = add_options_page("Dependencies", "wrench.png");
-		optgroup = page->new_optgroup("Profile dependencies");
+	page = add_options_page(_L("Dependencies"), "wrench.png");
+		optgroup = page->new_optgroup(_L("Profile dependencies"));
 		line = Line{ "Compatible printers", "" };
 		line.widget = [this](wxWindow* parent){
 			return compatible_printers_widget(parent, &m_compatible_printers_checkbox, &m_compatible_printers_btn);
@@ -791,27 +791,27 @@ void TabFilament::build()
 	m_presets = &m_preset_bundle->filaments;
 	m_config = &m_preset_bundle->filaments.get_edited_preset().config;
 
-	auto page = add_options_page("Filament", "spool.png");
-		auto optgroup = page->new_optgroup("Filament");
+	auto page = add_options_page(_L("Filament"), "spool.png");
+		auto optgroup = page->new_optgroup(_L("Filament"));
 		optgroup->append_single_option_line("filament_colour");
 		optgroup->append_single_option_line("filament_diameter");
 		optgroup->append_single_option_line("extrusion_multiplier");
 		optgroup->append_single_option_line("filament_density");
 		optgroup->append_single_option_line("filament_cost");
 
-		optgroup = page->new_optgroup("Temperature (\u00B0C)"); // degree sign
-		Line line = { "Extruder", "" };
+		optgroup = page->new_optgroup(_L("Temperature") +" (\u00B0C)"); // degree sign
+		Line line = { _L("Extruder"), "" };
 		line.append_option(optgroup->get_option("first_layer_temperature"));
 		line.append_option(optgroup->get_option("temperature"));
 		optgroup->append_line(line);
 
-		line = { "Bed", "" };
+		line = { _L("Bed"), "" };
 		line.append_option(optgroup->get_option("first_layer_bed_temperature"));
 		line.append_option(optgroup->get_option("bed_temperature"));
 		optgroup->append_line(line);
 
-	page = add_options_page("Cooling", "hourglass.png");
-		optgroup = page->new_optgroup("Enable");
+	page = add_options_page(_L("Cooling"), "hourglass.png");
+		optgroup = page->new_optgroup(_L("Enable"));
 		optgroup->append_single_option_line("fan_always_on");
 		optgroup->append_single_option_line("cooling");
 
@@ -822,7 +822,7 @@ void TabFilament::build()
 		};
 		optgroup->append_line(line);
 
-		optgroup = page->new_optgroup("Fan settings");
+		optgroup = page->new_optgroup(_L("Fan settings"));
 		line = {"Fan speed",""};
 		line.append_option(optgroup->get_option("min_fan_speed"));
 		line.append_option(optgroup->get_option("max_fan_speed"));
@@ -831,17 +831,17 @@ void TabFilament::build()
 		optgroup->append_single_option_line("bridge_fan_speed");
 		optgroup->append_single_option_line("disable_fan_first_layers");
 
-		optgroup = page->new_optgroup("Cooling thresholds", 250);
+		optgroup = page->new_optgroup(_L("Cooling thresholds"), 250);
 		optgroup->append_single_option_line("fan_below_layer_time");
 		optgroup->append_single_option_line("slowdown_below_layer_time");
 		optgroup->append_single_option_line("min_print_speed");
 
-	page = add_options_page("Advanced", "wrench.png");
-		optgroup = page->new_optgroup("Filament properties");
+	page = add_options_page(_L("Advanced"), "wrench.png");
+		optgroup = page->new_optgroup(_L("Filament properties"));
 		optgroup->append_single_option_line("filament_type");
 		optgroup->append_single_option_line("filament_soluble");
 
-		optgroup = page->new_optgroup("Print speed override");
+		optgroup = page->new_optgroup(_L("Print speed override"));
 		optgroup->append_single_option_line("filament_max_volumetric_speed");
 
 		line = {"",""};
@@ -851,29 +851,29 @@ void TabFilament::build()
 		};
 		optgroup->append_line(line);
 
-	page = add_options_page("Custom G-code", "cog.png");
-		optgroup = page->new_optgroup("Start G-code", 0);
+	page = add_options_page(_L("Custom G-code"), "cog.png");
+		optgroup = page->new_optgroup(_L("Start G-code"), 0);
 		Option option = optgroup->get_option("start_filament_gcode");
 		option.opt.full_width = true;
 		option.opt.height = 150;
 		optgroup->append_single_option_line(option);
 
-		optgroup = page->new_optgroup("End G-code", 0);
+		optgroup = page->new_optgroup(_L("End G-code"), 0);
 		option = optgroup->get_option("end_filament_gcode");
 		option.opt.full_width = true;
 		option.opt.height = 150;
 		optgroup->append_single_option_line(option);
 
-	page = add_options_page("Notes", "note.png");
-		optgroup = page->new_optgroup("Notes", 0);
+	page = add_options_page(_L("Notes"), "note.png");
+		optgroup = page->new_optgroup(_L("Notes"), 0);
 		optgroup->label_width = 0;
 		option = optgroup->get_option("filament_notes");
 		option.opt.full_width = true;
 		option.opt.height = 250;
 		optgroup->append_single_option_line(option);
 
-	page = add_options_page("Dependencies", "wrench.png");
-		optgroup = page->new_optgroup("Profile dependencies");
+	page = add_options_page(_L("Dependencies"), "wrench.png");
+		optgroup = page->new_optgroup(_L("Profile dependencies"));
 		line = {"Compatible printers", ""};
 		line.widget = [this](wxWindow* parent){
 			return compatible_printers_widget(parent, &m_compatible_printers_checkbox, &m_compatible_printers_btn);
@@ -942,12 +942,12 @@ void TabPrinter::build()
 	auto   *nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(m_config->option("nozzle_diameter"));
 	m_extruders_count = nozzle_diameter->values.size();
 
-	auto page = add_options_page("General", "printer_empty.png");
-		auto optgroup = page->new_optgroup("Size and coordinates");
+	auto page = add_options_page(_L("General"), "printer_empty.png");
+		auto optgroup = page->new_optgroup(_L("Size and coordinates"));
 
-		Line line = { "Bed shape", "" };
+		Line line{ _L("Bed shape"), "" };
 		line.widget = [this](wxWindow* parent){
-			auto btn = new wxButton(parent, wxID_ANY, "Set\u2026", wxDefaultPosition, wxDefaultSize,
+			auto btn = new wxButton(parent, wxID_ANY, _L("Set")+"\u2026", wxDefaultPosition, wxDefaultSize,
 				wxBU_LEFT | wxBU_EXACTFIT);
 //			btn->SetFont(Slic3r::GUI::small_font);
 			btn->SetBitmap(wxBitmap(wxString::FromUTF8(Slic3r::var("printer_empty.png").c_str()), wxBITMAP_TYPE_PNG));
@@ -968,7 +968,7 @@ void TabPrinter::build()
 		optgroup->append_line(line);
 		optgroup->append_single_option_line("z_offset");
 
-		optgroup = page->new_optgroup("Capabilities");
+		optgroup = page->new_optgroup(_L("Capabilities"));
 		ConfigOptionDef def;
 			def.type =  coInt,
 			def.default_value = new ConfigOptionInt(1); 
@@ -995,13 +995,13 @@ void TabPrinter::build()
 
 		if (!m_no_controller)
 		{
-		optgroup = page->new_optgroup("USB/Serial connection");
+		optgroup = page->new_optgroup(_L("USB/Serial connection"));
 			line = {"Serial port", ""};
 			Option serial_port = optgroup->get_option("serial_port");
 			serial_port.side_widget = ([this](wxWindow* parent){
 				auto btn = new wxBitmapButton(parent, wxID_ANY, wxBitmap(wxString::FromUTF8(Slic3r::var("arrow_rotate_clockwise.png").c_str()), wxBITMAP_TYPE_PNG),
 					wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
-				btn->SetToolTip("Rescan serial ports");
+				btn->SetToolTip(_L("Rescan serial ports"));
 				auto sizer = new wxBoxSizer(wxHORIZONTAL);
 				sizer->Add(btn);
 
@@ -1010,7 +1010,7 @@ void TabPrinter::build()
 			});
 			auto serial_test = [this](wxWindow* parent){
 				auto btn = m_serial_test_btn = new wxButton(parent, wxID_ANY,
-					"Test", wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
+					_L("Test"), wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
 //				btn->SetFont($Slic3r::GUI::small_font);
 				btn->SetBitmap(wxBitmap(wxString::FromUTF8(Slic3r::var("wrench.png").c_str()), wxBITMAP_TYPE_PNG));
 				auto sizer = new wxBoxSizer(wxHORIZONTAL);
@@ -1023,10 +1023,10 @@ void TabPrinter::build()
 						m_config->opt_int("serial_speed")
 						);
 					if (res && sender->wait_connected()) {
-						show_info(parent, "Connection to printer works correctly.", "Success!");
+						show_info(parent, _L("Connection to printer works correctly."), _L("Success!"));
 					}
 					else {
-						show_error(parent, "Connection failed.");
+						show_error(parent, _L("Connection failed."));
 					}
 				});
 				return sizer;
@@ -1038,10 +1038,10 @@ void TabPrinter::build()
 			optgroup->append_line(line);
 		}
 
-		optgroup = page->new_optgroup("OctoPrint upload");
+		optgroup = page->new_optgroup(_L("OctoPrint upload"));
 		// # append two buttons to the Host line
 		auto octoprint_host_browse = [this] (wxWindow* parent) {
-			auto btn = new wxButton(parent, wxID_ANY, "Browse\u2026", wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
+			auto btn = new wxButton(parent, wxID_ANY, _L("Browse")+"\u2026", wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
 //			btn->SetFont($Slic3r::GUI::small_font);
 			btn->SetBitmap(wxBitmap(wxString::FromUTF8(Slic3r::var("zoom.png").c_str()), wxBITMAP_TYPE_PNG));
 			auto sizer = new wxBoxSizer(wxHORIZONTAL);
@@ -1053,7 +1053,7 @@ void TabPrinter::build()
 			btn->Bind(wxEVT_BUTTON, [this, parent](wxCommandEvent e){
 				if (m_event_button_browse > 0){
 					wxCommandEvent event(m_event_button_browse);
-					event.SetString("Button BROWSE was clicked!");
+					event.SetString(_L("Button BROWSE was clicked!"));
 					g_wxMainFrame->ProcessWindowEvent(event);
 				}
 // 				// # look for devices
@@ -1078,7 +1078,7 @@ void TabPrinter::build()
 		};
 
 		auto octoprint_host_test = [this](wxWindow* parent) {
-			auto btn = m_octoprint_host_test_btn = new wxButton(parent, wxID_ANY, "Test", 
+			auto btn = m_octoprint_host_test_btn = new wxButton(parent, wxID_ANY, _L("Test"), 
 				wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
 //			btn->SetFont($Slic3r::GUI::small_font);
 			btn->SetBitmap(wxBitmap(wxString::FromUTF8(Slic3r::var("wrench.png").c_str()), wxBITMAP_TYPE_PNG));
@@ -1088,7 +1088,7 @@ void TabPrinter::build()
 			btn->Bind(wxEVT_BUTTON, [this, parent](wxCommandEvent e) {
 				if (m_event_button_test > 0){
 					wxCommandEvent event(m_event_button_test);
-					event.SetString("Button TEST was clicked!");
+					event.SetString(_L("Button TEST was clicked!"));
 					g_wxMainFrame->ProcessWindowEvent(event);
 				}
 // 				my $ua = LWP::UserAgent->new;
@@ -1116,54 +1116,54 @@ void TabPrinter::build()
 		optgroup->append_line(host_line);
 		optgroup->append_single_option_line("octoprint_apikey");
 
-		optgroup = page->new_optgroup("Firmware");
+		optgroup = page->new_optgroup(_L("Firmware"));
 		optgroup->append_single_option_line("gcode_flavor");
 
-		optgroup = page->new_optgroup("Advanced");
+		optgroup = page->new_optgroup(_L("Advanced"));
 		optgroup->append_single_option_line("use_relative_e_distances");
 		optgroup->append_single_option_line("use_firmware_retraction");
 		optgroup->append_single_option_line("use_volumetric_e");
 		optgroup->append_single_option_line("variable_layer_height");
 
-	page = add_options_page("Custom G-code", "cog.png");
-		optgroup = page->new_optgroup("Start G-code", 0);
+	page = add_options_page(_L("Custom G-code"), "cog.png");
+		optgroup = page->new_optgroup(_L("Start G-code"), 0);
 		option = optgroup->get_option("start_gcode");
 		option.opt.full_width = true;
 		option.opt.height = 150;
 		optgroup->append_single_option_line(option);
 
-		optgroup = page->new_optgroup("End G-code", 0);
+		optgroup = page->new_optgroup(_L("End G-code"), 0);
 		option = optgroup->get_option("end_gcode");
 		option.opt.full_width = true;
 		option.opt.height = 150;
 		optgroup->append_single_option_line(option);
 
-		optgroup = page->new_optgroup("Before layer change G-code", 0);
+		optgroup = page->new_optgroup(_L("Before layer change G-code"), 0);
 		option = optgroup->get_option("before_layer_gcode");
 		option.opt.full_width = true;
 		option.opt.height = 150;
 		optgroup->append_single_option_line(option);
 
-		optgroup = page->new_optgroup("After layer change G-code", 0);
+		optgroup = page->new_optgroup(_L("After layer change G-code"), 0);
 		option = optgroup->get_option("layer_gcode");
 		option.opt.full_width = true;
 		option.opt.height = 150;
 		optgroup->append_single_option_line(option);
 
-		optgroup = page->new_optgroup("Tool change G-code", 0);
+		optgroup = page->new_optgroup(_L("Tool change G-code"), 0);
 		option = optgroup->get_option("toolchange_gcode");
 		option.opt.full_width = true;
 		option.opt.height = 150;
 		optgroup->append_single_option_line(option);
 
-		optgroup = page->new_optgroup("Between objects G-code (for sequential printing)", 0);
+		optgroup = page->new_optgroup(_L("Between objects G-code (for sequential printing)"), 0);
 		option = optgroup->get_option("between_objects_gcode");
 		option.opt.full_width = true;
 		option.opt.height = 150;
 		optgroup->append_single_option_line(option);
 	
-	page = add_options_page("Notes", "note.png");
-		optgroup = page->new_optgroup("Notes", 0);
+	page = add_options_page(_L("Notes"), "note.png");
+		optgroup = page->new_optgroup(_L("Notes"), 0);
 		option = optgroup->get_option("printer_notes");
 		option.opt.full_width = true;
 		option.opt.height = 250;
@@ -1192,24 +1192,24 @@ void TabPrinter::extruders_count_changed(size_t extruders_count){
 void TabPrinter::build_extruder_pages(){
 	for (auto extruder_idx = m_extruder_pages.size()/*0*/; extruder_idx < m_extruders_count; ++extruder_idx){
 		//# build page
-		auto page = add_options_page("Extruder " + wxString::Format(_T("%i"), extruder_idx + 1), "funnel.png", true);
+		auto page = add_options_page(_L("Extruder ") + wxString::Format(_T("%i"), extruder_idx + 1), "funnel.png", true);
 		m_extruder_pages.push_back(page);
 			
-			auto optgroup = page->new_optgroup("Size");
+			auto optgroup = page->new_optgroup(_L("Size"));
 			optgroup->append_single_option_line("nozzle_diameter", extruder_idx);
 		
-			optgroup = page->new_optgroup("Layer height limits");
+			optgroup = page->new_optgroup(_L("Layer height limits"));
 			optgroup->append_single_option_line("min_layer_height", extruder_idx);
 			optgroup->append_single_option_line("max_layer_height", extruder_idx);
 				
 		
-			optgroup = page->new_optgroup("Position (for multi-extruder printers)");
+			optgroup = page->new_optgroup(_L("Position (for multi-extruder printers)"));
 			optgroup->append_single_option_line("extruder_offset", extruder_idx);
 		
-			optgroup = page->new_optgroup("Retraction");
+			optgroup = page->new_optgroup(_L("Retraction"));
 			optgroup->append_single_option_line("retract_length", extruder_idx);
 			optgroup->append_single_option_line("retract_lift", extruder_idx);
-				Line line = { "Only lift Z", "" };
+				Line line = { _L("Only lift Z"), "" };
 				line.append_option(optgroup->get_option("retract_lift_above", extruder_idx));
 				line.append_option(optgroup->get_option("retract_lift_below", extruder_idx));
 				optgroup->append_line(line);
@@ -1222,11 +1222,11 @@ void TabPrinter::build_extruder_pages(){
 			optgroup->append_single_option_line("wipe", extruder_idx);
 			optgroup->append_single_option_line("retract_before_wipe", extruder_idx);
 	
-			optgroup = page->new_optgroup("Retraction when tool is disabled (advanced settings for multi-extruder setups)");
+			optgroup = page->new_optgroup(_L("Retraction when tool is disabled (advanced settings for multi-extruder setups)"));
 			optgroup->append_single_option_line("retract_length_toolchange", extruder_idx);
 			optgroup->append_single_option_line("retract_restart_extra_toolchange", extruder_idx);
 
-			optgroup = page->new_optgroup("Preview");
+			optgroup = page->new_optgroup(_L("Preview"));
 			optgroup->append_single_option_line("extruder_colour", extruder_idx);
 	}
  
@@ -1317,9 +1317,9 @@ void TabPrinter::update(){
 
 		if (use_firmware_retraction && wipe) {
 			auto dialog = new wxMessageDialog(parent(),
-				"The Wipe option is not available when using the Firmware Retraction mode.\n"
-				"\nShall I disable it in order to enable Firmware Retraction?",
-				"Firmware Retraction", wxICON_WARNING | wxYES | wxNO);
+				_L("The Wipe option is not available when using the Firmware Retraction mode.\n"
+				"\nShall I disable it in order to enable Firmware Retraction?"),
+				_L("Firmware Retraction"), wxICON_WARNING | wxYES | wxNO);
 
 			DynamicPrintConfig new_conf = *m_config;
 			if (dialog->ShowModal() == wxID_YES) {
@@ -1562,7 +1562,7 @@ void Tab::save_preset(std::string name /*= ""*/)
 			return;
 		name = dlg->get_name();
 		if (name == ""){
-			show_error(this, "The supplied name is empty. It can't be saved.");
+			show_error(this, _L("The supplied name is empty. It can't be saved."));
 			return;
 		}
 	}
@@ -1573,7 +1573,7 @@ void Tab::save_preset(std::string name /*= ""*/)
 	}
 	catch (const std::exception &e)
 	{
-		show_error(this, "Something is wrong. It can't be saved.");
+		show_error(this, _L("Something is wrong. It can't be saved."));
 		return;
 	}
 
@@ -1590,10 +1590,10 @@ void Tab::delete_preset()
 {
 	auto current_preset = m_presets->get_selected_preset();
 	// Don't let the user delete the ' - default - ' configuration.
-	std::string action = current_preset.is_external ? "remove" : "delete";
-	std::string msg = "Are you sure you want to " + action + " the selected preset?";
-	action = current_preset.is_external ? "Remove" : "Delete";
-	std::string title = action + " Preset";
+	wxString action = current_preset.is_external ? _L("remove") : _L("delete");
+	wxString msg = _L("Are you sure you want to ") + action + _L(" the selected preset?");
+	action = current_preset.is_external ? _L("Remove") : _L("Delete");
+	wxString title = action + _L(" Preset");
 	if (current_preset.is_default ||
 		wxID_YES != /*new*/ (wxMessageDialog(parent(), msg, title, wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION)).ShowModal())
 		return;
@@ -1645,8 +1645,8 @@ void Tab::update_ui_from_settings()
 // Return a callback to create a Tab widget to mark the preferences as compatible / incompatible to the current printer.
 wxSizer* Tab::compatible_printers_widget(wxWindow* parent, wxCheckBox** checkbox, wxButton** btn)
 {
-	*checkbox = new wxCheckBox(parent, wxID_ANY, "All");
-	*btn = new wxButton(parent, wxID_ANY, "Set\u2026", wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
+	*checkbox = new wxCheckBox(parent, wxID_ANY, _L("All"));
+	*btn = new wxButton(parent, wxID_ANY, _L("Set")+"\u2026", wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
 
 	(*btn)->SetBitmap(wxBitmap(wxString::FromUTF8(Slic3r::var("printer_empty.png").c_str()), wxBITMAP_TYPE_PNG));
 
@@ -1676,8 +1676,8 @@ wxSizer* Tab::compatible_printers_widget(wxWindow* parent, wxCheckBox** checkbox
 		}
 
 		auto dlg = new wxMultiChoiceDialog(parent,
-		"Select the printers this profile is compatible with.",
-		"Compatible printers",  presets);
+		_L("Select the printers this profile is compatible with."),
+		_L("Compatible printers"),  presets);
 		// # Collect and set indices of printers marked as compatible.
 		wxArrayInt selections;
 		auto *compatible_printers = dynamic_cast<const ConfigOptionStrings*>(m_config->option("compatible_printers"));
@@ -1760,7 +1760,8 @@ ConfigOptionsGroupShp Page::new_optgroup(wxString title, int noncommon_label_wid
 
 void SavePresetWindow::build(wxString title, std::string default_name, std::vector<std::string> &values)
 {
-	auto text = new wxStaticText(this, wxID_ANY, "Save " + title + " as:", wxDefaultPosition, wxDefaultSize);
+	auto text = new wxStaticText(this, wxID_ANY, _L("Save ") + title + _L(" as:"), 
+									wxDefaultPosition, wxDefaultSize);
 	m_combo = new wxComboBox(this, wxID_ANY, wxString::FromUTF8(default_name.c_str()), 
 							wxDefaultPosition, wxDefaultSize, 0, 0, wxTE_PROCESS_ENTER);
 	for (auto value : values)
@@ -1793,10 +1794,10 @@ void SavePresetWindow::accept()
 			}
 		}
 		if (is_unusable_symbol) {
-			show_error(this, "The supplied name is not valid; the following characters are not allowed: <>:/\\|?*\"");
+			show_error(this, _L("The supplied name is not valid; the following characters are not allowed:")+" <>:/\\|?*\"");
 		}
 		else if (m_chosen_name.compare("- default -") == 0) {
-			show_error(this, "The supplied name is not available.");
+			show_error(this, _L("The supplied name is not available."));
 		}
 		else {
 			EndModal(wxID_OK);
diff --git a/xs/src/slic3r/GUI/Tab.hpp b/xs/src/slic3r/GUI/Tab.hpp
index 03cb0ad50..2b030f4da 100644
--- a/xs/src/slic3r/GUI/Tab.hpp
+++ b/xs/src/slic3r/GUI/Tab.hpp
@@ -175,7 +175,7 @@ class TabPrint : public Tab
 public:
 	TabPrint() {}
 	TabPrint(wxNotebook* parent, bool no_controller) : 
-		Tab(parent, "Print Settings", "print", no_controller) {}
+		Tab(parent, _L("Print Settings"), "print", no_controller) {}
 	~TabPrint(){}
 
 	ogStaticText*	m_recommended_thin_wall_thickness_description_line;
@@ -195,7 +195,7 @@ class TabFilament : public Tab
 public:
 	TabFilament() {}
 	TabFilament(wxNotebook* parent, bool no_controller) : 
-		Tab(parent, "Filament Settings", "filament", no_controller) {}
+		Tab(parent, _L("Filament Settings"), "filament", no_controller) {}
 	~TabFilament(){}
 
 	void		build() override;
@@ -221,7 +221,7 @@ public:
 
 	TabPrinter() {}
 	TabPrinter(wxNotebook* parent, bool no_controller, bool is_disabled_btn_browse, bool is_user_agent) :
-		Tab(parent, "Printer Settings", "printer", no_controller),
+		Tab(parent, _L("Printer Settings"), "printer", no_controller),
 		m_is_disabled_button_browse(is_disabled_btn_browse), 
 		m_is_user_agent(is_user_agent) {}
 	~TabPrinter(){}
@@ -241,7 +241,7 @@ public:
 class SavePresetWindow :public wxDialog
 {
 public:
-	SavePresetWindow(wxWindow* parent ) :wxDialog(parent, wxID_ANY, "Save preset"){}
+	SavePresetWindow(wxWindow* parent) :wxDialog(parent, wxID_ANY, _L("Save preset")){}
 	~SavePresetWindow(){}
 
 	std::string		m_chosen_name;