diff --git a/CMakeLists.txt b/CMakeLists.txt index a5286abff..c42ad9f7a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -398,13 +398,27 @@ target_include_directories(cereal INTERFACE include) # l10n set(L10N_DIR "${SLIC3R_RESOURCES_DIR}/localization") -add_custom_target(pot +add_custom_target(gettext_make_pot COMMAND xgettext --keyword=L --keyword=L_CONTEXT:1,2c --keyword=_L_PLURAL:1,2 --add-comments=TRN --from-code=UTF-8 --debug -f "${L10N_DIR}/list.txt" -o "${L10N_DIR}/Slic3r++.pot" WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMENT "Generate pot file from strings in the source tree" ) +add_custom_target(gettext_po_to_mo + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + COMMENT "Generate localization po files (binary) from mo files (texts)" +) +file(GLOB L10N_PO_FILES "${L10N_DIR}/*/PrusaSlicer*.po") +foreach(po_file ${L10N_PO_FILES}) + GET_FILENAME_COMPONENT(po_dir "${po_file}" DIRECTORY) + SET(mo_file "${po_dir}/PrusaSlicer.mo") + add_custom_command( + TARGET gettext_po_to_mo PRE_BUILD + COMMAND msgfmt ARGS -o ${mo_file} ${po_file} + DEPENDS ${po_file} + ) +endforeach() find_package(NLopt 1.4 REQUIRED) diff --git a/resources/localization/es/PrusaSlicer.mo b/resources/localization/es/PrusaSlicer.mo index 17ba9216d..3f0272294 100644 Binary files a/resources/localization/es/PrusaSlicer.mo and b/resources/localization/es/PrusaSlicer.mo differ diff --git a/resources/localization/es/PrusaSlicer_es.po b/resources/localization/es/PrusaSlicer_es.po index ef2db8b67..088ff479b 100644 --- a/resources/localization/es/PrusaSlicer_es.po +++ b/resources/localization/es/PrusaSlicer_es.po @@ -6865,7 +6865,7 @@ msgstr "Textura" #: src/slic3r/GUI/ConfigManipulation.cpp:200 msgid "The %1% infill pattern is not supposed to work at 100%% density." -msgstr "Se supone que el patrón de relleno %1% no funciona a una densidad del 100%." +msgstr "Se supone que el patrón de relleno %1% no funciona a una densidad del 100%%." #: src/slic3r/GUI/FirmwareDialog.cpp:530 #, possible-c-format diff --git a/resources/localization/fr/PrusaSlicer.mo b/resources/localization/fr/PrusaSlicer.mo index 130bda334..f43e20ddb 100644 Binary files a/resources/localization/fr/PrusaSlicer.mo and b/resources/localization/fr/PrusaSlicer.mo differ diff --git a/resources/localization/fr/PrusaSlicer_fr.po b/resources/localization/fr/PrusaSlicer_fr.po index cc796ba74..243fb44e9 100644 --- a/resources/localization/fr/PrusaSlicer_fr.po +++ b/resources/localization/fr/PrusaSlicer_fr.po @@ -7013,7 +7013,7 @@ msgstr "Texture" #: src/slic3r/GUI/ConfigManipulation.cpp:200 msgid "The %1% infill pattern is not supposed to work at 100%% density." -msgstr "Le modèle de remplissage %1% n'est pas censé fonctionner avec une densité de 100%." +msgstr "Le modèle de remplissage %1% n'est pas censé fonctionner avec une densité de 100%%." #: src/slic3r/GUI/FirmwareDialog.cpp:530 #, c-format diff --git a/resources/localization/it/PrusaSlicer.mo b/resources/localization/it/PrusaSlicer.mo index 2f17472a6..be6f9fd44 100644 Binary files a/resources/localization/it/PrusaSlicer.mo and b/resources/localization/it/PrusaSlicer.mo differ diff --git a/resources/localization/it/PrusaSlicer_it.po b/resources/localization/it/PrusaSlicer_it.po index 8cba94768..5d1a965bb 100644 --- a/resources/localization/it/PrusaSlicer_it.po +++ b/resources/localization/it/PrusaSlicer_it.po @@ -6865,7 +6865,7 @@ msgstr "Texture" #: src/slic3r/GUI/ConfigManipulation.cpp:200 msgid "The %1% infill pattern is not supposed to work at 100%% density." -msgstr "La trama di riempimento %1% non è fatta per lavorare con densità al 100%." +msgstr "La trama di riempimento %1% non è fatta per lavorare con densità al 100%%." #: src/slic3r/GUI/FirmwareDialog.cpp:530 #, possible-c-format diff --git a/resources/localization/zh_tw/PrusaSlicer.mo b/resources/localization/zh_tw/PrusaSlicer.mo index 8f51236f7..12b1a17eb 100644 Binary files a/resources/localization/zh_tw/PrusaSlicer.mo and b/resources/localization/zh_tw/PrusaSlicer.mo differ diff --git a/resources/localization/zh_tw/PrusaSlicer_zh_TW.po b/resources/localization/zh_tw/PrusaSlicer_zh_TW.po index 1e7bc4488..ce35bc342 100644 --- a/resources/localization/zh_tw/PrusaSlicer_zh_TW.po +++ b/resources/localization/zh_tw/PrusaSlicer_zh_TW.po @@ -3292,7 +3292,7 @@ msgstr "這個 " #: src/slic3r/GUI/Tab.cpp:1309 #, no-c-format msgid "" -" infill pattern is not supposed to work at 100% density.\n" +" infill pattern is not supposed to work at 100%% density.\n" "\n" "Shall I switch to rectilinear fill pattern?" msgstr "" diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index 3b2720300..c451bb8bf 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,4 +1,5 @@ min_slic3r_version = 2.2.0-alpha0 +1.1.1-alpha2 Bumped up config version, so our in house customer will get updated profiles. 1.1.0 Filament aliases, Creality profiles and other goodies for PrusaSlicer 2.2.0-alpha0 min_slic3r_version = 2.1.1-beta0 1.0.6 Added Prusa MINI profiles diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index 893bef040..ae8962e51 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -8,7 +8,7 @@ technologies = FFF; SLA # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.1.0 +config_version = 1.1.1-alpha2 # Where to get the updates from? config_update_url = changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index bf0fbfa72..06c435809 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -66,9 +66,12 @@ extern std::error_code rename_file(const std::string &from, const std::string &t // Copy a file, adjust the access attributes, so that the target is writable. int copy_file_inner(const std::string &from, const std::string &to); +// Copy file to a temp file first, then rename it to the final file name. +// If with_check is true, then the content of the copied file is compared to the content +// of the source file before renaming. extern int copy_file(const std::string &from, const std::string &to, const bool with_check = false); -// Compares two files, returns 0 if identical. +// Compares two files, returns 0 if identical, -1 if different. extern int check_copy(const std::string& origin, const std::string& copy); // Ignore system and hidden files, which may be created by the DropBox synchronisation process. diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index 2b867c8af..b7155ddc8 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -448,31 +448,45 @@ int copy_file(const std::string &from, const std::string &to, const bool with_ch if (with_check) ret_val = check_copy(from, to_temp); - if (ret_val == 0) - rename_file(to_temp, to); + if (ret_val == 0 && rename_file(to_temp, to)) + ret_val = -1; } return ret_val; } int check_copy(const std::string &origin, const std::string ©) { - std::ifstream f1(origin, std::ifstream::binary | std::ifstream::ate); - std::ifstream f2(copy, std::ifstream::binary | std::ifstream::ate); + std::ifstream f1(origin, std::ifstream::in | std::ifstream::binary | std::ifstream::ate); + std::ifstream f2(copy, std::ifstream::in | std::ifstream::binary | std::ifstream::ate); - if (f1.fail() || f2.fail()) { - return -1; - } + if (f1.fail() || f2.fail()) + return -1; - if (f1.tellg() != f2.tellg()) { - return -1; - } + std::streampos fsize = f1.tellg(); + if (fsize != f2.tellg()) + return -1; f1.seekg(0, std::ifstream::beg); f2.seekg(0, std::ifstream::beg); - bool ident = std::equal(std::istreambuf_iterator(f1.rdbuf()), - std::istreambuf_iterator(), - std::istreambuf_iterator(f2.rdbuf())); - return(ident ? 0 : -1); + + // Compare by reading 8 MiB buffers one at a time. + size_t buffer_size = 8 * 1024 * 1024; + std::vector buffer_origin(buffer_size, 0); + std::vector buffer_copy(buffer_size, 0); + do { + f1.read(buffer_origin.data(), buffer_size); + f2.read(buffer_copy.data(), buffer_size); + std::streampos origin_cnt = f1.gcount(); + std::streampos copy_cnt = f2.gcount(); + if (origin_cnt != copy_cnt || + (origin_cnt > 0 && std::memcmp(buffer_origin.data(), buffer_copy.data(), origin_cnt) != 0)) + // Files are different. + return -1; + fsize -= origin_cnt; + } while (f1.good() && f2.good()); + + // All data has been read and compared equal. + return (f1.eof() && f2.eof() && fsize == 0) ? 0 : -1; } // Ignore system and hidden files, which may be created by the DropBox synchronisation process. diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 458d39860..61fe97277 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -8,6 +8,11 @@ add_library(Catch2 INTERFACE) list (APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules/Catch2) target_include_directories(Catch2 INTERFACE ${CMAKE_CURRENT_LIST_DIR}) add_library(Catch2::Catch2 ALIAS Catch2) +if (APPLE) + # OSX builds targeting OSX 10.9 do not support new std::uncought_exception() + # see https://github.com/catchorg/Catch2/issues/1218 + target_compile_definitions(Catch2 INTERFACE -DCATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) +endif() include(Catch) set(CATCH_EXTRA_ARGS "" CACHE STRING "Extra arguments for catch2 test suites.")