Unified usage of localization macros in slic3r/libslic3r

This commit is contained in:
YuSanka 2023-03-20 10:38:34 +01:00 committed by Lukas Matena
parent 9cb50e6586
commit 19f2a1d9e9
44 changed files with 211 additions and 264 deletions

View File

@ -4,7 +4,6 @@
#include <string_view> #include <string_view>
#include <cassert> #include <cassert>
#define L(s) (s)
namespace Slic3r { namespace Slic3r {

View File

@ -6,9 +6,6 @@
#include <boost/algorithm/string/predicate.hpp> #include <boost/algorithm/string/predicate.hpp>
// Mark string for localization and translate.
#define L(s) Slic3r::I18N::translate(s)
namespace Slic3r { namespace Slic3r {
FlowErrorNegativeSpacing::FlowErrorNegativeSpacing() : FlowErrorNegativeSpacing::FlowErrorNegativeSpacing() :
@ -58,7 +55,7 @@ static inline FlowRole opt_key_to_flow_role(const std::string &opt_key)
static inline void throw_on_missing_variable(const std::string &opt_key, const char *dependent_opt_key) static inline void throw_on_missing_variable(const std::string &opt_key, const char *dependent_opt_key)
{ {
throw FlowErrorMissingVariable((boost::format(L("Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible.")) % opt_key % dependent_opt_key).str()); throw FlowErrorMissingVariable((boost::format(_u8L("Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible.")) % opt_key % dependent_opt_key).str());
} }
// Used to provide hints to the user on default extrusion width values, and to provide reasonable values to the PlaceholderParser. // Used to provide hints to the user on default extrusion width values, and to provide reasonable values to the PlaceholderParser.

View File

@ -296,11 +296,6 @@ bool is_valid_object_type(const std::string& type)
namespace Slic3r { namespace Slic3r {
//! macro used to mark string used at localization,
//! return same string
#define L(s) (s)
#define _(s) Slic3r::I18N::translate(s)
// Base class with error messages management // Base class with error messages management
class _3MF_Base class _3MF_Base
{ {
@ -1875,9 +1870,9 @@ namespace Slic3r {
if (m_curr_metadata_name == SLIC3RPE_3MF_VERSION) { if (m_curr_metadata_name == SLIC3RPE_3MF_VERSION) {
m_version = (unsigned int)atoi(m_curr_characters.c_str()); m_version = (unsigned int)atoi(m_curr_characters.c_str());
if (m_check_version && (m_version > VERSION_3MF_COMPATIBLE)) { if (m_check_version && (m_version > VERSION_3MF_COMPATIBLE)) {
// std::string msg = _(L("The selected 3mf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible.")); // std::string msg = _u8L("The selected 3mf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible.");
// throw version_error(msg.c_str()); // throw version_error(msg.c_str());
const std::string msg = (boost::format(_(L("The selected 3mf file has been saved with a newer version of %1% and is not compatible."))) % std::string(SLIC3R_APP_NAME)).str(); const std::string msg = (boost::format(_u8L("The selected 3mf file has been saved with a newer version of %1% and is not compatible.")) % std::string(SLIC3R_APP_NAME)).str();
throw version_error(msg); throw version_error(msg);
} }
} else if (m_curr_metadata_name == "Application") { } else if (m_curr_metadata_name == "Application") {
@ -1888,15 +1883,15 @@ namespace Slic3r {
} else if (m_curr_metadata_name == SLIC3RPE_FDM_SUPPORTS_PAINTING_VERSION) { } else if (m_curr_metadata_name == SLIC3RPE_FDM_SUPPORTS_PAINTING_VERSION) {
m_fdm_supports_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); m_fdm_supports_painting_version = (unsigned int) atoi(m_curr_characters.c_str());
check_painting_version(m_fdm_supports_painting_version, FDM_SUPPORTS_PAINTING_VERSION, check_painting_version(m_fdm_supports_painting_version, FDM_SUPPORTS_PAINTING_VERSION,
_(L("The selected 3MF contains FDM supports painted object using a newer version of PrusaSlicer and is not compatible."))); _u8L("The selected 3MF contains FDM supports painted object using a newer version of PrusaSlicer and is not compatible."));
} else if (m_curr_metadata_name == SLIC3RPE_SEAM_PAINTING_VERSION) { } else if (m_curr_metadata_name == SLIC3RPE_SEAM_PAINTING_VERSION) {
m_seam_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); m_seam_painting_version = (unsigned int) atoi(m_curr_characters.c_str());
check_painting_version(m_seam_painting_version, SEAM_PAINTING_VERSION, check_painting_version(m_seam_painting_version, SEAM_PAINTING_VERSION,
_(L("The selected 3MF contains seam painted object using a newer version of PrusaSlicer and is not compatible."))); _u8L("The selected 3MF contains seam painted object using a newer version of PrusaSlicer and is not compatible."));
} else if (m_curr_metadata_name == SLIC3RPE_MM_PAINTING_VERSION) { } else if (m_curr_metadata_name == SLIC3RPE_MM_PAINTING_VERSION) {
m_mm_painting_version = (unsigned int) atoi(m_curr_characters.c_str()); m_mm_painting_version = (unsigned int) atoi(m_curr_characters.c_str());
check_painting_version(m_mm_painting_version, MM_PAINTING_VERSION, check_painting_version(m_mm_painting_version, MM_PAINTING_VERSION,
_(L("The selected 3MF contains multi-material painted object using a newer version of PrusaSlicer and is not compatible."))); _u8L("The selected 3MF contains multi-material painted object using a newer version of PrusaSlicer and is not compatible."));
} }
return true; return true;

View File

@ -57,10 +57,6 @@ const char* SLIC3R_CONFIG_TYPE = "slic3rpe_config";
namespace Slic3r namespace Slic3r
{ {
//! macro used to mark string used at localization,
//! return same string
#define L(s) (s)
#define _(s) Slic3r::I18N::translate(s)
struct AMFParserContext struct AMFParserContext
{ {
@ -997,7 +993,7 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi
{ {
// std::string msg = _(L("The selected amf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible.")); // std::string msg = _(L("The selected amf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible."));
// throw Slic3r::FileIOError(msg.c_str()); // throw Slic3r::FileIOError(msg.c_str());
const std::string msg = (boost::format(_(L("The selected amf file has been saved with a newer version of %1% and is not compatible."))) % std::string(SLIC3R_APP_NAME)).str(); const std::string msg = (boost::format(_u8L("The selected amf file has been saved with a newer version of %1% and is not compatible.")) % std::string(SLIC3R_APP_NAME)).str();
throw Slic3r::FileIOError(msg); throw Slic3r::FileIOError(msg);
} }

View File

@ -7,7 +7,6 @@
#include <boost/filesystem/path.hpp> #include <boost/filesystem/path.hpp>
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
constexpr const char * L(const char * str) { return str; }
#include <array> #include <array>
#include <map> #include <map>

View File

@ -71,11 +71,6 @@ using namespace std::literals::string_view_literals;
namespace Slic3r { namespace Slic3r {
//! macro used to mark string used at localization,
//! return same string
#define L(s) (s)
#define _(s) Slic3r::I18N::translate(s)
// Only add a newline in case the current G-code does not end with a newline. // Only add a newline in case the current G-code does not end with a newline.
static inline void check_add_eol(std::string& gcode) static inline void check_add_eol(std::string& gcode)
{ {
@ -487,8 +482,8 @@ GCode::ObjectsLayerToPrint GCode::collect_layers_to_print(const PrintObject& obj
// first layer may result in skirt/brim in the air and maybe other issues. // first layer may result in skirt/brim in the air and maybe other issues.
if (layers_to_print.size() == 1u) { if (layers_to_print.size() == 1u) {
if (!has_extrusions) if (!has_extrusions)
throw Slic3r::SlicingError(_(L("There is an object with no extrusions in the first layer.")) + "\n" + throw Slic3r::SlicingError(_u8L("There is an object with no extrusions in the first layer.") + "\n" +
_(L("Object name")) + ": " + object.model_object()->name); _u8L("Object name") + ": " + object.model_object()->name);
} }
// In case there are extrusions on this layer, check there is a layer to lay it on. // In case there are extrusions on this layer, check there is a layer to lay it on.
@ -518,14 +513,14 @@ GCode::ObjectsLayerToPrint GCode::collect_layers_to_print(const PrintObject& obj
std::string warning; std::string warning;
size_t i = 0; size_t i = 0;
for (i = 0; i < std::min(warning_ranges.size(), size_t(3)); ++i) for (i = 0; i < std::min(warning_ranges.size(), size_t(3)); ++i)
warning += Slic3r::format(_(L("Empty layer between %1% and %2%.")), warning += Slic3r::format(_u8L("Empty layer between %1% and %2%."),
warning_ranges[i].first, warning_ranges[i].second) + "\n"; warning_ranges[i].first, warning_ranges[i].second) + "\n";
if (i < warning_ranges.size()) if (i < warning_ranges.size())
warning += _(L("(Some lines not shown)")) + "\n"; warning += _u8L("(Some lines not shown)") + "\n";
warning += "\n"; warning += "\n";
warning += Slic3r::format(_(L("Object name: %1%")), object.model_object()->name) + "\n\n" warning += Slic3r::format(_u8L("Object name: %1%"), object.model_object()->name) + "\n\n"
+ _(L("Make sure the object is printable. This is usually caused by negligibly small extrusions or by a faulty model. " + _u8L("Make sure the object is printable. This is usually caused by negligibly small extrusions or by a faulty model. "
"Try to repair the model or change its orientation on the bed.")); "Try to repair the model or change its orientation on the bed.");
const_cast<Print*>(object.print())->active_step_add_warning( const_cast<Print*>(object.print())->active_step_add_warning(
PrintStateBase::WarningLevel::CRITICAL, warning); PrintStateBase::WarningLevel::CRITICAL, warning);
@ -655,25 +650,25 @@ namespace DoExport {
}; };
const GCodeConfig& config = print.config(); const GCodeConfig& config = print.config();
check(_(L("Start G-code")), config.start_gcode.value); check(_u8L("Start G-code"), config.start_gcode.value);
if (ret.size() < MAX_TAGS_COUNT) check(_(L("End G-code")), config.end_gcode.value); if (ret.size() < MAX_TAGS_COUNT) check(_u8L("End G-code"), config.end_gcode.value);
if (ret.size() < MAX_TAGS_COUNT) check(_(L("Before layer change G-code")), config.before_layer_gcode.value); if (ret.size() < MAX_TAGS_COUNT) check(_u8L("Before layer change G-code"), config.before_layer_gcode.value);
if (ret.size() < MAX_TAGS_COUNT) check(_(L("After layer change G-code")), config.layer_gcode.value); if (ret.size() < MAX_TAGS_COUNT) check(_u8L("After layer change G-code"), config.layer_gcode.value);
if (ret.size() < MAX_TAGS_COUNT) check(_(L("Tool change G-code")), config.toolchange_gcode.value); if (ret.size() < MAX_TAGS_COUNT) check(_u8L("Tool change G-code"), config.toolchange_gcode.value);
if (ret.size() < MAX_TAGS_COUNT) check(_(L("Between objects G-code (for sequential printing)")), config.between_objects_gcode.value); if (ret.size() < MAX_TAGS_COUNT) check(_u8L("Between objects G-code (for sequential printing)"), config.between_objects_gcode.value);
if (ret.size() < MAX_TAGS_COUNT) check(_(L("Color Change G-code")), config.color_change_gcode.value); if (ret.size() < MAX_TAGS_COUNT) check(_u8L("Color Change G-code"), config.color_change_gcode.value);
if (ret.size() < MAX_TAGS_COUNT) check(_(L("Pause Print G-code")), config.pause_print_gcode.value); if (ret.size() < MAX_TAGS_COUNT) check(_u8L("Pause Print G-code"), config.pause_print_gcode.value);
if (ret.size() < MAX_TAGS_COUNT) check(_(L("Template Custom G-code")), config.template_custom_gcode.value); if (ret.size() < MAX_TAGS_COUNT) check(_u8L("Template Custom G-code"), config.template_custom_gcode.value);
if (ret.size() < MAX_TAGS_COUNT) { if (ret.size() < MAX_TAGS_COUNT) {
for (const std::string& value : config.start_filament_gcode.values) { for (const std::string& value : config.start_filament_gcode.values) {
check(_(L("Filament Start G-code")), value); check(_u8L("Filament Start G-code"), value);
if (ret.size() == MAX_TAGS_COUNT) if (ret.size() == MAX_TAGS_COUNT)
break; break;
} }
} }
if (ret.size() < MAX_TAGS_COUNT) { if (ret.size() < MAX_TAGS_COUNT) {
for (const std::string& value : config.end_filament_gcode.values) { for (const std::string& value : config.end_filament_gcode.values) {
check(_(L("Filament End G-code")), value); check(_u8L("Filament End G-code"), value);
if (ret.size() == MAX_TAGS_COUNT) if (ret.size() == MAX_TAGS_COUNT)
break; break;
} }
@ -681,7 +676,7 @@ namespace DoExport {
if (ret.size() < MAX_TAGS_COUNT) { if (ret.size() < MAX_TAGS_COUNT) {
const CustomGCode::Info& custom_gcode_per_print_z = print.model().custom_gcode_per_print_z; const CustomGCode::Info& custom_gcode_per_print_z = print.model().custom_gcode_per_print_z;
for (const auto& gcode : custom_gcode_per_print_z.gcodes) { for (const auto& gcode : custom_gcode_per_print_z.gcodes) {
check(_(L("Custom G-code")), gcode.extra); check(_u8L("Custom G-code"), gcode.extra);
if (ret.size() == MAX_TAGS_COUNT) if (ret.size() == MAX_TAGS_COUNT)
break; break;
} }
@ -714,9 +709,9 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu
reports += source + ": \"" + keyword + "\"\n"; reports += source + ": \"" + keyword + "\"\n";
} }
print->active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, print->active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL,
_(L("In the custom G-code were found reserved keywords:")) + "\n" + _u8L("In the custom G-code were found reserved keywords:") + "\n" +
reports + reports +
_(L("This may cause problems in g-code visualization and printing time estimation."))); _u8L("This may cause problems in g-code visualization and printing time estimation."));
} }
BOOST_LOG_TRIVIAL(info) << "Exporting G-code..." << log_memory_info(); BOOST_LOG_TRIVIAL(info) << "Exporting G-code..." << log_memory_info();
@ -1111,7 +1106,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
} }
if (initial_extruder_id == static_cast<unsigned int>(-1)) if (initial_extruder_id == static_cast<unsigned int>(-1))
// No object to print was found, cancel the G-code export. // No object to print was found, cancel the G-code export.
throw Slic3r::SlicingError(_(L("No extrusions were generated for objects."))); throw Slic3r::SlicingError(_u8L("No extrusions were generated for objects."));
// We don't allow switching of extruders per layer by Model::custom_gcode_per_print_z in sequential mode. // We don't allow switching of extruders per layer by Model::custom_gcode_per_print_z in sequential mode.
// Use the extruder IDs collected from Regions. // Use the extruder IDs collected from Regions.
this->set_extruders(print.extruders()); this->set_extruders(print.extruders());
@ -1122,7 +1117,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
tool_ordering.assign_custom_gcodes(print); tool_ordering.assign_custom_gcodes(print);
if (tool_ordering.all_extruders().empty()) if (tool_ordering.all_extruders().empty())
// No object to print was found, cancel the G-code export. // No object to print was found, cancel the G-code export.
throw Slic3r::SlicingError(_(L("No extrusions were generated for objects."))); throw Slic3r::SlicingError(_u8L("No extrusions were generated for objects."));
has_wipe_tower = print.has_wipe_tower() && tool_ordering.has_wipe_tower(); has_wipe_tower = print.has_wipe_tower() && tool_ordering.has_wipe_tower();
initial_extruder_id = (has_wipe_tower && ! print.config().single_extruder_multi_material_priming) ? initial_extruder_id = (has_wipe_tower && ! print.config().single_extruder_multi_material_priming) ?
// The priming towers will be skipped. // The priming towers will be skipped.
@ -1316,8 +1311,8 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato
// (See https://github.com/prusa3d/PrusaSlicer/issues/5441.) // (See https://github.com/prusa3d/PrusaSlicer/issues/5441.)
if (overlap) { if (overlap) {
print.active_step_add_warning(PrintStateBase::WarningLevel::CRITICAL, print.active_step_add_warning(PrintStateBase::WarningLevel::CRITICAL,
_(L("Your print is very close to the priming regions. " _u8L("Your print is very close to the priming regions. "
"Make sure there is no collision."))); "Make sure there is no collision."));
} else { } else {
// Just continue printing, no action necessary. // Just continue printing, no action necessary.
} }

View File

@ -185,11 +185,6 @@ static int run_script(const std::string &script, const std::string &gcode, std::
namespace Slic3r { namespace Slic3r {
//! macro used to mark string used at localization,
//! return same string
#define L(s) (s)
#define _(s) Slic3r::I18N::translate(s)
// Run post processing script / scripts if defined. // Run post processing script / scripts if defined.
// Returns true if a post-processing script was executed. // Returns true if a post-processing script was executed.
// Returns false if no post-processing script was defined. // Returns false if no post-processing script was defined.
@ -285,10 +280,10 @@ bool run_post_process_scripts(std::string &src_path, bool make_copy, const std::
throw Slic3r::RuntimeError(msg); throw Slic3r::RuntimeError(msg);
} }
if (! boost::filesystem::exists(gcode_file)) { if (! boost::filesystem::exists(gcode_file)) {
const std::string msg = (boost::format(_(L( const std::string msg = (boost::format(_u8L(
"Post-processing script %1% failed.\n\n" "Post-processing script %1% failed.\n\n"
"The post-processing script is expected to change the G-code file %2% in place, but the G-code file was deleted and likely saved under a new name.\n" "The post-processing script is expected to change the G-code file %2% in place, but the G-code file was deleted and likely saved under a new name.\n"
"Please adjust the post-processing script to change the G-code in place and consult the manual on how to optionally rename the post-processed G-code file.\n"))) "Please adjust the post-processing script to change the G-code in place and consult the manual on how to optionally rename the post-processed G-code file.\n"))
% script % path).str(); % script % path).str();
BOOST_LOG_TRIVIAL(error) << msg; BOOST_LOG_TRIVIAL(error) << msg;
throw Slic3r::RuntimeError(msg); throw Slic3r::RuntimeError(msg);

View File

@ -15,4 +15,11 @@ namespace I18N {
} // namespace Slic3r } // namespace Slic3r
namespace {
const char* L(const char* s) { return s; }
std::string _u8L(const char* s) { return Slic3r::I18N::translate(s); }
std::string _utf8(const char* s) { return Slic3r::I18N::translate(s); }
std::string _utf8(const std::string& s) { return Slic3r::I18N::translate(s); }
}
#endif /* slic3r_I18N_hpp_ */ #endif /* slic3r_I18N_hpp_ */

View File

@ -10,15 +10,6 @@
#include <Windows.h> #include <Windows.h>
#endif /* _MSC_VER */ #endif /* _MSC_VER */
// instead of #include "slic3r/GUI/I18N.hpp" :
#ifndef L
// !!! If you needed to translate some string,
// !!! please use _L(string)
// !!! _() - is a standard wxWidgets macro to translate
// !!! L() is used only for marking localizable string
// !!! It will be used in "xgettext" to create a Locating Message Catalog.
#define L(s) s
#endif /* L */
#include <algorithm> #include <algorithm>
#include <fstream> #include <fstream>

View File

@ -27,8 +27,6 @@
#include <boost/log/trivial.hpp> #include <boost/log/trivial.hpp>
#include <boost/regex.hpp> #include <boost/regex.hpp>
// Mark string for localization and translate.
#define L(s) Slic3r::I18N::translate(s)
namespace Slic3r { namespace Slic3r {
@ -474,20 +472,20 @@ std::string Print::validate(std::string* warning) const
std::vector<unsigned int> extruders = this->extruders(); std::vector<unsigned int> extruders = this->extruders();
if (m_objects.empty()) if (m_objects.empty())
return L("All objects are outside of the print volume."); return _u8L("All objects are outside of the print volume.");
if (extruders.empty()) if (extruders.empty())
return L("The supplied settings will cause an empty print."); return _u8L("The supplied settings will cause an empty print.");
if (m_config.complete_objects) { if (m_config.complete_objects) {
if (! sequential_print_horizontal_clearance_valid(*this)) if (! sequential_print_horizontal_clearance_valid(*this))
return L("Some objects are too close; your extruder will collide with them."); return _u8L("Some objects are too close; your extruder will collide with them.");
if (! sequential_print_vertical_clearance_valid(*this)) if (! sequential_print_vertical_clearance_valid(*this))
return L("Some objects are too tall and cannot be printed without extruder collisions."); return _u8L("Some objects are too tall and cannot be printed without extruder collisions.");
} }
if (m_config.avoid_crossing_perimeters && m_config.avoid_crossing_curled_overhangs) { if (m_config.avoid_crossing_perimeters && m_config.avoid_crossing_curled_overhangs) {
return L("Avoid crossing perimeters option and avoid crossing curled overhangs option cannot be both enabled together."); return _u8L("Avoid crossing perimeters option and avoid crossing curled overhangs option cannot be both enabled together.");
} }
if (m_config.spiral_vase) { if (m_config.spiral_vase) {
@ -496,11 +494,11 @@ std::string Print::validate(std::string* warning) const
total_copies_count += object->instances().size(); total_copies_count += object->instances().size();
// #4043 // #4043
if (total_copies_count > 1 && ! m_config.complete_objects.value) if (total_copies_count > 1 && ! m_config.complete_objects.value)
return L("Only a single object may be printed at a time in Spiral Vase mode. " return _u8L("Only a single object may be printed at a time in Spiral Vase mode. "
"Either remove all but the last object, or enable sequential mode by \"complete_objects\"."); "Either remove all but the last object, or enable sequential mode by \"complete_objects\".");
assert(m_objects.size() == 1); assert(m_objects.size() == 1);
if (m_objects.front()->all_regions().size() > 1) if (m_objects.front()->all_regions().size() > 1)
return L("The Spiral Vase option can only be used when printing single material objects."); return _u8L("The Spiral Vase option can only be used when printing single material objects.");
} }
// Cache of layer height profiles for checking: // Cache of layer height profiles for checking:
@ -524,7 +522,7 @@ std::string Print::validate(std::string* warning) const
//FIXME It is quite expensive to generate object layers just to get the print height! //FIXME It is quite expensive to generate object layers just to get the print height!
if (auto layers = generate_object_layers(print_object.slicing_parameters(), layer_height_profile(print_object_idx)); if (auto layers = generate_object_layers(print_object.slicing_parameters(), layer_height_profile(print_object_idx));
! layers.empty() && layers.back() > this->config().max_print_height + EPSILON) { ! layers.empty() && layers.back() > this->config().max_print_height + EPSILON) {
return L("The print is taller than the maximum allowed height. You might want to reduce the size of your model" return _u8L("The print is taller than the maximum allowed height. You might want to reduce the size of your model"
" or change current print settings and retry."); " or change current print settings and retry.");
} }
} }
@ -541,7 +539,7 @@ std::string Print::validate(std::string* warning) const
print_object.model_object()->has_custom_layering()) { print_object.model_object()->has_custom_layering()) {
if (const std::vector<coordf_t> &layers = layer_height_profile(print_object_idx); ! layers.empty()) if (const std::vector<coordf_t> &layers = layer_height_profile(print_object_idx); ! layers.empty())
if (! check_object_layers_fixed(print_object.slicing_parameters(), layers)) if (! check_object_layers_fixed(print_object.slicing_parameters(), layers))
return L("Variable layer height is not supported with Organic supports."); return _u8L("Variable layer height is not supported with Organic supports.");
} }
if (this->has_wipe_tower() && ! m_objects.empty()) { if (this->has_wipe_tower() && ! m_objects.empty()) {
@ -554,21 +552,21 @@ std::string Print::validate(std::string* warning) const
double filament_diam = m_config.filament_diameter.get_at(extruder_idx); double filament_diam = m_config.filament_diameter.get_at(extruder_idx);
if (nozzle_diam - EPSILON > first_nozzle_diam || nozzle_diam + EPSILON < first_nozzle_diam if (nozzle_diam - EPSILON > first_nozzle_diam || nozzle_diam + EPSILON < first_nozzle_diam
|| std::abs((filament_diam-first_filament_diam)/first_filament_diam) > 0.1) || std::abs((filament_diam-first_filament_diam)/first_filament_diam) > 0.1)
return L("The wipe tower is only supported if all extruders have the same nozzle diameter " return _u8L("The wipe tower is only supported if all extruders have the same nozzle diameter "
"and use filaments of the same diameter."); "and use filaments of the same diameter.");
} }
if (m_config.gcode_flavor != gcfRepRapSprinter && m_config.gcode_flavor != gcfRepRapFirmware && if (m_config.gcode_flavor != gcfRepRapSprinter && m_config.gcode_flavor != gcfRepRapFirmware &&
m_config.gcode_flavor != gcfRepetier && m_config.gcode_flavor != gcfMarlinLegacy && m_config.gcode_flavor != gcfMarlinFirmware) m_config.gcode_flavor != gcfRepetier && m_config.gcode_flavor != gcfMarlinLegacy && m_config.gcode_flavor != gcfMarlinFirmware)
return L("The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors."); return _u8L("The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors.");
if (! m_config.use_relative_e_distances) if (! m_config.use_relative_e_distances)
return L("The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)."); return _u8L("The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1).");
if (m_config.ooze_prevention && m_config.single_extruder_multi_material) if (m_config.ooze_prevention && m_config.single_extruder_multi_material)
return L("Ooze prevention is only supported with the wipe tower when 'single_extruder_multi_material' is off."); return _u8L("Ooze prevention is only supported with the wipe tower when 'single_extruder_multi_material' is off.");
if (m_config.use_volumetric_e) if (m_config.use_volumetric_e)
return L("The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."); return _u8L("The Wipe Tower currently does not support volumetric E (use_volumetric_e=0).");
if (m_config.complete_objects && extruders.size() > 1) if (m_config.complete_objects && extruders.size() > 1)
return L("The Wipe Tower is currently not supported for multimaterial sequential prints."); return _u8L("The Wipe Tower is currently not supported for multimaterial sequential prints.");
if (m_objects.size() > 1) { if (m_objects.size() > 1) {
const SlicingParameters &slicing_params0 = m_objects.front()->slicing_parameters(); const SlicingParameters &slicing_params0 = m_objects.front()->slicing_parameters();
@ -578,14 +576,14 @@ std::string Print::validate(std::string* warning) const
const SlicingParameters &slicing_params = object->slicing_parameters(); const SlicingParameters &slicing_params = object->slicing_parameters();
if (std::abs(slicing_params.first_print_layer_height - slicing_params0.first_print_layer_height) > EPSILON || if (std::abs(slicing_params.first_print_layer_height - slicing_params0.first_print_layer_height) > EPSILON ||
std::abs(slicing_params.layer_height - slicing_params0.layer_height ) > EPSILON) std::abs(slicing_params.layer_height - slicing_params0.layer_height ) > EPSILON)
return L("The Wipe Tower is only supported for multiple objects if they have equal layer heights"); return _u8L("The Wipe Tower is only supported for multiple objects if they have equal layer heights");
if (slicing_params.raft_layers() != slicing_params0.raft_layers()) if (slicing_params.raft_layers() != slicing_params0.raft_layers())
return L("The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers"); return _u8L("The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers");
if (slicing_params0.gap_object_support != slicing_params.gap_object_support || if (slicing_params0.gap_object_support != slicing_params.gap_object_support ||
slicing_params0.gap_support_object != slicing_params.gap_support_object) slicing_params0.gap_support_object != slicing_params.gap_support_object)
return L("The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance"); return _u8L("The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance");
if (! equal_layering(slicing_params, slicing_params0)) if (! equal_layering(slicing_params, slicing_params0))
return L("The Wipe Tower is only supported for multiple objects if they are sliced equally."); return _u8L("The Wipe Tower is only supported for multiple objects if they are sliced equally.");
if (has_custom_layering) { if (has_custom_layering) {
auto &lh = layer_height_profile(i); auto &lh = layer_height_profile(i);
auto &lh_tallest = layer_height_profile(tallest_object_idx); auto &lh_tallest = layer_height_profile(tallest_object_idx);
@ -610,7 +608,7 @@ std::string Print::validate(std::string* warning) const
if (i%2 == 0 && layer_height_profiles[tallest_object_idx][i] > layer_height_profiles[idx_object][layer_height_profiles[idx_object].size() - 2 ]) if (i%2 == 0 && layer_height_profiles[tallest_object_idx][i] > layer_height_profiles[idx_object][layer_height_profiles[idx_object].size() - 2 ])
break; break;
if (std::abs(layer_height_profiles[idx_object][i] - layer_height_profiles[tallest_object_idx][i]) > eps) if (std::abs(layer_height_profiles[idx_object][i] - layer_height_profiles[tallest_object_idx][i]) > eps)
return L("The Wipe tower is only supported if all objects have the same variable layer height"); return _u8L("The Wipe tower is only supported if all objects have the same variable layer height");
++i; ++i;
} }
} }
@ -634,7 +632,7 @@ std::string Print::validate(std::string* warning) const
unsigned int total_extruders_count = m_config.nozzle_diameter.size(); unsigned int total_extruders_count = m_config.nozzle_diameter.size();
for (const auto& extruder_idx : extruders) for (const auto& extruder_idx : extruders)
if ( extruder_idx >= total_extruders_count ) if ( extruder_idx >= total_extruders_count )
return L("One or more object were assigned an extruder that the printer does not have."); return _u8L("One or more object were assigned an extruder that the printer does not have.");
#endif #endif
auto validate_extrusion_width = [/*min_nozzle_diameter,*/ max_nozzle_diameter](const ConfigBase &config, const char *opt_key, double layer_height, std::string &err_msg) -> bool { auto validate_extrusion_width = [/*min_nozzle_diameter,*/ max_nozzle_diameter](const ConfigBase &config, const char *opt_key, double layer_height, std::string &err_msg) -> bool {
@ -647,10 +645,10 @@ std::string Print::validate(std::string* warning) const
if (extrusion_width_min == 0) { if (extrusion_width_min == 0) {
// Default "auto-generated" extrusion width is always valid. // Default "auto-generated" extrusion width is always valid.
} else if (extrusion_width_min <= layer_height) { } else if (extrusion_width_min <= layer_height) {
err_msg = (boost::format(L("%1%=%2% mm is too low to be printable at a layer height %3% mm")) % opt_key % extrusion_width_min % layer_height).str(); err_msg = (boost::format(_u8L("%1%=%2% mm is too low to be printable at a layer height %3% mm")) % opt_key % extrusion_width_min % layer_height).str();
return false; return false;
} else if (extrusion_width_max >= max_nozzle_diameter * 3.) { } else if (extrusion_width_max >= max_nozzle_diameter * 3.) {
err_msg = (boost::format(L("Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm")) % opt_key % extrusion_width_max % max_nozzle_diameter).str(); err_msg = (boost::format(_u8L("Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm")) % opt_key % extrusion_width_max % max_nozzle_diameter).str();
return false; return false;
} }
return true; return true;
@ -661,7 +659,7 @@ std::string Print::validate(std::string* warning) const
// The object has some form of support and either support_material_extruder or support_material_interface_extruder // The object has some form of support and either support_material_extruder or support_material_interface_extruder
// will be printed with the current tool without a forced tool change. Play safe, assert that all object nozzles // will be printed with the current tool without a forced tool change. Play safe, assert that all object nozzles
// are of the same diameter. // are of the same diameter.
return L("Printing with multiple extruders of differing nozzle diameters. " return _u8L("Printing with multiple extruders of differing nozzle diameters. "
"If support is to be printed with the current extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), " "If support is to be printed with the current extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), "
"all nozzles have to be of the same diameter."); "all nozzles have to be of the same diameter.");
} }
@ -669,11 +667,11 @@ std::string Print::validate(std::string* warning) const
if (object->config().support_material_contact_distance == 0) { if (object->config().support_material_contact_distance == 0) {
// Soluble interface // Soluble interface
if (! object->config().support_material_synchronize_layers) if (! object->config().support_material_synchronize_layers)
return L("For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers."); return _u8L("For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers.");
} else { } else {
// Non-soluble interface // Non-soluble interface
if (object->config().support_material_extruder != 0 || object->config().support_material_interface_extruder != 0) if (object->config().support_material_extruder != 0 || object->config().support_material_interface_extruder != 0)
return L("The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. " return _u8L("The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. "
"(both support_material_extruder and support_material_interface_extruder need to be set to 0)."); "(both support_material_extruder and support_material_interface_extruder need to be set to 0).");
} }
} }
@ -709,12 +707,12 @@ std::string Print::validate(std::string* warning) const
first_layer_min_nozzle_diameter = min_nozzle_diameter; first_layer_min_nozzle_diameter = min_nozzle_diameter;
} }
if (first_layer_height > first_layer_min_nozzle_diameter) if (first_layer_height > first_layer_min_nozzle_diameter)
return L("First layer height can't be greater than nozzle diameter"); return _u8L("First layer height can't be greater than nozzle diameter");
// validate layer_height // validate layer_height
double layer_height = object->config().layer_height.value; double layer_height = object->config().layer_height.value;
if (layer_height > min_nozzle_diameter) if (layer_height > min_nozzle_diameter)
return L("Layer height can't be greater than nozzle diameter"); return _u8L("Layer height can't be greater than nozzle diameter");
// Validate extrusion widths. // Validate extrusion widths.
std::string err_msg; std::string err_msg;
@ -735,11 +733,11 @@ std::string Print::validate(std::string* warning) const
// See GH issues #6336 #5073 // See GH issues #6336 #5073
if ((m_config.gcode_flavor == gcfMarlinLegacy || m_config.gcode_flavor == gcfMarlinFirmware) && if ((m_config.gcode_flavor == gcfMarlinLegacy || m_config.gcode_flavor == gcfMarlinFirmware) &&
! before_layer_gcode_resets_extruder && ! layer_gcode_resets_extruder) ! before_layer_gcode_resets_extruder && ! layer_gcode_resets_extruder)
return L("Relative extruder addressing requires resetting the extruder position at each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to layer_gcode."); return _u8L("Relative extruder addressing requires resetting the extruder position at each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to layer_gcode.");
} else if (before_layer_gcode_resets_extruder) } else if (before_layer_gcode_resets_extruder)
return L("\"G92 E0\" was found in before_layer_gcode, which is incompatible with absolute extruder addressing."); return _u8L("\"G92 E0\" was found in before_layer_gcode, which is incompatible with absolute extruder addressing.");
else if (layer_gcode_resets_extruder) else if (layer_gcode_resets_extruder)
return L("\"G92 E0\" was found in layer_gcode, which is incompatible with absolute extruder addressing."); return _u8L("\"G92 E0\" was found in layer_gcode, which is incompatible with absolute extruder addressing.");
} }
return std::string(); return std::string();
@ -881,7 +879,7 @@ void Print::process()
BOOST_LOG_TRIVIAL(info) << "Starting the slicing process." << log_memory_info(); BOOST_LOG_TRIVIAL(info) << "Starting the slicing process." << log_memory_info();
for (PrintObject *obj : m_objects) for (PrintObject *obj : m_objects)
obj->make_perimeters(); obj->make_perimeters();
this->set_status(70, L("Infilling layers")); this->set_status(70, _u8L("Infilling layers"));
for (PrintObject *obj : m_objects) for (PrintObject *obj : m_objects)
obj->infill(); obj->infill();
for (PrintObject *obj : m_objects) for (PrintObject *obj : m_objects)
@ -898,7 +896,7 @@ void Print::process()
m_wipe_tower_data.clear(); m_wipe_tower_data.clear();
m_tool_ordering.clear(); m_tool_ordering.clear();
if (this->has_wipe_tower()) { if (this->has_wipe_tower()) {
//this->set_status(95, L("Generating wipe tower")); //this->set_status(95, _u8L("Generating wipe tower"));
this->_make_wipe_tower(); this->_make_wipe_tower();
} else if (! this->config().complete_objects.value) { } else if (! this->config().complete_objects.value) {
// Initialize the tool ordering, so it could be used by the G-code preview slider for planning tool changes and filament switches. // Initialize the tool ordering, so it could be used by the G-code preview slider for planning tool changes and filament switches.
@ -909,7 +907,7 @@ void Print::process()
this->set_done(psWipeTower); this->set_done(psWipeTower);
} }
if (this->set_started(psSkirtBrim)) { if (this->set_started(psSkirtBrim)) {
this->set_status(88, L("Generating skirt and brim")); this->set_status(88, _u8L("Generating skirt and brim"));
m_skirt.clear(); m_skirt.clear();
m_skirt_convex_hull.clear(); m_skirt_convex_hull.clear();
@ -957,11 +955,11 @@ std::string Print::export_gcode(const std::string& path_template, GCodeProcessor
std::string message; std::string message;
if (!path.empty() && result == nullptr) { if (!path.empty() && result == nullptr) {
// Only show the path if preview_data is not set -> running from command line. // Only show the path if preview_data is not set -> running from command line.
message = L("Exporting G-code"); message = _u8L("Exporting G-code");
message += " to "; message += " to ";
message += path; message += path;
} else } else
message = L("Generating G-code"); message = _u8L("Generating G-code");
this->set_status(90, message); this->set_status(90, message);
// Create GCode on heap, it has quite a lot of data. // Create GCode on heap, it has quite a lot of data.
@ -1181,30 +1179,30 @@ void Print::alert_when_supports_needed()
{ {
if (this->set_started(psAlertWhenSupportsNeeded)) { if (this->set_started(psAlertWhenSupportsNeeded)) {
BOOST_LOG_TRIVIAL(debug) << "psAlertWhenSupportsNeeded - start"; BOOST_LOG_TRIVIAL(debug) << "psAlertWhenSupportsNeeded - start";
set_status(69, L("Alert if supports needed")); set_status(69, _u8L("Alert if supports needed"));
auto issue_to_alert_message = [](SupportSpotsGenerator::SupportPointCause cause, bool critical) { auto issue_to_alert_message = [](SupportSpotsGenerator::SupportPointCause cause, bool critical) {
std::string message; std::string message;
switch (cause) { switch (cause) {
//TRN Alert when support is needed. Describes that the model has long bridging extrusions which may print badly //TRN Alert when support is needed. Describes that the model has long bridging extrusions which may print badly
case SupportSpotsGenerator::SupportPointCause::LongBridge: message = L("Long bridging extrusions"); break; case SupportSpotsGenerator::SupportPointCause::LongBridge: message = _u8L("Long bridging extrusions"); break;
//TRN Alert when support is needed. Describes bridge anchors/turns in the air, which will definitely print badly //TRN Alert when support is needed. Describes bridge anchors/turns in the air, which will definitely print badly
case SupportSpotsGenerator::SupportPointCause::FloatingBridgeAnchor: message = L("Floating bridge anchors"); break; case SupportSpotsGenerator::SupportPointCause::FloatingBridgeAnchor: message = _u8L("Floating bridge anchors"); break;
case SupportSpotsGenerator::SupportPointCause::FloatingExtrusion: case SupportSpotsGenerator::SupportPointCause::FloatingExtrusion:
if (critical) { if (critical) {
//TRN Alert when support is needed. Describes that the print has large overhang area which will print badly or not print at all. //TRN Alert when support is needed. Describes that the print has large overhang area which will print badly or not print at all.
message = L("Collapsing overhang"); message = _u8L("Collapsing overhang");
} else { } else {
//TRN Alert when support is needed. Describes extrusions that are not supported enough and come out curled or loose. //TRN Alert when support is needed. Describes extrusions that are not supported enough and come out curled or loose.
message = L("Loose extrusions"); message = _u8L("Loose extrusions");
} }
break; break;
//TRN Alert when support is needed. Describes that the print has low bed adhesion and may became loose. //TRN Alert when support is needed. Describes that the print has low bed adhesion and may became loose.
case SupportSpotsGenerator::SupportPointCause::SeparationFromBed: message = L("Low bed adhesion"); break; case SupportSpotsGenerator::SupportPointCause::SeparationFromBed: message = _u8L("Low bed adhesion"); break;
//TRN Alert when support is needed. Describes that the object has part that is not connected to the bed and will not print at all without supports. //TRN Alert when support is needed. Describes that the object has part that is not connected to the bed and will not print at all without supports.
case SupportSpotsGenerator::SupportPointCause::UnstableFloatingPart: message = L("Floating object part"); break; case SupportSpotsGenerator::SupportPointCause::UnstableFloatingPart: message = _u8L("Floating object part"); break;
//TRN Alert when support is needed. Describes that the object has thin part that may brake during printing //TRN Alert when support is needed. Describes that the object has thin part that may brake during printing
case SupportSpotsGenerator::SupportPointCause::WeakObjectPart: message = L("Thin fragile part"); break; case SupportSpotsGenerator::SupportPointCause::WeakObjectPart: message = _u8L("Thin fragile part"); break;
} }
return message; return message;
@ -1312,13 +1310,13 @@ void Print::alert_when_supports_needed()
} }
lines.push_back(""); lines.push_back("");
lines.push_back(L("Consider enabling supports.")); lines.push_back(_u8L("Consider enabling supports."));
if (recommend_brim) { if (recommend_brim) {
lines.push_back(L("Also consider enabling brim.")); lines.push_back(_u8L("Also consider enabling brim."));
} }
// TRN Alert message for detected print issues. first argument is a list of detected issues. // TRN Alert message for detected print issues. first argument is a list of detected issues.
auto message = Slic3r::format(L("Detected print stability issues:\n%1%"), elements_to_translated_list(lines, multiline_list_rule)); auto message = Slic3r::format(_u8L("Detected print stability issues:\n%1%"), elements_to_translated_list(lines, multiline_list_rule));
if (objects_isssues.size() > 0) { if (objects_isssues.size() > 0) {
this->active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, message); this->active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, message);

View File

@ -6,10 +6,6 @@
#include "I18N.hpp" #include "I18N.hpp"
//! macro used to mark string used at localization,
//! return same string
#define L(s) Slic3r::I18N::translate(s)
namespace Slic3r namespace Slic3r
{ {
@ -81,7 +77,7 @@ std::string PrintBase::output_filename(const std::string &format, const std::str
filename = boost::filesystem::change_extension(filename, default_ext); filename = boost::filesystem::change_extension(filename, default_ext);
return filename.string(); return filename.string();
} catch (std::runtime_error &err) { } catch (std::runtime_error &err) {
throw Slic3r::PlaceholderParserError(L("Failed processing of the output_filename_format template.") + "\n" + err.what()); throw Slic3r::PlaceholderParserError(_u8L("Failed processing of the output_filename_format template.") + "\n" + err.what());
} }
} }

View File

@ -16,11 +16,6 @@
namespace Slic3r { namespace Slic3r {
//! macro used to mark string used at localization,
//! return same string
#define L(s) (s)
#define _(s) Slic3r::I18N::translate(s)
static t_config_enum_names enum_names_from_keys_map(const t_config_enum_values &enum_keys_map) static t_config_enum_names enum_names_from_keys_map(const t_config_enum_values &enum_keys_map)
{ {
t_config_enum_names names; t_config_enum_names names;

View File

@ -56,10 +56,6 @@
using namespace std::literals; using namespace std::literals;
//! macro used to mark string used at localization,
//! return same string
#define L(s) Slic3r::I18N::translate(s)
#ifdef SLIC3R_DEBUG_SLICE_PROCESSING #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
#define SLIC3R_DEBUG #define SLIC3R_DEBUG
#endif #endif
@ -153,7 +149,7 @@ void PrintObject::make_perimeters()
if (! this->set_started(posPerimeters)) if (! this->set_started(posPerimeters))
return; return;
m_print->set_status(20, L("Generating perimeters")); m_print->set_status(20, _u8L("Generating perimeters"));
BOOST_LOG_TRIVIAL(info) << "Generating perimeters..." << log_memory_info(); BOOST_LOG_TRIVIAL(info) << "Generating perimeters..." << log_memory_info();
// Revert the typed slices into untyped slices. // Revert the typed slices into untyped slices.
@ -258,7 +254,7 @@ void PrintObject::prepare_infill()
if (! this->set_started(posPrepareInfill)) if (! this->set_started(posPrepareInfill))
return; return;
m_print->set_status(30, L("Preparing infill")); m_print->set_status(30, _u8L("Preparing infill"));
if (m_typed_slices) { if (m_typed_slices) {
// To improve robustness of detect_surfaces_type() when reslicing (working with typed slices), see GH issue #7442. // To improve robustness of detect_surfaces_type() when reslicing (working with typed slices), see GH issue #7442.
@ -403,7 +399,7 @@ void PrintObject::infill()
this->prepare_infill(); this->prepare_infill();
if (this->set_started(posInfill)) { if (this->set_started(posInfill)) {
m_print->set_status(45, L("making infill")); m_print->set_status(45, _u8L("making infill"));
const auto& adaptive_fill_octree = this->m_adaptive_fill_octrees.first; const auto& adaptive_fill_octree = this->m_adaptive_fill_octrees.first;
const auto& support_fill_octree = this->m_adaptive_fill_octrees.second; const auto& support_fill_octree = this->m_adaptive_fill_octrees.second;
@ -450,7 +446,7 @@ void PrintObject::generate_support_spots()
{ {
if (this->set_started(posSupportSpotsSearch)) { if (this->set_started(posSupportSpotsSearch)) {
BOOST_LOG_TRIVIAL(debug) << "Searching support spots - start"; BOOST_LOG_TRIVIAL(debug) << "Searching support spots - start";
m_print->set_status(65, L("Searching support spots")); m_print->set_status(65, _u8L("Searching support spots"));
if (!this->shared_regions()->generated_support_points.has_value()) { if (!this->shared_regions()->generated_support_points.has_value()) {
PrintTryCancel cancel_func = m_print->make_try_cancel(); PrintTryCancel cancel_func = m_print->make_try_cancel();
SupportSpotsGenerator::Params params{this->print()->m_config.filament_type.values, SupportSpotsGenerator::Params params{this->print()->m_config.filament_type.values,
@ -475,7 +471,7 @@ void PrintObject::generate_support_material()
if (this->set_started(posSupportMaterial)) { if (this->set_started(posSupportMaterial)) {
this->clear_support_layers(); this->clear_support_layers();
if ((this->has_support() && m_layers.size() > 1) || (this->has_raft() && ! m_layers.empty())) { if ((this->has_support() && m_layers.size() > 1) || (this->has_raft() && ! m_layers.empty())) {
m_print->set_status(70, L("Generating support material")); m_print->set_status(70, _u8L("Generating support material"));
this->_generate_support_material(); this->_generate_support_material();
m_print->throw_if_canceled(); m_print->throw_if_canceled();
} else { } else {
@ -496,7 +492,7 @@ void PrintObject::estimate_curled_extrusions()
if (this->set_started(posEstimateCurledExtrusions)) { if (this->set_started(posEstimateCurledExtrusions)) {
if (this->print()->config().avoid_crossing_curled_overhangs) { if (this->print()->config().avoid_crossing_curled_overhangs) {
BOOST_LOG_TRIVIAL(debug) << "Estimating areas with curled extrusions - start"; BOOST_LOG_TRIVIAL(debug) << "Estimating areas with curled extrusions - start";
m_print->set_status(88, L("Estimating curled extrusions")); m_print->set_status(88, _u8L("Estimating curled extrusions"));
// Estimate curling of support material and add it to the malformaition lines of each layer // Estimate curling of support material and add it to the malformaition lines of each layer
float support_flow_width = support_material_flow(this, this->config().layer_height).width(); float support_flow_width = support_material_flow(this, this->config().layer_height).width();

View File

@ -10,8 +10,6 @@
#include <tbb/parallel_for.h> #include <tbb/parallel_for.h>
//! macro used to mark string used at localization, return same string
#define L(s) Slic3r::I18N::translate(s)
namespace Slic3r { namespace Slic3r {
@ -499,7 +497,7 @@ void PrintObject::slice()
{ {
if (! this->set_started(posSlice)) if (! this->set_started(posSlice))
return; return;
m_print->set_status(10, L("Processing triangulated mesh")); m_print->set_status(10, _u8L("Processing triangulated mesh"));
std::vector<coordf_t> layer_height_profile; std::vector<coordf_t> layer_height_profile;
this->update_layer_height_profile(*this->model_object(), m_slicing_params, layer_height_profile); this->update_layer_height_profile(*this->model_object(), m_slicing_params, layer_height_profile);
m_print->throw_if_canceled(); m_print->throw_if_canceled();
@ -733,9 +731,9 @@ void PrintObject::slice_volumes()
if (m_config.xy_size_compensation.value != 0.f) { if (m_config.xy_size_compensation.value != 0.f) {
this->active_step_add_warning( this->active_step_add_warning(
PrintStateBase::WarningLevel::CRITICAL, PrintStateBase::WarningLevel::CRITICAL,
L("An object has enabled XY Size compensation which will not be used because it is also multi-material painted.\nXY Size " _u8L("An object has enabled XY Size compensation which will not be used because it is also multi-material painted.\nXY Size "
"compensation cannot be combined with multi-material painting.") + "compensation cannot be combined with multi-material painting.") +
"\n" + (L("Object name")) + ": " + this->model_object()->name); "\n" + (_u8L("Object name")) + ": " + this->model_object()->name);
} }
BOOST_LOG_TRIVIAL(debug) << "Slicing volumes - MMU segmentation"; BOOST_LOG_TRIVIAL(debug) << "Slicing volumes - MMU segmentation";

View File

@ -23,10 +23,6 @@
#include <libslic3r/MTUtils.hpp> #include <libslic3r/MTUtils.hpp>
#include <libslic3r/I18N.hpp> #include <libslic3r/I18N.hpp>
//! macro used to mark string used at localization,
//! return same string
#define L(s) Slic3r::I18N::translate(s)
namespace Slic3r { namespace Slic3r {
namespace sla { namespace sla {
@ -83,12 +79,12 @@ InteriorPtr generate_interior(const VoxelGrid &vgrid,
auto narrowb = 1.f; // voxel units (voxel count) auto narrowb = 1.f; // voxel units (voxel count)
if (ctl.stopcondition()) return {}; if (ctl.stopcondition()) return {};
else ctl.statuscb(0, L("Hollowing")); else ctl.statuscb(0, _u8L("Hollowing"));
auto gridptr = dilate_grid(vgrid, out_range, in_range); auto gridptr = dilate_grid(vgrid, out_range, in_range);
if (ctl.stopcondition()) return {}; if (ctl.stopcondition()) return {};
else ctl.statuscb(30, L("Hollowing")); else ctl.statuscb(30, _u8L("Hollowing"));
double iso_surface = D; double iso_surface = D;
if (D > EPSILON) { if (D > EPSILON) {
@ -103,7 +99,7 @@ InteriorPtr generate_interior(const VoxelGrid &vgrid,
} }
if (ctl.stopcondition()) return {}; if (ctl.stopcondition()) return {};
else ctl.statuscb(70, L("Hollowing")); else ctl.statuscb(70, _u8L("Hollowing"));
double adaptivity = 0.; double adaptivity = 0.;
InteriorPtr interior = InteriorPtr{new Interior{}}; InteriorPtr interior = InteriorPtr{new Interior{}};
@ -112,7 +108,7 @@ InteriorPtr generate_interior(const VoxelGrid &vgrid,
interior->gridptr = std::move(gridptr); interior->gridptr = std::move(gridptr);
if (ctl.stopcondition()) return {}; if (ctl.stopcondition()) return {};
else ctl.statuscb(100, L("Hollowing")); else ctl.statuscb(100, _u8L("Hollowing"));
interior->iso_surface = iso_surface; interior->iso_surface = iso_surface;
interior->thickness = offset; interior->thickness = offset;

View File

@ -21,9 +21,6 @@
#include "I18N.hpp" #include "I18N.hpp"
#include <boost/log/trivial.hpp> #include <boost/log/trivial.hpp>
//! macro used to mark string used at localization,
//! return same string
#define L(s) Slic3r::I18N::translate(s)
namespace Slic3r { namespace sla { namespace Slic3r { namespace sla {
@ -530,7 +527,7 @@ std::string PadConfig::validate() const
if (brim_size_mm < MIN_BRIM_SIZE_MM || if (brim_size_mm < MIN_BRIM_SIZE_MM ||
bottom_offset() > brim_size_mm + wing_distance() || bottom_offset() > brim_size_mm + wing_distance() ||
get_waffle_offset(*this) <= MIN_BRIM_SIZE_MM) get_waffle_offset(*this) <= MIN_BRIM_SIZE_MM)
return L("Pad brim size is too small for the current configuration."); return _u8L("Pad brim size is too small for the current configuration.");
return ""; return "";
} }

View File

@ -16,13 +16,9 @@
#include <libslic3r/TriangleMeshSlicer.hpp> #include <libslic3r/TriangleMeshSlicer.hpp>
#include <boost/log/trivial.hpp> #include <boost/log/trivial.hpp>
#include <libslic3r/I18N.hpp>
#include <libnest2d/tools/benchmark.h> #include <libnest2d/tools/benchmark.h>
//! macro used to mark string used at localization,
//! return same string
#define L(s) Slic3r::I18N::translate(s)
namespace Slic3r { namespace sla { namespace Slic3r { namespace sla {

View File

@ -23,7 +23,7 @@
//! macro used to mark string used at localization, //! macro used to mark string used at localization,
//! return same string //! return same string
#define L(s) Slic3r::I18N::translate(s) #define _u8L(s) Slic3r::I18N::translate(s)
namespace Slic3r { namespace Slic3r {
@ -543,7 +543,7 @@ std::string SLAPrint::validate(std::string*) const
if(supports_en && if(supports_en &&
mo->sla_points_status == sla::PointsStatus::UserModified && mo->sla_points_status == sla::PointsStatus::UserModified &&
mo->sla_support_points.empty()) mo->sla_support_points.empty())
return L("Cannot proceed without support points! " return _u8L("Cannot proceed without support points! "
"Add support points or disable support generation."); "Add support points or disable support generation.");
sla::SupportTreeConfig cfg = make_support_cfg(po->config()); sla::SupportTreeConfig cfg = make_support_cfg(po->config());
@ -554,13 +554,13 @@ std::string SLAPrint::validate(std::string*) const
sla::PadConfig::EmbedObject &builtinpad = padcfg.embed_object; sla::PadConfig::EmbedObject &builtinpad = padcfg.embed_object;
if(supports_en && !builtinpad.enabled && elv < cfg.head_fullwidth()) if(supports_en && !builtinpad.enabled && elv < cfg.head_fullwidth())
return L( return _u8L(
"Elevation is too low for object. Use the \"Pad around " "Elevation is too low for object. Use the \"Pad around "
"object\" feature to print the object without elevation."); "object\" feature to print the object without elevation.");
if(supports_en && builtinpad.enabled && if(supports_en && builtinpad.enabled &&
cfg.pillar_base_safety_distance_mm < builtinpad.object_gap_mm) { cfg.pillar_base_safety_distance_mm < builtinpad.object_gap_mm) {
return L( return _u8L(
"The endings of the support pillars will be deployed on the " "The endings of the support pillars will be deployed on the "
"gap between the object and the pad. 'Support base safety " "gap between the object and the pad. 'Support base safety "
"distance' has to be greater than the 'Pad object gap' " "distance' has to be greater than the 'Pad object gap' "
@ -576,14 +576,14 @@ std::string SLAPrint::validate(std::string*) const
double expt_cur = m_material_config.exposure_time.getFloat(); double expt_cur = m_material_config.exposure_time.getFloat();
if (expt_cur < expt_min || expt_cur > expt_max) if (expt_cur < expt_min || expt_cur > expt_max)
return L("Exposition time is out of printer profile bounds."); return _u8L("Exposition time is out of printer profile bounds.");
double iexpt_max = m_printer_config.max_initial_exposure_time.getFloat(); double iexpt_max = m_printer_config.max_initial_exposure_time.getFloat();
double iexpt_min = m_printer_config.min_initial_exposure_time.getFloat(); double iexpt_min = m_printer_config.min_initial_exposure_time.getFloat();
double iexpt_cur = m_material_config.initial_exposure_time.getFloat(); double iexpt_cur = m_material_config.initial_exposure_time.getFloat();
if (iexpt_cur < iexpt_min || iexpt_cur > iexpt_max) if (iexpt_cur < iexpt_min || iexpt_cur > iexpt_max)
return L("Initial exposition time is out of printer profile bounds."); return _u8L("Initial exposition time is out of printer profile bounds.");
return ""; return "";
} }
@ -690,7 +690,7 @@ void SLAPrint::process()
} }
// If everything vent well // If everything vent well
m_report_status(*this, 100, L("Slicing done")); m_report_status(*this, 100, _u8L("Slicing done"));
#ifdef SLAPRINT_DO_BENCHMARK #ifdef SLAPRINT_DO_BENCHMARK
std::string csvbenchstr; std::string csvbenchstr;

View File

@ -32,9 +32,6 @@
#include <libnest2d/tools/benchmark.h> #include <libnest2d/tools/benchmark.h>
//! macro used to mark string used at localization,
//! return same string
#define L(s) Slic3r::I18N::translate(s)
namespace Slic3r { namespace Slic3r {
@ -54,14 +51,14 @@ const std::array<unsigned, slaposCount> OBJ_STEP_LEVELS = {
std::string OBJ_STEP_LABELS(size_t idx) std::string OBJ_STEP_LABELS(size_t idx)
{ {
switch (idx) { switch (idx) {
case slaposAssembly: return L("Assembling model from parts"); case slaposAssembly: return _u8L("Assembling model from parts");
case slaposHollowing: return L("Hollowing model"); case slaposHollowing: return _u8L("Hollowing model");
case slaposDrillHoles: return L("Drilling holes into model."); case slaposDrillHoles: return _u8L("Drilling holes into model.");
case slaposObjectSlice: return L("Slicing model"); case slaposObjectSlice: return _u8L("Slicing model");
case slaposSupportPoints: return L("Generating support points"); case slaposSupportPoints: return _u8L("Generating support points");
case slaposSupportTree: return L("Generating support tree"); case slaposSupportTree: return _u8L("Generating support tree");
case slaposPad: return L("Generating pad"); case slaposPad: return _u8L("Generating pad");
case slaposSliceSupports: return L("Slicing supports"); case slaposSliceSupports: return _u8L("Slicing supports");
default:; default:;
} }
assert(false); assert(false);
@ -76,8 +73,8 @@ const std::array<unsigned, slapsCount> PRINT_STEP_LEVELS = {
std::string PRINT_STEP_LABELS(size_t idx) std::string PRINT_STEP_LABELS(size_t idx)
{ {
switch (idx) { switch (idx) {
case slapsMergeSlicesAndEval: return L("Merging slices and calculating statistics"); case slapsMergeSlicesAndEval: return _u8L("Merging slices and calculating statistics");
case slapsRasterize: return L("Rasterizing layers"); case slapsRasterize: return _u8L("Rasterizing layers");
default:; default:;
} }
assert(false); return "Out of bounds!"; assert(false); return "Out of bounds!";
@ -252,14 +249,14 @@ void SLAPrint::Steps::generate_preview(SLAPrintObject &po, SLAPrintObjectStep st
if (ret & static_cast<int>(sla::HollowMeshResult::FaultyMesh)) { if (ret & static_cast<int>(sla::HollowMeshResult::FaultyMesh)) {
po.active_step_add_warning( po.active_step_add_warning(
PrintStateBase::WarningLevel::NON_CRITICAL, PrintStateBase::WarningLevel::NON_CRITICAL,
L("Mesh to be hollowed is not suitable for hollowing (does not " _u8L("Mesh to be hollowed is not suitable for hollowing (does not "
"bound a volume).")); "bound a volume)."));
} }
if (ret & static_cast<int>(sla::HollowMeshResult::FaultyHoles)) { if (ret & static_cast<int>(sla::HollowMeshResult::FaultyHoles)) {
po.active_step_add_warning( po.active_step_add_warning(
PrintStateBase::WarningLevel::NON_CRITICAL, PrintStateBase::WarningLevel::NON_CRITICAL,
L("Unable to drill the current configuration of holes into the " _u8L("Unable to drill the current configuration of holes into the "
"model.")); "model."));
} }
@ -267,7 +264,7 @@ void SLAPrint::Steps::generate_preview(SLAPrintObject &po, SLAPrintObjectStep st
if (ret & static_cast<int>(sla::HollowMeshResult::DrillingFailed)) { if (ret & static_cast<int>(sla::HollowMeshResult::DrillingFailed)) {
po.active_step_add_warning( po.active_step_add_warning(
PrintStateBase::WarningLevel::NON_CRITICAL, L( PrintStateBase::WarningLevel::NON_CRITICAL, _u8L(
"Drilling holes into the mesh failed. " "Drilling holes into the mesh failed. "
"This is usually caused by broken model. Try to fix it first.")); "This is usually caused by broken model. Try to fix it first."));
@ -276,7 +273,7 @@ void SLAPrint::Steps::generate_preview(SLAPrintObject &po, SLAPrintObjectStep st
if (hole_fail) { if (hole_fail) {
po.active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, po.active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL,
L("Failed to drill some holes into the model")); _u8L("Failed to drill some holes into the model"));
handled = false; handled = false;
} }
@ -286,7 +283,7 @@ void SLAPrint::Steps::generate_preview(SLAPrintObject &po, SLAPrintObjectStep st
if (!handled) { // Last resort to voxelization. if (!handled) { // Last resort to voxelization.
po.active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL, po.active_step_add_warning(PrintStateBase::WarningLevel::NON_CRITICAL,
L("Can't perform full mesh booleans! " _u8L("Can't perform full mesh booleans! "
"Some parts of the print will be previewed with approximated meshes. " "Some parts of the print will be previewed with approximated meshes. "
"This does not affect the quality of slices or the physical print in any way.")); "This does not affect the quality of slices or the physical print in any way."));
m = generate_preview_vdb(po, step); m = generate_preview_vdb(po, step);
@ -507,7 +504,7 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po)
if(slindex_it == po.m_slice_index.end()) if(slindex_it == po.m_slice_index.end())
//TRN To be shown at the status bar on SLA slicing error. //TRN To be shown at the status bar on SLA slicing error.
throw Slic3r::RuntimeError( throw Slic3r::RuntimeError(
L("Slicing had to be stopped due to an internal error: " _u8L("Slicing had to be stopped due to an internal error: "
"Inconsistent slice index.")); "Inconsistent slice index."));
po.m_model_height_levels.clear(); po.m_model_height_levels.clear();
@ -688,7 +685,7 @@ void SLAPrint::Steps::support_points(SLAPrintObject &po)
// Using RELOAD_SLA_SUPPORT_POINTS to tell the Plater to pass // Using RELOAD_SLA_SUPPORT_POINTS to tell the Plater to pass
// the update status to GLGizmoSlaSupports // the update status to GLGizmoSlaSupports
report_status(-1, L("Generating support points"), report_status(-1, _u8L("Generating support points"),
SlicingStatus::RELOAD_SLA_SUPPORT_POINTS); SlicingStatus::RELOAD_SLA_SUPPORT_POINTS);
} else { } else {
// There are either some points on the front-end, or the user // There are either some points on the front-end, or the user
@ -737,7 +734,7 @@ void SLAPrint::Steps::support_tree(SLAPrintObject &po)
auto rc = SlicingStatus::RELOAD_SCENE; auto rc = SlicingStatus::RELOAD_SCENE;
// This is to prevent "Done." being displayed during merged_mesh() // This is to prevent "Done." being displayed during merged_mesh()
report_status(-1, L("Visualizing supports")); report_status(-1, _u8L("Visualizing supports"));
BOOST_LOG_TRIVIAL(debug) << "Processed support point count " BOOST_LOG_TRIVIAL(debug) << "Processed support point count "
<< po.m_supportdata->input.pts.size(); << po.m_supportdata->input.pts.size();
@ -746,7 +743,7 @@ void SLAPrint::Steps::support_tree(SLAPrintObject &po)
if(po.support_mesh().empty()) if(po.support_mesh().empty())
BOOST_LOG_TRIVIAL(warning) << "Support mesh is empty"; BOOST_LOG_TRIVIAL(warning) << "Support mesh is empty";
report_status(-1, L("Visualizing supports"), rc); report_status(-1, _u8L("Visualizing supports"), rc);
} }
void SLAPrint::Steps::generate_pad(SLAPrintObject &po) { void SLAPrint::Steps::generate_pad(SLAPrintObject &po) {
@ -776,7 +773,7 @@ void SLAPrint::Steps::generate_pad(SLAPrintObject &po) {
if (!validate_pad(po.m_supportdata->pad_mesh.its, pcfg)) if (!validate_pad(po.m_supportdata->pad_mesh.its, pcfg))
throw Slic3r::SlicingError( throw Slic3r::SlicingError(
L("No pad can be generated for this model with the " _u8L("No pad can be generated for this model with the "
"current configuration")); "current configuration"));
} else if(po.m_supportdata) { } else if(po.m_supportdata) {
@ -784,7 +781,7 @@ void SLAPrint::Steps::generate_pad(SLAPrintObject &po) {
} }
throw_if_canceled(); throw_if_canceled();
report_status(-1, L("Visualizing supports"), SlicingStatus::RELOAD_SCENE); report_status(-1, _u8L("Visualizing supports"), SlicingStatus::RELOAD_SCENE);
} }
// Slicing the support geometries similarly to the model slicing procedure. // Slicing the support geometries similarly to the model slicing procedure.
@ -905,7 +902,7 @@ void SLAPrint::Steps::initialize_printer_input()
for(const SliceRecord& slicerecord : o->get_slice_index()) { for(const SliceRecord& slicerecord : o->get_slice_index()) {
if (!slicerecord.is_valid()) if (!slicerecord.is_valid())
throw Slic3r::SlicingError( throw Slic3r::SlicingError(
L("There are unprintable objects. Try to " _u8L("There are unprintable objects. Try to "
"adjust support settings to make the " "adjust support settings to make the "
"objects printable.")); "objects printable."));

View File

@ -8,7 +8,7 @@
//! macro used to mark string used at localization, //! macro used to mark string used at localization,
//! return same string //! return same string
#define L(s) Slic3r::I18N::translate(s) #define _u8L(s) Slic3r::I18N::translate(s)
#if defined(_MSC_VER) && _MSC_VER <= 1800 || __cplusplus < 201103L #if defined(_MSC_VER) && _MSC_VER <= 1800 || __cplusplus < 201103L
#define SLIC3R_NORETURN #define SLIC3R_NORETURN
@ -24,7 +24,7 @@ public:
std::string formatted_errorstr() const std::string formatted_errorstr() const
{ {
return L("Error with zip archive") + " " + m_zipname + ": " + return _u8L("Error with zip archive") + " " + m_zipname + ": " +
get_errorstr(); get_errorstr();
} }

View File

@ -6,11 +6,7 @@
#include "boost/nowide/cstdio.hpp" #include "boost/nowide/cstdio.hpp"
#endif #endif
#include "I18N.hpp" #include "libslic3r/I18N.hpp"
//! macro used to mark string used at localization,
//! return same string
#define L(s) Slic3r::I18N::translate(s)
namespace Slic3r { namespace Slic3r {
@ -88,67 +84,67 @@ std::string MZ_Archive::get_errorstr(mz_zip_error mz_err)
case MZ_ZIP_NO_ERROR: case MZ_ZIP_NO_ERROR:
return "no error"; return "no error";
case MZ_ZIP_UNDEFINED_ERROR: case MZ_ZIP_UNDEFINED_ERROR:
return L("undefined error"); return _u8L("undefined error");
case MZ_ZIP_TOO_MANY_FILES: case MZ_ZIP_TOO_MANY_FILES:
return L("too many files"); return _u8L("too many files");
case MZ_ZIP_FILE_TOO_LARGE: case MZ_ZIP_FILE_TOO_LARGE:
return L("file too large"); return _u8L("file too large");
case MZ_ZIP_UNSUPPORTED_METHOD: case MZ_ZIP_UNSUPPORTED_METHOD:
return L("unsupported method"); return _u8L("unsupported method");
case MZ_ZIP_UNSUPPORTED_ENCRYPTION: case MZ_ZIP_UNSUPPORTED_ENCRYPTION:
return L("unsupported encryption"); return _u8L("unsupported encryption");
case MZ_ZIP_UNSUPPORTED_FEATURE: case MZ_ZIP_UNSUPPORTED_FEATURE:
return L("unsupported feature"); return _u8L("unsupported feature");
case MZ_ZIP_FAILED_FINDING_CENTRAL_DIR: case MZ_ZIP_FAILED_FINDING_CENTRAL_DIR:
return L("failed finding central directory"); return _u8L("failed finding central directory");
case MZ_ZIP_NOT_AN_ARCHIVE: case MZ_ZIP_NOT_AN_ARCHIVE:
return L("not a ZIP archive"); return _u8L("not a ZIP archive");
case MZ_ZIP_INVALID_HEADER_OR_CORRUPTED: case MZ_ZIP_INVALID_HEADER_OR_CORRUPTED:
return L("invalid header or archive is corrupted"); return _u8L("invalid header or archive is corrupted");
case MZ_ZIP_UNSUPPORTED_MULTIDISK: case MZ_ZIP_UNSUPPORTED_MULTIDISK:
return L("unsupported multidisk archive"); return _u8L("unsupported multidisk archive");
case MZ_ZIP_DECOMPRESSION_FAILED: case MZ_ZIP_DECOMPRESSION_FAILED:
return L("decompression failed or archive is corrupted"); return _u8L("decompression failed or archive is corrupted");
case MZ_ZIP_COMPRESSION_FAILED: case MZ_ZIP_COMPRESSION_FAILED:
return L("compression failed"); return _u8L("compression failed");
case MZ_ZIP_UNEXPECTED_DECOMPRESSED_SIZE: case MZ_ZIP_UNEXPECTED_DECOMPRESSED_SIZE:
return L("unexpected decompressed size"); return _u8L("unexpected decompressed size");
case MZ_ZIP_CRC_CHECK_FAILED: case MZ_ZIP_CRC_CHECK_FAILED:
return L("CRC-32 check failed"); return _u8L("CRC-32 check failed");
case MZ_ZIP_UNSUPPORTED_CDIR_SIZE: case MZ_ZIP_UNSUPPORTED_CDIR_SIZE:
return L("unsupported central directory size"); return _u8L("unsupported central directory size");
case MZ_ZIP_ALLOC_FAILED: case MZ_ZIP_ALLOC_FAILED:
return L("allocation failed"); return _u8L("allocation failed");
case MZ_ZIP_FILE_OPEN_FAILED: case MZ_ZIP_FILE_OPEN_FAILED:
return L("file open failed"); return _u8L("file open failed");
case MZ_ZIP_FILE_CREATE_FAILED: case MZ_ZIP_FILE_CREATE_FAILED:
return L("file create failed"); return _u8L("file create failed");
case MZ_ZIP_FILE_WRITE_FAILED: case MZ_ZIP_FILE_WRITE_FAILED:
return L("file write failed"); return _u8L("file write failed");
case MZ_ZIP_FILE_READ_FAILED: case MZ_ZIP_FILE_READ_FAILED:
return L("file read failed"); return _u8L("file read failed");
case MZ_ZIP_FILE_CLOSE_FAILED: case MZ_ZIP_FILE_CLOSE_FAILED:
return L("file close failed"); return _u8L("file close failed");
case MZ_ZIP_FILE_SEEK_FAILED: case MZ_ZIP_FILE_SEEK_FAILED:
return L("file seek failed"); return _u8L("file seek failed");
case MZ_ZIP_FILE_STAT_FAILED: case MZ_ZIP_FILE_STAT_FAILED:
return L("file stat failed"); return _u8L("file stat failed");
case MZ_ZIP_INVALID_PARAMETER: case MZ_ZIP_INVALID_PARAMETER:
return L("invalid parameter"); return _u8L("invalid parameter");
case MZ_ZIP_INVALID_FILENAME: case MZ_ZIP_INVALID_FILENAME:
return L("invalid filename"); return _u8L("invalid filename");
case MZ_ZIP_BUF_TOO_SMALL: case MZ_ZIP_BUF_TOO_SMALL:
return L("buffer too small"); return _u8L("buffer too small");
case MZ_ZIP_INTERNAL_ERROR: case MZ_ZIP_INTERNAL_ERROR:
return L("internal error"); return _u8L("internal error");
case MZ_ZIP_FILE_NOT_FOUND: case MZ_ZIP_FILE_NOT_FOUND:
return L("file not found"); return _u8L("file not found");
case MZ_ZIP_ARCHIVE_TOO_LARGE: case MZ_ZIP_ARCHIVE_TOO_LARGE:
return L("archive is too large"); return _u8L("archive is too large");
case MZ_ZIP_VALIDATION_FAILED: case MZ_ZIP_VALIDATION_FAILED:
return L("validation failed"); return _u8L("validation failed");
case MZ_ZIP_WRITE_CALLBACK_FAILED: case MZ_ZIP_WRITE_CALLBACK_FAILED:
return L("write calledback failed"); return _u8L("write calledback failed");
default: default:
break; break;
} }

View File

@ -128,6 +128,9 @@ void BedShape::apply_optgroup_values(ConfigOptionsGroupShp optgroup)
} }
} }
BedShapeDialog::BedShapeDialog(wxWindow* parent) : DPIDialog(parent, wxID_ANY, _(L("Bed Shape")),
wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) {}
void BedShapeDialog::build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model) void BedShapeDialog::build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model)
{ {
SetFont(wxGetApp().normal_font()); SetFont(wxGetApp().normal_font());

View File

@ -5,7 +5,6 @@
#include "GUI_Utils.hpp" #include "GUI_Utils.hpp"
#include "2DBed.hpp" #include "2DBed.hpp"
#include "I18N.hpp"
#include <libslic3r/BuildVolume.hpp> #include <libslic3r/BuildVolume.hpp>
@ -93,8 +92,7 @@ class BedShapeDialog : public DPIDialog
{ {
BedShapePanel* m_panel; BedShapePanel* m_panel;
public: public:
BedShapeDialog(wxWindow* parent) : DPIDialog(parent, wxID_ANY, _(L("Bed Shape")), BedShapeDialog(wxWindow* parent);
wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) {}
void build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model); void build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model);

View File

@ -56,6 +56,7 @@
#include "MsgDialog.hpp" #include "MsgDialog.hpp"
#include "UnsavedChangesDialog.hpp" #include "UnsavedChangesDialog.hpp"
#include "slic3r/Utils/AppUpdater.hpp" #include "slic3r/Utils/AppUpdater.hpp"
#include "slic3r/GUI/I18N.hpp"
#if defined(__linux__) && defined(__WXGTK3__) #if defined(__linux__) && defined(__WXGTK3__)
#define wxLinux_gtk3 true #define wxLinux_gtk3 true

View File

@ -5,7 +5,11 @@
#include "GUI_ObjectManipulation.hpp" #include "GUI_ObjectManipulation.hpp"
#include "GUI_Factories.hpp" #include "GUI_Factories.hpp"
#include "format.hpp" #include "format.hpp"
#include "I18N.hpp"
// Localization headers: include libslic3r version first so everything in this file
// uses the slic3r/GUI version (the macros will take precedence over the functions).
#include "libslic3r/I18N.hpp"
#include "slic3r/GUI/I18N.hpp"
#include <algorithm> #include <algorithm>
#include <iterator> #include <iterator>
@ -44,7 +48,6 @@
#include "libslic3r/Utils.hpp" #include "libslic3r/Utils.hpp"
#include "libslic3r/Model.hpp" #include "libslic3r/Model.hpp"
#include "libslic3r/I18N.hpp"
#include "libslic3r/PresetBundle.hpp" #include "libslic3r/PresetBundle.hpp"
#include "libslic3r/Color.hpp" #include "libslic3r/Color.hpp"
@ -2381,8 +2384,8 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
auto local_menu = new wxMenu(); auto local_menu = new wxMenu();
wxWindowID config_id_base = wxWindow::NewControlId(int(ConfigMenuCnt)); wxWindowID config_id_base = wxWindow::NewControlId(int(ConfigMenuCnt));
const auto config_wizard_name = _(ConfigWizard::name(true)); const wxString config_wizard_name = _(ConfigWizard::name(true));
const auto config_wizard_tooltip = from_u8((boost::format(_utf8(L("Run %s"))) % config_wizard_name).str()); const wxString config_wizard_tooltip = from_u8((boost::format(_u8L("Run %s")) % config_wizard_name).str());
// Cmd+, is standard on OS X - what about other operating systems? // Cmd+, is standard on OS X - what about other operating systems?
if (is_editor()) { if (is_editor()) {
local_menu->Append(config_id_base + ConfigMenuWizard, config_wizard_name + dots, config_wizard_tooltip); local_menu->Append(config_id_base + ConfigMenuWizard, config_wizard_name + dots, config_wizard_tooltip);
@ -3461,7 +3464,7 @@ void GUI_App::start_download(std::string url)
//lets always init so if the download dest folder was changed, new dest is used //lets always init so if the download dest folder was changed, new dest is used
boost::filesystem::path dest_folder(app_config->get("url_downloader_dest")); boost::filesystem::path dest_folder(app_config->get("url_downloader_dest"));
if (dest_folder.empty() || !boost::filesystem::is_directory(dest_folder)) { if (dest_folder.empty() || !boost::filesystem::is_directory(dest_folder)) {
std::string msg = _utf8("Could not start URL download. Destination folder is not set. Please choose destination folder in Configuration Wizard."); std::string msg = _u8L("Could not start URL download. Destination folder is not set. Please choose destination folder in Configuration Wizard.");
BOOST_LOG_TRIVIAL(error) << msg; BOOST_LOG_TRIVIAL(error) << msg;
show_error(nullptr, msg); show_error(nullptr, msg);
return; return;

View File

@ -149,15 +149,21 @@ void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color)
GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
: m_parent(parent) : m_parent(parent)
, m_group_id(-1) , m_group_id(-1)
, m_state(Off) , m_state(Off)
, m_shortcut_key(NO_SHORTCUT_KEY_VALUE) , m_shortcut_key(NO_SHORTCUT_KEY_VALUE)
, m_icon_filename(icon_filename) , m_icon_filename(icon_filename)
, m_sprite_id(sprite_id) , m_sprite_id(sprite_id)
, m_imgui(wxGetApp().imgui()) , m_imgui(wxGetApp().imgui())
{ {
} }
std::string GLGizmoBase::get_action_snapshot_name() const
{
return _u8L("Gizmo action");
}
void GLGizmoBase::set_hover_id(int id) void GLGizmoBase::set_hover_id(int id)
{ {
// do not change hover id during dragging // do not change hover id during dragging
@ -351,12 +357,12 @@ void GLGizmoBase::render_input_window(float x, float y, float bottom_limit)
std::string GLGizmoBase::get_name(bool include_shortcut) const std::string GLGizmoBase::get_name(bool include_shortcut) const
{ {
std::string out = on_get_name(); std::string out = on_get_name();
if (!include_shortcut) return out; if (!include_shortcut) return out;
int key = get_shortcut_key(); int key = get_shortcut_key();
assert(key==NO_SHORTCUT_KEY_VALUE || (key >= WXK_CONTROL_A && key <= WXK_CONTROL_Z)); assert(key==NO_SHORTCUT_KEY_VALUE || (key >= WXK_CONTROL_A && key <= WXK_CONTROL_Z));
out += std::string(" [") + char(int('A') + key - int(WXK_CONTROL_A)) + "]"; out += std::string(" [") + char(int('A') + key - int(WXK_CONTROL_A)) + "]";
return out; return out;
} }

View File

@ -4,7 +4,6 @@
#include "libslic3r/Point.hpp" #include "libslic3r/Point.hpp"
#include "libslic3r/Color.hpp" #include "libslic3r/Color.hpp"
#include "slic3r/GUI/I18N.hpp"
#include "slic3r/GUI/GLModel.hpp" #include "slic3r/GUI/GLModel.hpp"
#include "slic3r/GUI/MeshUtils.hpp" #include "slic3r/GUI/MeshUtils.hpp"
#include "slic3r/GUI/SceneRaycaster.hpp" #include "slic3r/GUI/SceneRaycaster.hpp"
@ -150,7 +149,7 @@ public:
virtual bool wants_enter_leave_snapshots() const { return false; } virtual bool wants_enter_leave_snapshots() const { return false; }
virtual std::string get_gizmo_entering_text() const { assert(false); return ""; } virtual std::string get_gizmo_entering_text() const { assert(false); return ""; }
virtual std::string get_gizmo_leaving_text() const { assert(false); return ""; } virtual std::string get_gizmo_leaving_text() const { assert(false); return ""; }
virtual std::string get_action_snapshot_name() { return _u8L("Gizmo action"); } virtual std::string get_action_snapshot_name() const;
void set_common_data_pool(CommonGizmosDataPool* ptr) { m_c = ptr; } void set_common_data_pool(CommonGizmosDataPool* ptr) { m_c = ptr; }
unsigned int get_sprite_id() const { return m_sprite_id; } unsigned int get_sprite_id() const { return m_sprite_id; }

View File

@ -1,4 +1,3 @@
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
#include "GLGizmoCut.hpp" #include "GLGizmoCut.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GLCanvas3D.hpp"

View File

@ -4,6 +4,7 @@
#include "GLGizmoBase.hpp" #include "GLGizmoBase.hpp"
#include "slic3r/GUI/GLSelectionRectangle.hpp" #include "slic3r/GUI/GLSelectionRectangle.hpp"
#include "slic3r/GUI/GLModel.hpp" #include "slic3r/GUI/GLModel.hpp"
#include "slic3r/GUI/I18N.hpp"
#include "libslic3r/TriangleMesh.hpp" #include "libslic3r/TriangleMesh.hpp"
#include "libslic3r/Model.hpp" #include "libslic3r/Model.hpp"
#include "imgui/imgui.h" #include "imgui/imgui.h"
@ -253,7 +254,7 @@ protected:
bool wants_enter_leave_snapshots() const override { return true; } bool wants_enter_leave_snapshots() const override { return true; }
std::string get_gizmo_entering_text() const override { return _u8L("Entering Cut gizmo"); } std::string get_gizmo_entering_text() const override { return _u8L("Entering Cut gizmo"); }
std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Cut gizmo"); } std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Cut gizmo"); }
std::string get_action_snapshot_name() override { return _u8L("Cut gizmo editing"); } std::string get_action_snapshot_name() const override { return _u8L("Cut gizmo editing"); }
void data_changed() override; void data_changed() override;

View File

@ -1,12 +1,11 @@
#ifndef slic3r_GLGizmoEmboss_hpp_ #ifndef slic3r_GLGizmoEmboss_hpp_
#define slic3r_GLGizmoEmboss_hpp_ #define slic3r_GLGizmoEmboss_hpp_
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code,
// which overrides our localization "L" macro.
#include "GLGizmoBase.hpp" #include "GLGizmoBase.hpp"
#include "GLGizmoRotate.hpp" #include "GLGizmoRotate.hpp"
#include "slic3r/GUI/IconManager.hpp" #include "slic3r/GUI/IconManager.hpp"
#include "slic3r/GUI/SurfaceDrag.hpp" #include "slic3r/GUI/SurfaceDrag.hpp"
#include "slic3r/GUI/I18N.hpp"
#include "slic3r/Utils/RaycastManager.hpp" #include "slic3r/Utils/RaycastManager.hpp"
#include "slic3r/Utils/EmbossStyleManager.hpp" #include "slic3r/Utils/EmbossStyleManager.hpp"
@ -76,7 +75,7 @@ protected:
bool wants_enter_leave_snapshots() const override { return true; } bool wants_enter_leave_snapshots() const override { return true; }
std::string get_gizmo_entering_text() const override { return _u8L("Enter emboss gizmo"); } std::string get_gizmo_entering_text() const override { return _u8L("Enter emboss gizmo"); }
std::string get_gizmo_leaving_text() const override { return _u8L("Leave emboss gizmo"); } std::string get_gizmo_leaving_text() const override { return _u8L("Leave emboss gizmo"); }
std::string get_action_snapshot_name() override { return _u8L("Embossing actions"); } std::string get_action_snapshot_name() const override { return _u8L("Embossing actions"); }
private: private:
static EmbossStyles create_default_styles(); static EmbossStyles create_default_styles();
// localized default text // localized default text

View File

@ -3,6 +3,8 @@
#include "GLGizmoPainterBase.hpp" #include "GLGizmoPainterBase.hpp"
#include "slic3r/GUI/I18N.hpp"
namespace Slic3r::GUI { namespace Slic3r::GUI {
class GLGizmoFdmSupports : public GLGizmoPainterBase class GLGizmoFdmSupports : public GLGizmoPainterBase
@ -21,7 +23,7 @@ protected:
std::string get_gizmo_entering_text() const override { return _u8L("Entering Paint-on supports"); } std::string get_gizmo_entering_text() const override { return _u8L("Entering Paint-on supports"); }
std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Paint-on supports"); } std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Paint-on supports"); }
std::string get_action_snapshot_name() override { return _u8L("Paint-on supports editing"); } std::string get_action_snapshot_name() const override { return _u8L("Paint-on supports editing"); }
private: private:

View File

@ -1,4 +1,3 @@
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
#include "GLGizmoFlatten.hpp" #include "GLGizmoFlatten.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GLCanvas3D.hpp"
#include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI_App.hpp"

View File

@ -1,4 +1,3 @@
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
#include "GLGizmoMeasure.hpp" #include "GLGizmoMeasure.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GLCanvas3D.hpp"
#include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI_App.hpp"

View File

@ -5,6 +5,7 @@
#include "slic3r/GUI/GLModel.hpp" #include "slic3r/GUI/GLModel.hpp"
#include "slic3r/GUI/GUI_Utils.hpp" #include "slic3r/GUI/GUI_Utils.hpp"
#include "slic3r/GUI/MeshUtils.hpp" #include "slic3r/GUI/MeshUtils.hpp"
#include "slic3r/GUI/I18N.hpp"
#include "libslic3r/Measure.hpp" #include "libslic3r/Measure.hpp"
#include "libslic3r/Model.hpp" #include "libslic3r/Model.hpp"
@ -162,7 +163,7 @@ public:
bool wants_enter_leave_snapshots() const override { return true; } bool wants_enter_leave_snapshots() const override { return true; }
std::string get_gizmo_entering_text() const override { return _u8L("Entering Measure gizmo"); } std::string get_gizmo_entering_text() const override { return _u8L("Entering Measure gizmo"); }
std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Measure gizmo"); } std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Measure gizmo"); }
std::string get_action_snapshot_name() override { return _u8L("Measure gizmo editing"); } std::string get_action_snapshot_name() const override { return _u8L("Measure gizmo editing"); }
protected: protected:
bool on_init() override; bool on_init() override;

View File

@ -3,6 +3,8 @@
#include "GLGizmoPainterBase.hpp" #include "GLGizmoPainterBase.hpp"
#include "slic3r/GUI/I18N.hpp"
namespace Slic3r::GUI { namespace Slic3r::GUI {
class GLMmSegmentationGizmo3DScene class GLMmSegmentationGizmo3DScene
@ -117,7 +119,7 @@ protected:
std::string get_gizmo_entering_text() const override { return _u8L("Entering Multimaterial painting"); } std::string get_gizmo_entering_text() const override { return _u8L("Entering Multimaterial painting"); }
std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Multimaterial painting"); } std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Multimaterial painting"); }
std::string get_action_snapshot_name() override { return _u8L("Multimaterial painting editing"); } std::string get_action_snapshot_name() const override { return _u8L("Multimaterial painting editing"); }
size_t m_first_selected_extruder_idx = 0; size_t m_first_selected_extruder_idx = 0;
size_t m_second_selected_extruder_idx = 1; size_t m_second_selected_extruder_idx = 1;

View File

@ -1,4 +1,3 @@
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
#include "GLGizmoMove.hpp" #include "GLGizmoMove.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GLCanvas3D.hpp"
#include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI_App.hpp"

View File

@ -1,4 +1,3 @@
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
#include "GLGizmoPainterBase.hpp" #include "GLGizmoPainterBase.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GLCanvas3D.hpp"
#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" #include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp"

View File

@ -1,4 +1,3 @@
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
#include "GLGizmoRotate.hpp" #include "GLGizmoRotate.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GLCanvas3D.hpp"
#include "slic3r/GUI/ImGuiWrapper.hpp" #include "slic3r/GUI/ImGuiWrapper.hpp"

View File

@ -1,4 +1,3 @@
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
#include "GLGizmoScale.hpp" #include "GLGizmoScale.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GLCanvas3D.hpp"
#include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI_App.hpp"

View File

@ -3,6 +3,8 @@
#include "GLGizmoPainterBase.hpp" #include "GLGizmoPainterBase.hpp"
#include "slic3r/GUI/I18N.hpp"
namespace Slic3r::GUI { namespace Slic3r::GUI {
class GLGizmoSeam : public GLGizmoPainterBase class GLGizmoSeam : public GLGizmoPainterBase
@ -22,7 +24,7 @@ protected:
std::string get_gizmo_entering_text() const override { return _u8L("Entering Seam painting"); } std::string get_gizmo_entering_text() const override { return _u8L("Entering Seam painting"); }
std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Seam painting"); } std::string get_gizmo_leaving_text() const override { return _u8L("Leaving Seam painting"); }
std::string get_action_snapshot_name() override { return _u8L("Paint-on seam editing"); } std::string get_action_snapshot_name() const override { return _u8L("Paint-on seam editing"); }
private: private:
bool on_init() override; bool on_init() override;

View File

@ -1,10 +1,9 @@
#ifndef slic3r_GLGizmoSimplify_hpp_ #ifndef slic3r_GLGizmoSimplify_hpp_
#define slic3r_GLGizmoSimplify_hpp_ #define slic3r_GLGizmoSimplify_hpp_
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code,
// which overrides our localization "L" macro.
#include "GLGizmoBase.hpp" #include "GLGizmoBase.hpp"
#include "slic3r/GUI/3DScene.hpp" #include "slic3r/GUI/3DScene.hpp"
#include "slic3r/GUI/I18N.hpp"
#include "admesh/stl.h" // indexed_triangle_set #include "admesh/stl.h" // indexed_triangle_set
#include <mutex> #include <mutex>
#include <thread> #include <thread>

View File

@ -1,5 +1,4 @@
#include "libslic3r/libslic3r.h" #include "libslic3r/libslic3r.h"
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
#include "GLGizmoSlaSupports.hpp" #include "GLGizmoSlaSupports.hpp"
#include "slic3r/GUI/MainFrame.hpp" #include "slic3r/GUI/MainFrame.hpp"
#include "slic3r/Utils/UndoRedo.hpp" #include "slic3r/Utils/UndoRedo.hpp"

View File

@ -3,6 +3,7 @@
#include "GLGizmoSlaBase.hpp" #include "GLGizmoSlaBase.hpp"
#include "slic3r/GUI/GLSelectionRectangle.hpp" #include "slic3r/GUI/GLSelectionRectangle.hpp"
#include "slic3r/GUI/I18N.hpp"
#include "libslic3r/SLA/SupportPoint.hpp" #include "libslic3r/SLA/SupportPoint.hpp"
#include "libslic3r/ObjectID.hpp" #include "libslic3r/ObjectID.hpp"

View File

@ -11,7 +11,6 @@
#include "libslic3r/PrintConfig.hpp" #include "libslic3r/PrintConfig.hpp"
#include "OptionsGroup.hpp" #include "OptionsGroup.hpp"
#include "I18N.hpp"
// Translate the ifdef // Translate the ifdef
#ifdef __WXOSX__ #ifdef __WXOSX__