From 8ae39a4a48bb5a23a1fb782e23afa13250735739 Mon Sep 17 00:00:00 2001 From: Nikitosiki Date: Wed, 7 Jun 2023 15:26:32 +0300 Subject: [PATCH] Added check for duplicates in key file --- LocalizatorDll/LocalizerHandler.cpp | 35 ++++++++++++++++++++++++----- LocalizatorDll/LocalizerHandler.h | 2 ++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/LocalizatorDll/LocalizerHandler.cpp b/LocalizatorDll/LocalizerHandler.cpp index 5bd8beb..03790ea 100644 --- a/LocalizatorDll/LocalizerHandler.cpp +++ b/LocalizatorDll/LocalizerHandler.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "LocalizerHandler.h" #include "DllFunctions.h" #include "XMLReader.h" @@ -20,11 +21,20 @@ LocalizerHandler::LocalizerHandler() if (!XMLReader::ReadLanguagesFromFile(directoryPath + "\\language\\settings.xml", *this->languages)) MessageError(NULL, "Error. Reading settings file!", "Localizer Error", MB_ICONERROR | MB_OK); - // Проверяем что файлы языков существуют if (!CheckAllTranslationsExist(directoryPath + "\\language\\dictionaries\\", *this->languages)) MessageError(NULL, "Error. Not all dictionary files exist!", "Localizer Error", MB_ICONERROR | MB_OK); + // Считываем файл со всеми ключами + std::vector keys; + if (!XMLReader::ReadKeysFromFile(directoryPath + "\\language\\keys.xml", keys)) + MessageError(NULL, "Error. Reading keys file!", "Localizer Error", MB_ICONERROR | MB_OK); + + // Проверяем что все ключи уникальные + std::string duplicateKey; + if (isDuplicates(keys, duplicateKey)) + MessageError(NULL, ("Error. Key file contains a duplicate: " + duplicateKey).c_str(), "Localizer Error", MB_ICONERROR | MB_OK); + // Считываем название файла выбранного языка, в файле настроек std::string fileLanguageName; if (!XMLReader::ReadSelectLangFile_FromFile(directoryPath + "\\language\\settings.xml", fileLanguageName)) @@ -34,11 +44,6 @@ LocalizerHandler::LocalizerHandler() if (!XMLReader::ReadTranslationsFromFile(directoryPath + "\\language\\dictionaries\\" + fileLanguageName, *this->dictionary)) MessageError(NULL, ("Error. Reading dictionary file: " + fileLanguageName).c_str(), "Localizer Error", MB_ICONERROR | MB_OK); - // Считываем файл со всеми ключами - std::vector keys; - if (!XMLReader::ReadKeysFromFile(directoryPath + "\\language\\keys.xml", keys)) - MessageError(NULL, "Error. Reading keys file!", "Localizer Error", MB_ICONERROR | MB_OK); - // Проверяем словарь на корректность, используя файл со всеми ключами if (!CheckCorrectDictionary(keys, *this->dictionary)) MessageError(NULL, ("Error. Incorrect keys in dictionary, file: " + fileLanguageName).c_str(), "Localizer Error", MB_ICONERROR | MB_OK); @@ -131,6 +136,24 @@ const void LocalizerHandler::MessageError(const HWND& hWnd, const LPCSTR& lpText ExitProcess(0); } +const bool LocalizerHandler::isDuplicates(const std::vector& values, std::string& duplicateElement) const +{ + std::vector sortedValues = values; // Создаем копию вектора + std::sort(sortedValues.begin(), sortedValues.end()); // Сортируем копию + + // Проверяем, есть ли соседние элементы в отсортированном векторе, которые равны + for (std::size_t i = 1; i < sortedValues.size(); ++i) + { + if (sortedValues[i] == sortedValues[i - 1]) + { + duplicateElement = sortedValues[i]; + return true; // Есть дубликаты + } + } + + return false; // Дубликатов нет +} + const std::string LocalizerHandler::GetDllFolderPath() const { char path[MAX_PATH]; diff --git a/LocalizatorDll/LocalizerHandler.h b/LocalizatorDll/LocalizerHandler.h index 85dbea8..a46e35f 100644 --- a/LocalizatorDll/LocalizerHandler.h +++ b/LocalizatorDll/LocalizerHandler.h @@ -17,6 +17,8 @@ class LocalizerHandler const void MessageError(const HWND& hWnd, const LPCSTR& lpText, const LPCSTR& lpCaption, const UINT& uType) const; + const bool isDuplicates(const std::vector& values, std::string& duplicateElement) const; + public: LocalizerHandler();