mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
Don't translate exception messages
Since they're not translated, they don't need to be logged when they're thrown, either. For most previously-translated exception messages, display a generic "something went wrong" message instead as they're generally pretty unusal and severe errors. There are a few exceptions to this (pun intended): - The masterlist revision / date "N/A" and "Unknown" messages are displayed in the General Information tab, so they've been reimplemented without using the exception message content. - The cyclic interaction error message is now created on catching the CyclicInteractionError exception. - The metadata syntax errors are still displayed in general and plugin messages, so they'll just be displayed in English. This is for consistency with third-party e.what() handling, as they contain technical detail that should be logged but which is (unusually) also useful to display in the UI, because the user can fix the issue there too. Closes #658.
This commit is contained in:
@@ -34,7 +34,28 @@ namespace loot {
|
||||
*/
|
||||
class CyclicInteractionError : public std::runtime_error {
|
||||
public:
|
||||
using std::runtime_error::runtime_error;
|
||||
CyclicInteractionError(const std::string& firstPlugin, const std::string& lastPlugin, const std::string& backCycle) :
|
||||
std::runtime_error("Cyclic interaction detected between plugins \"" + firstPlugin + "\" and \"" + lastPlugin + "\". Back cycle: " + backCycle),
|
||||
firstPlugin_(firstPlugin),
|
||||
lastPlugin_(lastPlugin),
|
||||
backCycle_(backCycle) {}
|
||||
|
||||
std::string getFirstPlugin() {
|
||||
return firstPlugin_;
|
||||
}
|
||||
|
||||
std::string getLastPlugin() {
|
||||
return lastPlugin_;
|
||||
}
|
||||
|
||||
std::string getBackCycle() {
|
||||
return backCycle_;
|
||||
}
|
||||
|
||||
private:
|
||||
const std::string firstPlugin_;
|
||||
const std::string lastPlugin_;
|
||||
const std::string backCycle_;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
+27
-107
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: LOOT 0.10.1\n"
|
||||
"Report-Msgid-Bugs-To: https://github.com/loot/loot/issues\n"
|
||||
"POT-Creation-Date: 2016-11-22 19:39+0000\n"
|
||||
"POT-Creation-Date: 2016-12-14 21:55+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -657,20 +657,35 @@ msgid ""
|
||||
"[LOOT's website](https://loot.github.io/)."
|
||||
msgstr ""
|
||||
|
||||
#: src/gui/query/metadata_query.h:79 src/gui/query/metadata_query.h:80
|
||||
msgid "(edited)"
|
||||
#: src/gui/query/metadata_query.h:90 src/gui/query/metadata_query.h:91
|
||||
msgid "N/A: No masterlist present"
|
||||
msgstr ""
|
||||
|
||||
#: src/gui/query/metadata_query.h:101
|
||||
#: src/gui/query/metadata_query.h:93 src/gui/query/metadata_query.h:94
|
||||
msgid "Unknown: Git repository missing"
|
||||
msgstr ""
|
||||
|
||||
#: src/gui/query/metadata_query.h:117
|
||||
msgid ""
|
||||
"A global message contains a condition that could not be evaluated. Details: "
|
||||
"%1%"
|
||||
msgstr ""
|
||||
|
||||
#: src/gui/query/metadata_query.h:127 src/backend/plugin/plugin_sorter.cpp:219
|
||||
#: src/gui/query/metadata_query.h:143 src/backend/plugin/plugin_sorter.cpp:217
|
||||
msgid "\"%1%\" contains a condition that could not be evaluated. Details: %2%"
|
||||
msgstr ""
|
||||
|
||||
#: src/gui/query/metadata_query.h:174 src/gui/query/metadata_query.h:175
|
||||
msgid "(edited)"
|
||||
msgstr ""
|
||||
|
||||
#: src/gui/query/query.h:40
|
||||
msgid ""
|
||||
"Oh no, something went wrong! If you've enabled debug logging in your "
|
||||
"settings, you can check your LOOTDebugLog.txt (you can get to it through the "
|
||||
"main menu) for more information."
|
||||
msgstr ""
|
||||
|
||||
#: src/gui/query/sort_plugins_query.h:48
|
||||
msgid "Loading plugin contents..."
|
||||
msgstr ""
|
||||
@@ -679,8 +694,10 @@ msgstr ""
|
||||
msgid "Sorting load order..."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/app/loot_paths.cpp:88
|
||||
msgid "Failed to get %LOCALAPPDATA% path."
|
||||
#: src/gui/query/sort_plugins_query.h:83
|
||||
msgid ""
|
||||
"Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: "
|
||||
"%3%"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/app/loot_state.cpp:124
|
||||
@@ -691,108 +708,25 @@ msgstr ""
|
||||
msgid "Error: Settings parsing failed. %1%"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/app/loot_state.cpp:193
|
||||
#: src/backend/app/loot_state.cpp:191
|
||||
msgid "Error: Game-specific settings could not be initialised. %1%"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/app/loot_state.cpp:272
|
||||
msgid "None of the supported games were detected."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/game/game.cpp:64
|
||||
msgid "Game path could not be detected."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/game/game.cpp:74
|
||||
msgid "Could not create LOOT folder for game. Details: %1%"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/game/game_cache.cpp:119
|
||||
msgid "You have not sorted your load order this session."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/game/load_order_handler.cpp:48
|
||||
msgid "Game path is not initialised."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/game/load_order_handler.cpp:84
|
||||
msgid ""
|
||||
"libloadorder failed to create a game handle. Details could not be fetched."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/game/load_order_handler.cpp:87
|
||||
msgid "libloadorder failed to create a game handle. Details: %1%"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/game/load_order_handler.cpp:105
|
||||
msgid ""
|
||||
"libloadorder failed to check if a plugin is active. Details could not be "
|
||||
"fetched."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/game/load_order_handler.cpp:108
|
||||
msgid "libloadorder failed to check if a plugin is active. Details: %1%"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/game/load_order_handler.cpp:130
|
||||
msgid ""
|
||||
"libloadorder failed to get the load order. Details could not be fetched."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/game/load_order_handler.cpp:133
|
||||
msgid "libloadorder failed to get the load order. Details: %1%"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/game/load_order_handler.cpp:170
|
||||
msgid ""
|
||||
"libloadorder failed to set the load order. Details could not be fetched."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/game/load_order_handler.cpp:173
|
||||
msgid "libloadorder failed to set the load order. Details: %1%"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/helpers/git_helper.cpp:105
|
||||
msgid "Git operation failed. Error: %1%"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/helpers/git_helper.cpp:146
|
||||
#: src/backend/helpers/git_helper.cpp:145
|
||||
msgid ""
|
||||
"An error occurred while trying to clone the remote masterlist repository."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/helpers/git_helper.cpp:195
|
||||
#: src/backend/helpers/git_helper.cpp:194
|
||||
msgid ""
|
||||
"An error occurred while trying to update the masterlist. This could be due "
|
||||
"to a server-side error. Try again in a few minutes."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/helpers/helpers.cpp:81
|
||||
msgid "Unable to open \"%1%\" for CRC calculation."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/helpers/helpers.cpp:103 src/backend/helpers/helpers.cpp:106
|
||||
msgid "Failed to open file in its default application."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/metadata/condition_evaluator.cpp:173
|
||||
msgid "Invalid file path: %1%"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/metadata/condition_evaluator.cpp:183
|
||||
#: src/backend/metadata/condition_evaluator.cpp:223
|
||||
msgid "Invalid regex string \"%1%\": %2%"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/metadata/condition_grammar.h:203
|
||||
msgid "Failed to parse condition \"%1%\": expected \"%2%\" at \"%3%\"."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/metadata/conditional_metadata.cpp:91
|
||||
msgid ""
|
||||
"Failed to parse condition \"%1%\": only partially matched expected syntax."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/metadata/plugin_cleaning_data.cpp:89
|
||||
msgid "%1% ITM record"
|
||||
msgid_plural "%1% ITM records"
|
||||
@@ -847,26 +781,12 @@ msgstr ""
|
||||
msgid "This plugin is incompatible with \"%1%\", but both are present."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/plugin/plugin_sorter.cpp:84
|
||||
msgid ""
|
||||
"Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: "
|
||||
"%3%"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/masterlist.cpp:45
|
||||
msgid ""
|
||||
"An error occurred while trying to read the local masterlist's version. If "
|
||||
"this error happens again, try deleting the \".git\" folder in %1%."
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/masterlist.cpp:49
|
||||
msgid "N/A: No masterlist present"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/masterlist.cpp:52
|
||||
msgid "Unknown: Git repository missing"
|
||||
msgstr ""
|
||||
|
||||
#: src/backend/masterlist.cpp:117 src/backend/masterlist.cpp:131
|
||||
msgid ""
|
||||
"An error occurred while trying to access the local masterlist repository. If "
|
||||
|
||||
@@ -85,7 +85,7 @@ boost::filesystem::path LootPaths::getLocalAppDataPath() {
|
||||
PWSTR path;
|
||||
|
||||
if (SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &path) != S_OK)
|
||||
throw std::system_error(GetLastError(), std::system_category(), boost::locale::translate("Failed to get %LOCALAPPDATA% path."));
|
||||
throw std::system_error(GetLastError(), std::system_category(), "Failed to get %LOCALAPPDATA% path.");
|
||||
|
||||
boost::filesystem::path localAppDataPath(FromWinWide(path));
|
||||
CoTaskMemFree(path);
|
||||
|
||||
@@ -186,8 +186,6 @@ void LootState::init(const std::string& cmdLineGame) {
|
||||
currentGame_->Init(true);
|
||||
// Update game path in settings object.
|
||||
storeGameSettings(toGameSettings(games_));
|
||||
} catch (GameDetectionError& e) {
|
||||
initErrors_.push_back(e.what());
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "Game-specific settings could not be initialised. " << e.what();
|
||||
initErrors_.push_back((format(translate("Error: Game-specific settings could not be initialised. %1%")) % e.what()).str());
|
||||
@@ -266,10 +264,10 @@ void LootState::selectGame(std::string preferredGame) {
|
||||
return game.IsInstalled();
|
||||
});
|
||||
}
|
||||
|
||||
// If no game can be selected, throw an exception.
|
||||
if (currentGame_ == end(games_)) {
|
||||
BOOST_LOG_TRIVIAL(error) << "None of the supported games were detected.";
|
||||
throw GameDetectionError(translate("None of the supported games were detected."));
|
||||
throw GameDetectionError("None of the supported games were detected.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
#include "loot/exception/game_detection_error.h"
|
||||
#include "backend/helpers/helpers.h"
|
||||
|
||||
using boost::locale::translate;
|
||||
using std::list;
|
||||
using std::string;
|
||||
using std::thread;
|
||||
@@ -60,8 +59,7 @@ void Game::Init(bool createFolder, const boost::filesystem::path& gameLocalAppDa
|
||||
BOOST_LOG_TRIVIAL(info) << "Initialising filesystem-related data for game: " << Name();
|
||||
|
||||
if (!this->IsInstalled()) {
|
||||
BOOST_LOG_TRIVIAL(error) << "Game path could not be detected.";
|
||||
throw GameDetectionError(translate("Game path could not be detected."));
|
||||
throw GameDetectionError("Game path could not be detected.");
|
||||
}
|
||||
|
||||
if (createFolder) {
|
||||
@@ -70,8 +68,7 @@ void Game::Init(bool createFolder, const boost::filesystem::path& gameLocalAppDa
|
||||
if (!fs::exists(LootPaths::getLootDataPath() / FolderName()))
|
||||
fs::create_directories(LootPaths::getLootDataPath() / FolderName());
|
||||
} catch (fs::filesystem_error& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "Could not create LOOT folder for game. Details: " << e.what();
|
||||
throw FileAccessError((boost::format(translate("Could not create LOOT folder for game. Details: %1%")) % e.what()).str());
|
||||
throw FileAccessError((boost::format("Could not create LOOT folder for game. Details: %1%") % e.what()).str());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,13 +26,11 @@
|
||||
|
||||
#include <boost/algorithm/string.hpp>
|
||||
#include <boost/format.hpp>
|
||||
#include <boost/locale.hpp>
|
||||
#include <boost/log/trivial.hpp>
|
||||
|
||||
#include "loot/exception/error_categories.h"
|
||||
|
||||
using boost::format;
|
||||
using boost::locale::translate;
|
||||
using std::string;
|
||||
|
||||
namespace loot {
|
||||
@@ -44,8 +42,7 @@ LoadOrderHandler::~LoadOrderHandler() {
|
||||
|
||||
void LoadOrderHandler::Init(const GameSettings& game, const boost::filesystem::path& gameLocalAppData) {
|
||||
if (game.GamePath().empty()) {
|
||||
BOOST_LOG_TRIVIAL(error) << "Game path is not initialised.";
|
||||
throw std::invalid_argument(translate("Game path is not initialised.").str());
|
||||
throw std::invalid_argument("Game path is not initialised.");
|
||||
}
|
||||
|
||||
const char * gameLocalDataPath = nullptr;
|
||||
@@ -80,11 +77,9 @@ void LoadOrderHandler::Init(const GameSettings& game, const boost::filesystem::p
|
||||
string err;
|
||||
lo_get_error_message(&e);
|
||||
if (e == nullptr) {
|
||||
BOOST_LOG_TRIVIAL(error) << "libloadorder failed to create a game handle. Details could not be fetched.";
|
||||
err = translate("libloadorder failed to create a game handle. Details could not be fetched.").str();
|
||||
err = "libloadorder failed to create a game handle. Details could not be fetched.";
|
||||
} else {
|
||||
BOOST_LOG_TRIVIAL(error) << "libloadorder failed to create a game handle. Details: " << e;
|
||||
err = (format(translate("libloadorder failed to create a game handle. Details: %1%")) % e).str();
|
||||
err = (format("libloadorder failed to create a game handle. Details: %1%") % e).str();
|
||||
}
|
||||
lo_cleanup();
|
||||
throw std::system_error(ret, libloadorder_category(), err);
|
||||
@@ -101,11 +96,9 @@ bool LoadOrderHandler::IsPluginActive(const std::string& pluginName) const {
|
||||
string err;
|
||||
lo_get_error_message(&e);
|
||||
if (e == nullptr) {
|
||||
BOOST_LOG_TRIVIAL(error) << "libloadorder failed to check if a plugin is active. Details could not be fetched.";
|
||||
err = translate("libloadorder failed to check if a plugin is active. Details could not be fetched.").str();
|
||||
err = "libloadorder failed to check if a plugin is active. Details could not be fetched.";
|
||||
} else {
|
||||
BOOST_LOG_TRIVIAL(error) << "libloadorder failed to check if a plugin is active. Details: " << e;
|
||||
err = (format(translate("libloadorder failed to check if a plugin is active. Details: %1%")) % e).str();
|
||||
err = (format("libloadorder failed to check if a plugin is active. Details: %1%") % e).str();
|
||||
}
|
||||
lo_cleanup();
|
||||
throw std::system_error(ret, libloadorder_category(), err);
|
||||
@@ -126,11 +119,9 @@ std::vector<std::string> LoadOrderHandler::GetLoadOrder() const {
|
||||
string err;
|
||||
lo_get_error_message(&e);
|
||||
if (e == nullptr) {
|
||||
BOOST_LOG_TRIVIAL(error) << "libloadorder failed to get the load order. Details could not be fetched.";
|
||||
err = translate("libloadorder failed to get the load order. Details could not be fetched.").str();
|
||||
err = "libloadorder failed to get the load order. Details could not be fetched.";
|
||||
} else {
|
||||
BOOST_LOG_TRIVIAL(error) << "libloadorder failed to get the load order. Details: " << e;
|
||||
err = (format(translate("libloadorder failed to get the load order. Details: %1%")) % e).str();
|
||||
err = (format("libloadorder failed to get the load order. Details: %1%") % e).str();
|
||||
}
|
||||
lo_cleanup();
|
||||
throw std::system_error(ret, libloadorder_category(), err);
|
||||
@@ -166,11 +157,9 @@ void LoadOrderHandler::SetLoadOrder(const std::vector<std::string>& loadOrder) c
|
||||
string err;
|
||||
lo_get_error_message(&e);
|
||||
if (e == nullptr) {
|
||||
BOOST_LOG_TRIVIAL(error) << "libloadorder failed to set the load order. Details could not be fetched.";
|
||||
err = translate("libloadorder failed to set the load order. Details could not be fetched.").str();
|
||||
err = "libloadorder failed to set the load order. Details could not be fetched.";
|
||||
} else {
|
||||
BOOST_LOG_TRIVIAL(error) << "libloadorder failed to set the load order. Details: " << e;
|
||||
err = (format(translate("libloadorder failed to set the load order. Details: %1%")) % e).str();
|
||||
err = (format("libloadorder failed to set the load order. Details: %1%") % e).str();
|
||||
}
|
||||
lo_cleanup();
|
||||
|
||||
|
||||
@@ -102,9 +102,8 @@ void GitHelper::Call(int error_code) {
|
||||
giterr_clear();
|
||||
|
||||
if (errorMessage_.empty())
|
||||
errorMessage_ = (boost::format(translate("Git operation failed. Error: %1%")) % gitError).str();
|
||||
errorMessage_ = (boost::format("Git operation failed. Error: %1%") % gitError).str();
|
||||
|
||||
BOOST_LOG_TRIVIAL(error) << "Git operation failed. Error: " << gitError;
|
||||
throw std::system_error(error_code, libgit2_category(), errorMessage_);
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
#include <boost/crc.hpp>
|
||||
#include <boost/filesystem/fstream.hpp>
|
||||
#include <boost/format.hpp>
|
||||
#include <boost/locale.hpp>
|
||||
#include <boost/log/trivial.hpp>
|
||||
#include <boost/spirit/include/karma.hpp>
|
||||
|
||||
@@ -54,7 +53,6 @@
|
||||
# include "shlwapi.h"
|
||||
#endif
|
||||
|
||||
using boost::locale::translate;
|
||||
using std::string;
|
||||
using std::wstring;
|
||||
|
||||
@@ -96,8 +94,7 @@ uint32_t GetCrc32(const boost::filesystem::path& filename) {
|
||||
return checksum;
|
||||
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "Unable to open \"" << filename.string() << "\" for CRC calculation.";
|
||||
throw FileAccessError((boost::format(translate("Unable to open \"%1%\" for CRC calculation: %2%")) % filename.string() % e.what()).str());
|
||||
throw FileAccessError((boost::format("Unable to open \"%1%\" for CRC calculation: %2%") % filename.string() % e.what()).str());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,10 +114,10 @@ void OpenInDefaultApplication(const boost::filesystem::path& file) {
|
||||
#ifdef _WIN32
|
||||
HINSTANCE ret = ShellExecute(0, NULL, ToWinWide(file.string()).c_str(), NULL, NULL, SW_SHOWNORMAL);
|
||||
if ((int)ret <= 32)
|
||||
throw std::system_error(GetLastError(), std::system_category(), translate("Failed to open file in its default application."));
|
||||
throw std::system_error(GetLastError(), std::system_category(), "Failed to open file in its default application.");
|
||||
#else
|
||||
if (system(("/usr/bin/xdg-open" + file.string()).c_str()) != 0)
|
||||
throw std::system_error(errno, std::system_category(), translate("Failed to open file in its default application."));
|
||||
throw std::system_error(errno, std::system_category(), "Failed to open file in its default application.");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -46,10 +46,10 @@ MasterlistInfo Masterlist::GetInfo(const boost::filesystem::path& path, bool sho
|
||||
|
||||
if (!fs::exists(path)) {
|
||||
BOOST_LOG_TRIVIAL(info) << "Unknown masterlist revision: No masterlist present.";
|
||||
throw FileAccessError(translate("N/A: No masterlist present"));
|
||||
throw FileAccessError(string("N/A: No masterlist present at ") + path.string());
|
||||
} else if (!git.IsRepository(path.parent_path())) {
|
||||
BOOST_LOG_TRIVIAL(info) << "Unknown masterlist revision: Git repository missing.";
|
||||
throw GitStateError(translate("Unknown: Git repository missing"));
|
||||
throw GitStateError(string("Unknown: \"") + path.parent_path().string() + "\" is not a Git repository.");
|
||||
}
|
||||
|
||||
BOOST_LOG_TRIVIAL(debug) << "Existing repository found, attempting to open it.";
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
#include "loot/exception/condition_syntax_error.h"
|
||||
|
||||
using boost::format;
|
||||
using boost::locale::translate;
|
||||
|
||||
namespace loot {
|
||||
ConditionEvaluator::ConditionEvaluator(Game * game) : game_(game) {}
|
||||
@@ -170,8 +169,7 @@ void ConditionEvaluator::validatePath(const boost::filesystem::path& path) {
|
||||
continue;
|
||||
|
||||
if (component == ".." && temp.filename() == "..") {
|
||||
BOOST_LOG_TRIVIAL(error) << "Invalid file path: " << path;
|
||||
throw ConditionSyntaxError((format(translate("Invalid file path: %1%")) % path.string()).str());
|
||||
throw ConditionSyntaxError((format("Invalid file path: %1%") % path.string()).str());
|
||||
}
|
||||
|
||||
temp /= component;
|
||||
@@ -181,7 +179,7 @@ void ConditionEvaluator::validateRegex(const std::string& regexString) {
|
||||
try {
|
||||
std::regex(regexString, std::regex::ECMAScript | std::regex::icase);
|
||||
} catch (std::regex_error& e) {
|
||||
throw ConditionSyntaxError((format(translate("Invalid regex string \"%1%\": %2%")) % regexString % e.what()).str());
|
||||
throw ConditionSyntaxError((format("Invalid regex string \"%1%\": %2%") % regexString % e.what()).str());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,8 +218,7 @@ std::pair<boost::filesystem::path, std::regex> ConditionEvaluator::splitRegex(co
|
||||
try {
|
||||
reg = std::regex(filename, std::regex::ECMAScript | std::regex::icase);
|
||||
} catch (std::regex_error& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "Invalid regex string:" << filename;
|
||||
throw ConditionSyntaxError((boost::format(boost::locale::translate("Invalid regex string \"%1%\": %2%")) % filename % e.what()).str());
|
||||
throw ConditionSyntaxError((format("Invalid regex string \"%1%\": %2%") % filename % e.what()).str());
|
||||
}
|
||||
|
||||
return std::pair<boost::filesystem::path, std::regex>(parent, reg);
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
#include <boost/algorithm/string/regex.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/format.hpp>
|
||||
#include <boost/locale.hpp>
|
||||
#include <boost/log/trivial.hpp>
|
||||
#include <boost/spirit/include/phoenix_core.hpp>
|
||||
#include <boost/spirit/include/phoenix_operator.hpp>
|
||||
@@ -198,9 +197,7 @@ private:
|
||||
std::string context(errorpos, last);
|
||||
boost::trim(context);
|
||||
|
||||
BOOST_LOG_TRIVIAL(error) << "Expected \"" << what.tag << "\" at \"" << context << "\".";
|
||||
|
||||
throw ConditionSyntaxError((boost::format(boost::locale::translate("Failed to parse condition \"%1%\": expected \"%2%\" at \"%3%\".")) % condition % what.tag % context).str());
|
||||
throw ConditionSyntaxError((boost::format("Failed to parse condition \"%1%\": expected \"%2%\" at \"%3%\".") % condition % what.tag % context).str());
|
||||
}
|
||||
|
||||
boost::spirit::qi::rule<Iterator, bool(), Skipper> expression_, compound_, condition_, function_;
|
||||
|
||||
@@ -30,8 +30,6 @@
|
||||
#include "backend/game/game.h"
|
||||
#include "backend/metadata/condition_grammar.h"
|
||||
|
||||
using boost::locale::translate;
|
||||
using std::exception;
|
||||
using std::string;
|
||||
|
||||
namespace loot {
|
||||
@@ -79,19 +77,12 @@ bool ConditionalMetadata::ParseCondition(Game * game) const {
|
||||
boost::spirit::qi::space_type skipper;
|
||||
string::const_iterator begin = condition_.begin();
|
||||
string::const_iterator end = condition_.end();
|
||||
bool parseResult;
|
||||
bool evaluation;
|
||||
|
||||
try {
|
||||
bool parseResult = boost::spirit::qi::phrase_parse(begin, end, grammar, skipper, evaluation);
|
||||
} catch (exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "Failed to evaluate condition \"" << condition_ << "\": " << e.what();
|
||||
throw;
|
||||
}
|
||||
bool parseResult = boost::spirit::qi::phrase_parse(begin, end, grammar, skipper, evaluation);
|
||||
|
||||
if (!parseResult || begin != end) {
|
||||
BOOST_LOG_TRIVIAL(error) << "Failed to parse condition \"" << condition_ << "\": only partially matched expected syntax.";
|
||||
throw ConditionSyntaxError((boost::format(translate("Failed to parse condition \"%1%\": only partially matched expected syntax.")) % condition_).str());
|
||||
throw ConditionSyntaxError((boost::format("Failed to parse condition \"%1%\": only partially matched expected syntax.") % condition_).str());
|
||||
}
|
||||
|
||||
return evaluation;
|
||||
|
||||
@@ -79,9 +79,7 @@ public:
|
||||
}
|
||||
backCycle.erase(backCycle.length() - 2);
|
||||
|
||||
BOOST_LOG_TRIVIAL(error) << "Cyclic interaction detected between plugins \"" << graph[source].Name() << "\" and \"" << graph[target].Name() << "\". Back cycle: " << backCycle;
|
||||
|
||||
throw CyclicInteractionError((boost::format(boost::locale::translate("Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: %3%")) % graph[source].Name() % graph[target].Name() % backCycle).str());
|
||||
throw CyclicInteractionError(graph[source].Name(), graph[target].Name(), backCycle);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -106,22 +106,6 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
YAML::Node convertMasterlistMetadata() {
|
||||
YAML::Node masterlistNode;
|
||||
try {
|
||||
MasterlistInfo info = state_.getCurrentGame().GetMasterlist().GetInfo(state_.getCurrentGame().MasterlistPath(), true);
|
||||
addSuffixIfModified(info);
|
||||
|
||||
masterlistNode["revision"] = info.revision_id;
|
||||
masterlistNode["date"] = info.revision_date;
|
||||
} catch (std::exception &e) {
|
||||
masterlistNode["revision"] = e.what();
|
||||
masterlistNode["date"] = e.what();
|
||||
}
|
||||
|
||||
return masterlistNode;
|
||||
}
|
||||
|
||||
static std::vector<EditorMessage> toEditorMessages(std::vector<Message> messages, const LanguageCode language) {
|
||||
std::vector<EditorMessage> list;
|
||||
|
||||
@@ -190,7 +174,7 @@ private:
|
||||
|
||||
// ID the game using its folder value.
|
||||
gameNode["folder"] = state_.getCurrentGame().FolderName();
|
||||
gameNode["masterlist"] = convertMasterlistMetadata();
|
||||
gameNode["masterlist"] = getMasterlistInfo();
|
||||
gameNode["globalMessages"] = getGeneralMessages();
|
||||
gameNode["bashTags"] = state_.getCurrentGame().GetMasterlist().BashTags();
|
||||
|
||||
|
||||
@@ -31,6 +31,8 @@ along with LOOT. If not, see
|
||||
#include "backend/game/game.h"
|
||||
#include "backend/plugin/plugin.h"
|
||||
#include "gui/query/query.h"
|
||||
#include "loot/exception/file_access_error.h"
|
||||
#include "loot/exception/git_state_error.h"
|
||||
|
||||
namespace loot {
|
||||
class MetadataQuery : public Query {
|
||||
@@ -74,11 +76,25 @@ protected:
|
||||
}
|
||||
}
|
||||
|
||||
void addSuffixIfModified(MasterlistInfo& info) {
|
||||
if (info.is_modified) {
|
||||
info.revision_date += " " + boost::locale::translate("(edited)").str();
|
||||
info.revision_id += " " + boost::locale::translate("(edited)").str();
|
||||
YAML::Node getMasterlistInfo() {
|
||||
using boost::locale::translate;
|
||||
|
||||
YAML::Node masterlistNode;
|
||||
try {
|
||||
MasterlistInfo info = state_.getCurrentGame().GetMasterlist().GetInfo(state_.getCurrentGame().MasterlistPath(), true);
|
||||
addSuffixIfModified(info);
|
||||
|
||||
masterlistNode["revision"] = info.revision_id;
|
||||
masterlistNode["date"] = info.revision_date;
|
||||
} catch (FileAccessError &) {
|
||||
masterlistNode["revision"] = translate("N/A: No masterlist present").str();
|
||||
masterlistNode["date"] = translate("N/A: No masterlist present").str();
|
||||
} catch (GitStateError &) {
|
||||
masterlistNode["revision"] = translate("Unknown: Git repository missing").str();
|
||||
masterlistNode["date"] = translate("Unknown: Git repository missing").str();
|
||||
}
|
||||
|
||||
return masterlistNode;
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -153,6 +169,13 @@ private:
|
||||
return pluginNode;
|
||||
}
|
||||
|
||||
void addSuffixIfModified(MasterlistInfo& info) {
|
||||
if (info.is_modified) {
|
||||
info.revision_date += " " + boost::locale::translate("(edited)").str();
|
||||
info.revision_id += " " + boost::locale::translate("(edited)").str();
|
||||
}
|
||||
}
|
||||
|
||||
LootState& state_;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ along with LOOT. If not, see
|
||||
#ifndef LOOT_GUI_QUERY_QUERY
|
||||
#define LOOT_GUI_QUERY_QUERY
|
||||
|
||||
#include <boost/locale.hpp>
|
||||
#include <boost/log/trivial.hpp>
|
||||
#include <include/wrapper/cef_message_router.h>
|
||||
|
||||
@@ -36,7 +37,7 @@ public:
|
||||
callback->Success(executeLogic());
|
||||
} catch (std::exception &e) {
|
||||
BOOST_LOG_TRIVIAL(error) << e.what();
|
||||
callback->Failure(-1, e.what());
|
||||
callback->Failure(-1, boost::locale::translate("Oh no, something went wrong! If you've enabled debug logging in your settings, you can check your LOOTDebugLog.txt (you can get to it through the main menu) for more information.").str());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -79,7 +79,9 @@ private:
|
||||
plugins = sorter.Sort(state_.getCurrentGame(), state_.getLanguage().GetCode());
|
||||
} catch (CyclicInteractionError& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "Failed to sort plugins. Details: " << e.what();
|
||||
state_.getCurrentGame().AppendMessage(Message(MessageType::error, e.what()));
|
||||
state_.getCurrentGame().AppendMessage(Message(MessageType::error,
|
||||
(boost::format(boost::locale::translate("Cyclic interaction detected between plugins \"%1%\" and \"%2%\". Back cycle: %3%"))
|
||||
% e.getFirstPlugin() % e.getLastPlugin() % e.getBackCycle()).str()));
|
||||
} catch (std::exception& e) {
|
||||
BOOST_LOG_TRIVIAL(error) << "Failed to sort plugins. Details: " << e.what();
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ private:
|
||||
|
||||
std::string generateJsonResponse() {
|
||||
YAML::Node gameMetadata;
|
||||
storeMasterlistMetadata(gameMetadata);
|
||||
gameMetadata["masterlist"] = getMasterlistInfo();
|
||||
|
||||
// Store bash tags in case they have changed.
|
||||
gameMetadata["bashTags"] = game_.GetMasterlist().BashTags();
|
||||
@@ -75,19 +75,6 @@ private:
|
||||
return JSON::stringify(gameMetadata);
|
||||
}
|
||||
|
||||
void storeMasterlistMetadata(YAML::Node& gameMetadata) {
|
||||
try {
|
||||
MasterlistInfo info = game_.GetMasterlist().GetInfo(game_.MasterlistPath(), true);
|
||||
addSuffixIfModified(info);
|
||||
|
||||
gameMetadata["masterlist"]["revision"] = info.revision_id;
|
||||
gameMetadata["masterlist"]["date"] = info.revision_date;
|
||||
} catch (std::exception& e) {
|
||||
gameMetadata["masterlist"]["revision"] = e.what();
|
||||
gameMetadata["masterlist"]["date"] = e.what();
|
||||
}
|
||||
}
|
||||
|
||||
YAML::Node generateDerivedMetadata(const Plugin& plugin) {
|
||||
YAML::Node pluginNode;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user