diff --git a/.github/workflows/docker_prod.yml b/.github/workflows/docker_prod.yml index 6b5e7709..cdad6b35 100755 --- a/.github/workflows/docker_prod.yml +++ b/.github/workflows/docker_prod.yml @@ -13,7 +13,7 @@ on: release: types: [published] tags: - - '*.*.*' + - '*.[1-9]+[0-9]?.[1-9]+*' jobs: docker: runs-on: ubuntu-latest diff --git a/docker-compose.yml b/docker-compose.yml index 38bd6918..3371daa1 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -54,6 +54,7 @@ services: - ${DEV_LOCATION}/front/report.php:/home/pi/pialert/front/report.php - ${DEV_LOCATION}/front/workflows.php:/home/pi/pialert/front/workflows.php - ${DEV_LOCATION}/front/appEventsCore.php:/home/pi/pialert/front/appEventsCore.php + - ${DEV_LOCATION}/front/multiEditCore.php:/home/pi/pialert/front/multiEditCore.php - ${DEV_LOCATION}/front/donations.php:/home/pi/pialert/front/donations.php - ${DEV_LOCATION}/front/plugins:/home/pi/pialert/front/plugins # DELETE END anyone trying to use this file: comment out / delete ABOVE lines, they are only for development purposes diff --git a/front/css/pialert.css b/front/css/pialert.css index a7d4bb69..8cfd885f 100755 --- a/front/css/pialert.css +++ b/front/css/pialert.css @@ -1030,6 +1030,31 @@ input[readonly] { z-index: 100; } +/* Multi-edit adjustements */ +.box-header +{ + min-height: 55px; +} + +.red-hover-border:hover +{ + border-color: red !important; + border-width: 1px; + border-style: solid; + +} + +.red-hover-background:hover +{ + background-color: red !important; +} + +#multi-edit-form .form-group +{ + height: 45px; + +} + /* ----------------------------------------------------------------------------- Donations ----------------------------------------------------------------------------- */ diff --git a/front/deviceDetails.php b/front/deviceDetails.php index a40730b7..afb3e0b6 100755 --- a/front/deviceDetails.php +++ b/front/deviceDetails.php @@ -1471,23 +1471,7 @@ function setDeviceData (direction='', refreshCallback='') { }); } -// -------------------------------------------------------- -// Calls a backend function to add a front-end event to an execution queue -function updateApi() -{ - // value has to be in format event|param. e.g. run|ARPSCAN - action = `update_api|devices,appevents` - - $.ajax({ - method: "POST", - url: "php/server/util.php", - data: { function: "addToExecutionQueue", action: action }, - success: function(data, textStatus) { - console.log(data) - } - }) -} // ----------------------------------------------------------------------------- diff --git a/front/devices.php b/front/devices.php index a56b29b1..70d8fbec 100755 --- a/front/devices.php +++ b/front/devices.php @@ -120,7 +120,7 @@
-

+

@@ -148,7 +148,10 @@
-

Devices

+
+

+
+
@@ -188,6 +191,9 @@ + + + @@ -520,7 +526,8 @@ function initializeDatatable (status) { // Parameters 'pageLength' : tableRows, - 'order' : tableOrder, + 'order' : tableOrder, + 'select' : true, // Enable selection 'columnDefs' : [ {visible: false, targets: tableColumnHide }, @@ -656,6 +663,28 @@ function initializeDatatable (status) { setCache ('devicesList', getDevicesFromTable(table) ); } ); + // add multi-edit button + $('#multiEditPlc').append( + ``) + + // Event listener for row selection in DataTable + $('#tableDevices').on('click', 'tr', function (e) { + setTimeout(function(){ + // Check if any row is selected + var anyRowSelected = $('#tableDevices tr.selected').length > 0; + + console.log(anyRowSelected); + + // Toggle visibility of element with ID 'multiEdit' + $('#multiEdit').toggle(anyRowSelected); + }, 200); + + + + }); + }); }; @@ -729,6 +758,52 @@ function handleLoadingDialog() } +// ----------------------------------------------------------------------------- +function multiEditDevices() +{ + rows = $('#tableDevices')[0].rows + + // Initialize an empty array to store selected rows + var selectedRows = []; + + console.log($('#tableDevices')[0].rows); + + // Loop through each row in the HTML collection + for (var i = 0; i < rows.length; i++) { + var row = rows[i]; + // Check if the row has the 'selected' class + if (row.classList.contains('selected')) { + // If selected, push the row's data to the selectedRows array + selectedRows.push(row); + } + } + + // Now, selectedRows contains all selected rows + console.log(selectedRows); + + var devicesDataTableData = $('#tableDevices').dataTable().fnGetData(); + + var selectedDevices = []; + + for (var i = 0; i < selectedRows.length; i++) { + selectedDevices.push(devicesDataTableData[selectedRows[i]._DT_RowIndex]); + } + + // Now, selectedDevices contains all selected devices + console.log(selectedDevices); + + macs = "" + + for (var i = 0; i < selectedDevices.length; i++) { + macs += selectedDevices[i][4] + ","; // [4] == MAC + } + // setCache('activeMaintenanceTab', 'tab_multiEdit_id') + window.location.href = window.location.origin + '/maintenance.php#tab_multiEdit?macs=' + macs.slice(0, -1); + + +} + + diff --git a/front/js/pialert_common.js b/front/js/pialert_common.js index 556c531a..2d4969a3 100755 --- a/front/js/pialert_common.js +++ b/front/js/pialert_common.js @@ -472,7 +472,37 @@ function getQueryString(key){ }); tmp = params[key] + + if(emptyArr.includes(tmp)) + { + var queryParams = {}; + fullUrl = window.location.toString(); + + // console.log(fullUrl); + + if (fullUrl.includes('?')) { + var queryString = fullUrl.split('?')[1]; + // Split the query string into individual parameters + var paramsArray = queryString.split('&'); + + // Loop through the parameters array + paramsArray.forEach(function(param) { + // Split each parameter into key and value + var keyValue = param.split('='); + var keyTmp = decodeURIComponent(keyValue[0]); + var value = decodeURIComponent(keyValue[1] || ''); + + // Store key-value pair in the queryParams object + queryParams[keyTmp] = value; + }); + } + + // console.log(queryParams); + + tmp = queryParams[key] + } + result = emptyArr.includes(tmp) ? "" : tmp; return result @@ -722,9 +752,9 @@ function getGuid() { // UI // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- -// Genrate work-in-progress icons +// Generate work-in-progress icons function workInProgress() { - console.log() + if($(".work-in-progress").html().trim() == "") { $(".work-in-progress").append(` @@ -768,6 +798,25 @@ function hideSpinner() $("#loadingSpinner").hide() } + +// -------------------------------------------------------- +// Calls a backend function to add a front-end event to an execution queue +function updateApi() +{ + + // value has to be in format event|param. e.g. run|ARPSCAN + action = `update_api|devices,appevents` + + $.ajax({ + method: "POST", + url: "php/server/util.php", + data: { function: "addToExecutionQueue", action: action }, + success: function(data, textStatus) { + console.log(data) + } + }) +} + // ----------------------------------------------------------------------------- // initialize // ----------------------------------------------------------------------------- diff --git a/front/js/ui_components.js b/front/js/ui_components.js new file mode 100755 index 00000000..57fef7db --- /dev/null +++ b/front/js/ui_components.js @@ -0,0 +1,92 @@ +/* ----------------------------------------------------------------------------- +* Pi.Alert +* Open Source Network Guard / WIFI & LAN intrusion detector +* +* ui_components.js - Front module. Common UI components +*------------------------------------------------------------------------------- +# jokob jokob@duck.com GNU GPLv3 +----------------------------------------------------------------------------- */ + + +// ----------------------------------------------------------------------------- +// Initialize device selectors / pickers fields +// ----------------------------------------------------------------------------- +function initDeviceSelectors() { + + console.log(devicesList) + // Retrieve device list from session variable + var devicesListAll_JSON = sessionStorage.getItem('devicesListAll_JSON'); + + console.log(devicesListAll_JSON) + + var devicesList = JSON.parse(devicesListAll_JSON); + + console.log(devicesList) + + // Check if both device list exists + if (devicesListAll_JSON) { + // Parse the JSON string to get the device list array + var devicesList = JSON.parse(devicesListAll_JSON); + + + + console.log(devicesList) + + var selectorFieldsHTML = '' + + // Loop through the devices list + devicesList.forEach(function(device) { + + selectorFieldsHTML += ``; + }); + + selector = `
+
+
+ +
+
+
` + + + // Find HTML elements with class "deviceSelector" and append selector field + $('.deviceSelector').append(selector); + } + + // Initialize selected items after a delay so selected macs are available in the context + setTimeout(function(){ + // Retrieve MAC addresses from query string or cache + var macs = getQueryString('macs') || getCache('selectedDevices'); + + if(macs) + { + // Split MAC addresses if they are comma-separated + macs = macs.split(','); + + console.log(macs) + + // Loop through macs to be selected list + macs.forEach(function(mac) { + + // Create the option and append to Select2 + var option = new Option($('.deviceSelector select option[value="' + mac + '"]').html(), mac, true, true); + + $('.deviceSelector select').append(option).trigger('change'); + }); + + } + + }, 100); + +} + + +// ----------------------------------------------------------------------------- +// initialize +// ----------------------------------------------------------------------------- + +initDeviceSelectors(); + +console.log("init ui_components.js") \ No newline at end of file diff --git a/front/maintenance.php b/front/maintenance.php index 0c187e50..0b893d62 100755 --- a/front/maintenance.php +++ b/front/maintenance.php @@ -243,6 +243,12 @@ $db->close(); +
  • + + + + +
  • @@ -501,8 +507,21 @@ $db->close();
    + +
    +
    +
    + + +
    +
    +
    +
    +
    @@ -827,7 +846,7 @@ function initializeSelectedColumns () { $("#columnsSelect").append(option).trigger('change'); - $(option).attr('eee','eee') + // $(option).attr('eee','eee') } }); @@ -871,7 +890,15 @@ function initializeTabs () { selectedTab = "tab_Settings" // the #target from the url - target = window.location.hash.substr(1) + target = window.location.hash.substr(1) + + // get only the part between #...? + if(target.includes('?')) + { + target = target.split('?')[0] + } + + console.log(target) // update cookie if target specified if(target != "") diff --git a/front/multiEditCore.php b/front/multiEditCore.php new file mode 100755 index 00000000..254ac581 --- /dev/null +++ b/front/multiEditCore.php @@ -0,0 +1,159 @@ + + +
    + +
    +

    + +

    +
    + + + +
    +
    +
    +
    +

    +
    +
    +
    + +
    +
    +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/front/php/server/dbHelper.php b/front/php/server/dbHelper.php index 3f56b6a3..34e13905 100755 --- a/front/php/server/dbHelper.php +++ b/front/php/server/dbHelper.php @@ -80,45 +80,61 @@ function update($columnName, $id, $skipCache, $defaultValue, $expireMinutes, $db global $db; - // handle one or multiple columns - if(strpos($columns, ',') !== false) - { - $columnsArr = explode(",", $columns); - }else - { - $columnsArr = array($columns); + // Handle one or multiple columns + if(strpos($columns, ',') !== false) { + $columnsArr = explode(",", $columns); + } else { + $columnsArr = array($columns); } - // handle one or multiple values - if(strpos($values, ',') !== false) - { - $valuesArr = explode(",", $values); - } else - { - $valuesArr = array($values); + // Handle one or multiple values + if(strpos($values, ',') !== false) { + $valuesArr = explode(",", $values); + } else { + $valuesArr = array($values); } + // Handle one or multiple IDs + if(strpos($id, ',') !== false) { + $idsArr = explode(",", $id); + $idsPlaceholder = rtrim(str_repeat('?,', count($idsArr)), ','); + } else { + $idsArr = array($id); + $idsPlaceholder = '?'; + } + + // Build column-value pairs string $columnValues = ''; - - $index = 0; - foreach($columnsArr as $column) - { - $columnValues = $columnValues .' "' .$column.'" = "'.$valuesArr[$index] . '",' ; - $index = $index + 1; + foreach($columnsArr as $column) { + $columnValues .= '"' . $column . '" = ?,'; } + // Remove trailing comma + $columnValues = rtrim($columnValues, ','); + + // Construct the SQL query + $sql = 'UPDATE ' . $dbtable . ' SET ' . $columnValues . ' WHERE ' . $columnName . ' IN (' . $idsPlaceholder . ')'; - $columnValues = substr($columnValues, 0, -1); - - // Update value - $sql = 'UPDATE '.$dbtable.' SET '. $columnValues .' - WHERE "'. $columnName .'"="'. $id.'"'; - $result = $db->query($sql); + // Prepare the statement + $stmt = $db->prepare($sql); - if (! $result == TRUE) { - echo "Error updating parameter\n\n$sql \n\n". $db->lastErrorMsg(); - return; + // Check for errors + if(!$stmt) { + echo "Error preparing statement: " . $db->lastErrorMsg(); + return; } + // Bind the parameters + $paramTypes = str_repeat('s', count($columnsArr)); + foreach($valuesArr as $i => $value) { + $stmt->bindValue($i + 1, $value); + } + foreach($idsArr as $i => $idValue) { + $stmt->bindValue(count($valuesArr) + $i + 1, $idValue); + } + + // Execute the statement + $result = $stmt->execute(); + $changes = $db->changes(); if ($changes == 0) { // Insert new value @@ -129,7 +145,7 @@ function update($columnName, $id, $skipCache, $defaultValue, $expireMinutes, $db $uniqueHash = hash('ripemd160', $dbtable . $columns); setCache($uniqueHash, $values, $expireMinutes); - echo 'OK'; + echo 'OK' ; } @@ -140,16 +156,19 @@ function create($skipCache, $defaultValue, $expireMinutes, $dbtable, $columns, $ { global $db; - // Insert new value - $sql = 'INSERT INTO '.$dbtable.' ('.$columns.') - VALUES ("'. quotes($parameter) .'", - "'. $values .'")'; - $result = $db->query($sql); + echo "NOT IMPLEMENTED!\n\n"; + return; - if (! $result == TRUE) { - echo "Error creating entry\n\n$sql \n\n". $db->lastErrorMsg(); - return; - } + // // Insert new value + // $sql = 'INSERT INTO '.$dbtable.' ('.$columns.') + // VALUES ("'. quotes($parameter) .'", + // "'. $values .'")'; + // $result = $db->query($sql); + + // if (! $result == TRUE) { + // echo "Error creating entry\n\n$sql \n\n". $db->lastErrorMsg(); + // return; + // } } //------------------------------------------------------------------------------ diff --git a/front/php/server/util.php b/front/php/server/util.php index 5f7d567a..23403afd 100755 --- a/front/php/server/util.php +++ b/front/php/server/util.php @@ -185,7 +185,7 @@ function displayMessage($message, $logAlert = FALSE, $logConsole = TRUE, $logFil echo ''; } - // F12 Browser console + // F12 Browser dev console if($logConsole) { echo ''; @@ -194,16 +194,26 @@ function displayMessage($message, $logAlert = FALSE, $logConsole = TRUE, $logFil //File if($logFile) { - if(file_exists($logFolderPath.$log_file) != 1) // file doesn't exist, create one - { - $log = fopen($logFolderPath.$log_file, "w") or die("Unable to open file!"); - }else // file exists, append - { - $log = fopen($logFolderPath.$log_file, "a") or die("Unable to open file!"); + + if (is_writable($logFolderPath.$log_file)) { + + + if(file_exists($logFolderPath.$log_file) != 1) // file doesn't exist, create one + { + $log = fopen($logFolderPath.$log_file, "w") or die("Unable to open file!"); + }else // file exists, append + { + $log = fopen($logFolderPath.$log_file, "a") or die("Unable to open file - Permissions issue!"); + } + + fwrite($log, "[".$timestamp. "] " . str_replace('
    ',"\n ",str_replace('
    ',"\n ",$message)).PHP_EOL."" ); + fclose($log); + + } else { + echo 'The file is not writable: '.$logFolderPath.$log_file; } - fwrite($log, "[".$timestamp. "] " . str_replace('
    ',"\n ",str_replace('
    ',"\n ",$message)).PHP_EOL."" ); - fclose($log); + } //echo diff --git a/front/php/templates/language/de_de.json b/front/php/templates/language/de_de.json index fa29906c..6f65041b 100755 --- a/front/php/templates/language/de_de.json +++ b/front/php/templates/language/de_de.json @@ -187,6 +187,10 @@ "DevDetail_button_OverwriteIcons_Warning": "Are you sure you want to overwrite all icons of all devices with the same device type as the current device type?", "DevDetail_button_Reset": "Verwerfen", "DevDetail_button_Save": "Speichern", + "Device_MultiEdit": "", + "Device_MultiEdit_Backup": "", + "Device_MultiEdit_Fields": "", + "Device_MultiEdit_Tooltip": "", "Device_Searchbox": "Suche", "Device_Shortcut_AllDevices": "Alle Ger\u00e4te", "Device_Shortcut_Archived": "Archiviert", @@ -280,6 +284,7 @@ "Gen_Run": "Run", "Gen_Save": "Speichern", "Gen_Saved": "Gespeichert", + "Gen_Selected_Devices": "", "Gen_Switch": "Umschalten", "Gen_Upd": "Aktualisierung erfolgreich", "Gen_Upd_Fail": "Aktualisierung fehlgeschlagen", diff --git a/front/php/templates/language/en_us.json b/front/php/templates/language/en_us.json index e035e4fd..5ff736b1 100755 --- a/front/php/templates/language/en_us.json +++ b/front/php/templates/language/en_us.json @@ -175,6 +175,10 @@ "DevDetail_button_OverwriteIcons_Warning": "Are you sure you want to overwrite all icons of all devices with the same device type as the current device type?", "DevDetail_button_Reset": "Reset Changes", "DevDetail_button_Save": "Save", + "Device_MultiEdit": "Multi-edit", + "Device_MultiEdit_Backup": "Please backup your databse or Devices configuration first by creating a devices.csv backup via the CSV Export feature under the Backup / Restore tab.", + "Device_MultiEdit_Fields": "Editable fields:", + "Device_MultiEdit_Tooltip": "Careful. Clicking this will apply the value on the left to all devices selected above.", "Device_Searchbox": "Search", "Device_Shortcut_AllDevices": "My Devices", "Device_Shortcut_Archived": "Archived", @@ -268,6 +272,7 @@ "Gen_Run": "Run", "Gen_Save": "Save", "Gen_Saved": "Saved", + "Gen_Selected_Devices": "Selected Devices:", "Gen_Switch": "Switch", "Gen_Upd": "Updated successfully", "Gen_Upd_Fail": "Update failed", diff --git a/front/php/templates/language/es_es.json b/front/php/templates/language/es_es.json index a21eb0f9..b81222be 100755 --- a/front/php/templates/language/es_es.json +++ b/front/php/templates/language/es_es.json @@ -185,6 +185,10 @@ "DevDetail_button_OverwriteIcons_Warning": "\u00bfSobreescribir todos los iconos de todos los dispositivos con el mismo tipo que el dispositivo actual?", "DevDetail_button_Reset": "Restablecer cambios", "DevDetail_button_Save": "Guardar", + "Device_MultiEdit": "", + "Device_MultiEdit_Backup": "", + "Device_MultiEdit_Fields": "", + "Device_MultiEdit_Tooltip": "", "Device_Searchbox": "B\u00fasqueda", "Device_Shortcut_AllDevices": "Mis dispositivos", "Device_Shortcut_Archived": "Archivado(s)", @@ -278,6 +282,7 @@ "Gen_Run": "Ejecutar", "Gen_Save": "Guardar", "Gen_Saved": "Guardado", + "Gen_Selected_Devices": "", "Gen_Switch": "Cambiar", "Gen_Upd": "Actualizado correctamente", "Gen_Upd_Fail": "Fallo al actualizar", diff --git a/front/php/templates/language/fr_fr.json b/front/php/templates/language/fr_fr.json index 640bcf60..c0d00045 100755 --- a/front/php/templates/language/fr_fr.json +++ b/front/php/templates/language/fr_fr.json @@ -175,6 +175,10 @@ "DevDetail_button_OverwriteIcons_Warning": "", "DevDetail_button_Reset": "", "DevDetail_button_Save": "Enregistrer", + "Device_MultiEdit": "", + "Device_MultiEdit_Backup": "", + "Device_MultiEdit_Fields": "", + "Device_MultiEdit_Tooltip": "", "Device_Searchbox": "Rechercher", "Device_Shortcut_AllDevices": "Tous les appareils", "Device_Shortcut_Archived": "Archiv\u00e9", @@ -268,6 +272,7 @@ "Gen_Run": "Lancer", "Gen_Save": "Enregistrer", "Gen_Saved": "Enregistr\u00e9", + "Gen_Selected_Devices": "", "Gen_Switch": "Basculer", "Gen_Upd": "", "Gen_Upd_Fail": "", diff --git a/front/php/templates/language/nb_no.json b/front/php/templates/language/nb_no.json index e3757ebc..92399f78 100755 --- a/front/php/templates/language/nb_no.json +++ b/front/php/templates/language/nb_no.json @@ -175,6 +175,10 @@ "DevDetail_button_OverwriteIcons_Warning": "", "DevDetail_button_Reset": "", "DevDetail_button_Save": "", + "Device_MultiEdit": "", + "Device_MultiEdit_Backup": "", + "Device_MultiEdit_Fields": "", + "Device_MultiEdit_Tooltip": "", "Device_Searchbox": "", "Device_Shortcut_AllDevices": "", "Device_Shortcut_Archived": "", @@ -268,6 +272,7 @@ "Gen_Run": "", "Gen_Save": "", "Gen_Saved": "", + "Gen_Selected_Devices": "", "Gen_Switch": "", "Gen_Upd": "", "Gen_Upd_Fail": "", diff --git a/front/php/templates/language/ru_ru.json b/front/php/templates/language/ru_ru.json old mode 100644 new mode 100755 index 4942bb18..7962d94d --- a/front/php/templates/language/ru_ru.json +++ b/front/php/templates/language/ru_ru.json @@ -1,74 +1,74 @@ { - "API_CUSTOM_SQL_description": "Вы можете указать пользовательский SQL-запрос, который будет генерировать файл JSON, а затем выдать его через table_custom_endpoint.json file endpoint.", - "API_CUSTOM_SQL_name": "Пользовательская конечная точка", + "API_CUSTOM_SQL_description": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 SQL-\u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b JSON, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 table_custom_endpoint.json file endpoint.", + "API_CUSTOM_SQL_name": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430", "API_display_name": "API", "API_icon": "", - "About_Design": "Разработан:", - "About_Exit": "Зарегистрироваться", - "About_Title": "Сетевая защита с открытым исходным кодом", - "AppEvents_DateTimeCreated": "Журнал", - "AppEvents_Extra": "Дополнительно", - "AppEvents_GUID": "GUID события приложения", - "AppEvents_Helper1": "Помощник 1", - "AppEvents_Helper2": "Помощник 2", - "AppEvents_Helper3": "Помощник 3", - "AppEvents_ObjectForeignKey": "Внешний ключ", - "AppEvents_ObjectIndex": "Индекс", - "AppEvents_ObjectIsArchived": "Архивировано (во время входа в систему)", - "AppEvents_ObjectIsNew": "Новый (во время входа в систему)", - "AppEvents_ObjectPlugin": "Связанный плагин", - "AppEvents_ObjectPrimaryID": "Первичный ID", - "AppEvents_ObjectSecondaryID": "Вторичный ID", - "AppEvents_ObjectStatus": "Состояние (во время входа в систему)", - "AppEvents_ObjectStatusColumn": "Колонка состояния", - "AppEvents_ObjectType": "Тип объекта", - "AppEvents_Plugin": "Плагин", - "AppEvents_Type": "Тип", - "BackDevDetail_Actions_Ask_Run": "Вы хотите выполнить действие?", - "BackDevDetail_Actions_Not_Registered": "Действие не зарегистрировано:· ", - "BackDevDetail_Actions_Title_Run": "Запустить действие", - "BackDevDetail_Copy_Ask": "Копировать данные с устройства из выпадающего списка (все на этой странице будет перезаписано)?", - "BackDevDetail_Copy_Title": "Копировать детали", - "BackDevDetail_Tools_WOL_error": "Команда НЕ была выполнена.", - "BackDevDetail_Tools_WOL_okay": "Команда была выполнена.", - "BackDevices_Arpscan_disabled": "Arp сканирование запрещено", - "BackDevices_Arpscan_enabled": "Arp сканирование разрешено", - "BackDevices_Backup_CopError": "Оригинальную базу данных не удалось сохранить.", - "BackDevices_Backup_Failed": "Резервное копирование выполнено частично. Архив не может быть создан или пуст.", - "BackDevices_Backup_okay": "Резервное копирование успешно выполнено с новым архивом", - "BackDevices_DBTools_DelDevError_a": "Ошибка удаления устройства", - "BackDevices_DBTools_DelDevError_b": "Ошибка удаления устройств", - "BackDevices_DBTools_DelDev_a": "Устройство удалено", - "BackDevices_DBTools_DelDev_b": "Устройства удалены", - "BackDevices_DBTools_DelEvents": "События удалены", - "BackDevices_DBTools_DelEventsError": "Ошибка удаления событий", - "BackDevices_DBTools_ImportCSV": "Устройства из файла CSV были успешно импортированы.", - "BackDevices_DBTools_ImportCSVError": "Не удалось импортировать файл CSV. Убедитесь, что формат правильный.", - "BackDevices_DBTools_ImportCSVMissing": "CSV-файл не найден в/config/devices.csv.", - "BackDevices_DBTools_Purge": "Самые старые резервные копии были удалены", - "BackDevices_DBTools_UpdDev": "Устройство успешно обновлено", - "BackDevices_DBTools_UpdDevError": "Ошибка обновления устройства", - "BackDevices_DBTools_Upgrade": "База данных успешно обновлена", - "BackDevices_DBTools_UpgradeError": "Обновление базы данных не удалось", - "BackDevices_Device_UpdDevError": "Ошибка обновления устройств. Повторите попытку позже. Вероятно, база данных заблокирована из-за текущей задачи.", - "BackDevices_Restore_CopError": "Исходную базу данных сохранить не удалось.", - "BackDevices_Restore_Failed": "Восстановление не удалось. Пожалуйста, восстановите резервную копию вручную.", - "BackDevices_Restore_okay": "Восстановление выполнено успешно.", - "BackDevices_darkmode_disabled": "Темный режим отключен", - "BackDevices_darkmode_enabled": "Темный режим включен", - "DAYS_TO_KEEP_EVENTS_description": "Это настройка обслуживания. Здесь указывается количество дней, в течение которых будут храниться записи о событиях. Все старые мероприятия будут периодически удаляться. Также применимо к истории событий плагина.", - "DAYS_TO_KEEP_EVENTS_name": "Удалить события старше", - "DevDetail_Copy_Device_Title": " Скопировать данные с устройства", - "DevDetail_Copy_Device_Tooltip": "Скопируйте данные с устройства из раскрывающегося списка. Все на этой странице будет перезаписано", - "DevDetail_EveandAl_AlertAllEvents": "Оповещение обо всех событиях", - "DevDetail_EveandAl_AlertDown": "Оповещение о доступности", - "DevDetail_EveandAl_Archived": "Архив", - "DevDetail_EveandAl_NewDevice": "Новое устройство", - "DevDetail_EveandAl_NewDevice_Tooltip": "Будет показывать статус «Новое» для устройства и включать его в списки, когда фильтр «Новые устройства» активен. Не влияет на уведомления.", - "DevDetail_EveandAl_RandomMAC": "Случайный MAC-адрес", - "DevDetail_EveandAl_ScanCycle": "Сканировать устройство", - "DevDetail_EveandAl_ScanCycle_a": "Сканировать Устройство", - "DevDetail_EveandAl_ScanCycle_z": "Не сканировать устройство", + "About_Design": "\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d:", + "About_Exit": "\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f", + "About_Title": "\u0421\u0435\u0442\u0435\u0432\u0430\u044f \u0437\u0430\u0449\u0438\u0442\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c", + "AppEvents_DateTimeCreated": "\u0416\u0443\u0440\u043d\u0430\u043b", + "AppEvents_Extra": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e", + "AppEvents_GUID": "GUID \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f", + "AppEvents_Helper1": "\u041f\u043e\u043c\u043e\u0449\u043d\u0438\u043a 1", + "AppEvents_Helper2": "\u041f\u043e\u043c\u043e\u0449\u043d\u0438\u043a 2", + "AppEvents_Helper3": "\u041f\u043e\u043c\u043e\u0449\u043d\u0438\u043a 3", + "AppEvents_ObjectForeignKey": "\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043b\u044e\u0447", + "AppEvents_ObjectIndex": "\u0418\u043d\u0434\u0435\u043a\u0441", + "AppEvents_ObjectIsArchived": "\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e (\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443)", + "AppEvents_ObjectIsNew": "\u041d\u043e\u0432\u044b\u0439 (\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443)", + "AppEvents_ObjectPlugin": "\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d", + "AppEvents_ObjectPrimaryID": "\u041f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 ID", + "AppEvents_ObjectSecondaryID": "\u0412\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u0439 ID", + "AppEvents_ObjectStatus": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443)", + "AppEvents_ObjectStatusColumn": "\u041a\u043e\u043b\u043e\u043d\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f", + "AppEvents_ObjectType": "\u0422\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u0430", + "AppEvents_Plugin": "\u041f\u043b\u0430\u0433\u0438\u043d", + "AppEvents_Type": "\u0422\u0438\u043f", + "BackDevDetail_Actions_Ask_Run": "\u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435?", + "BackDevDetail_Actions_Not_Registered": "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e:\u00b7 ", + "BackDevDetail_Actions_Title_Run": "\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435", + "BackDevDetail_Copy_Ask": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0437 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 (\u0432\u0441\u0435 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e)?", + "BackDevDetail_Copy_Title": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0438", + "BackDevDetail_Tools_WOL_error": "\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u041d\u0415 \u0431\u044b\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", + "BackDevDetail_Tools_WOL_okay": "\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.", + "BackDevices_Arpscan_disabled": "Arp \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e", + "BackDevices_Arpscan_enabled": "Arp \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e", + "BackDevices_Backup_CopError": "\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c.", + "BackDevices_Backup_Failed": "\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e. \u0410\u0440\u0445\u0438\u0432 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d \u0438\u043b\u0438 \u043f\u0443\u0441\u0442.", + "BackDevices_Backup_okay": "\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0441 \u043d\u043e\u0432\u044b\u043c \u0430\u0440\u0445\u0438\u0432\u043e\u043c", + "BackDevices_DBTools_DelDevError_a": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", + "BackDevices_DBTools_DelDevError_b": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432", + "BackDevices_DBTools_DelDev_a": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e", + "BackDevices_DBTools_DelDev_b": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u044b", + "BackDevices_DBTools_DelEvents": "\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u044b", + "BackDevices_DBTools_DelEventsError": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439", + "BackDevices_DBTools_ImportCSV": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 CSV \u0431\u044b\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b.", + "BackDevices_DBTools_ImportCSVError": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b CSV. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439.", + "BackDevices_DBTools_ImportCSVMissing": "CSV-\u0444\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0432/config/devices.csv.", + "BackDevices_DBTools_Purge": "\u0421\u0430\u043c\u044b\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u0431\u044b\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u044b", + "BackDevices_DBTools_UpdDev": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e", + "BackDevices_DBTools_UpdDevError": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", + "BackDevices_DBTools_Upgrade": "\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430", + "BackDevices_DBTools_UpgradeError": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c", + "BackDevices_Device_UpdDevError": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438\u0437-\u0437\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.", + "BackDevices_Restore_CopError": "\u0418\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.", + "BackDevices_Restore_Failed": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0432\u0440\u0443\u0447\u043d\u0443\u044e.", + "BackDevices_Restore_okay": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e.", + "BackDevices_darkmode_disabled": "\u0422\u0435\u043c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d", + "BackDevices_darkmode_enabled": "\u0422\u0435\u043c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0432\u043a\u043b\u044e\u0447\u0435\u043d", + "DAYS_TO_KEEP_EVENTS_description": "\u042d\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043d\u0435\u0439, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445. \u0412\u0441\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f. \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e \u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043b\u0430\u0433\u0438\u043d\u0430.", + "DAYS_TO_KEEP_EVENTS_name": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u0442\u0430\u0440\u0448\u0435", + "DevDetail_Copy_Device_Title": " \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", + "DevDetail_Copy_Device_Tooltip": "\u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0437 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u0430. \u0412\u0441\u0435 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e", + "DevDetail_EveandAl_AlertAllEvents": "\u041e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445", + "DevDetail_EveandAl_AlertDown": "\u041e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438", + "DevDetail_EveandAl_Archived": "\u0410\u0440\u0445\u0438\u0432", + "DevDetail_EveandAl_NewDevice": "\u041d\u043e\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", + "DevDetail_EveandAl_NewDevice_Tooltip": "\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u00ab\u041d\u043e\u0432\u043e\u0435\u00bb \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u0444\u0438\u043b\u044c\u0442\u0440 \u00ab\u041d\u043e\u0432\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u00bb \u0430\u043a\u0442\u0438\u0432\u0435\u043d. \u041d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f.", + "DevDetail_EveandAl_RandomMAC": "\u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 MAC-\u0430\u0434\u0440\u0435\u0441", + "DevDetail_EveandAl_ScanCycle": "\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", + "DevDetail_EveandAl_ScanCycle_a": "\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", + "DevDetail_EveandAl_ScanCycle_z": "\u041d\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e", "DevDetail_EveandAl_Skip": "", "DevDetail_EveandAl_Title": "", "DevDetail_Events_CheckBox": "", @@ -175,6 +175,10 @@ "DevDetail_button_OverwriteIcons_Warning": "", "DevDetail_button_Reset": "", "DevDetail_button_Save": "", + "Device_MultiEdit": "", + "Device_MultiEdit_Backup": "", + "Device_MultiEdit_Fields": "", + "Device_MultiEdit_Tooltip": "", "Device_Searchbox": "", "Device_Shortcut_AllDevices": "", "Device_Shortcut_Archived": "", @@ -268,6 +272,7 @@ "Gen_Run": "", "Gen_Save": "", "Gen_Saved": "", + "Gen_Selected_Devices": "", "Gen_Switch": "", "Gen_Upd": "", "Gen_Upd_Fail": "", @@ -635,4 +640,4 @@ "settings_system_label": "", "test_event_icon": "", "test_event_tooltip": "" -} +} \ No newline at end of file