$srv) { $list[ $i ]['is_default'] = ($i === $default_idx) ? 1 : 0; } }; // --- Handle “make_default” from overview -------------------------------- if ('make_default' === $action) { // Verify nonce sent via query arg; dies on failure. check_admin_referer('aigude_server_make_default', 'nonce_set_default'); $index = isset($_GET['index']) ? (int) intval(wp_unslash($_GET['index'])) : -1; if ($index >= 0 && isset($servers[ $index ])) { $set_single_default($servers, $index); update_option($option_key, $servers); add_settings_error($messages_server, 'made_default', __('Default server updated.', 'aigude-tools'), 'updated'); $action = ''; $index = -1; } else { add_settings_error($messages_server, 'err', __('Invalid index while setting default.', 'aigude-tools'), 'error'); } } // --- Handle Add/Edit submit --------------------------------------------- if (isset($_POST['submit_ai_server'])) { // Verify form nonce; dies on failure. check_admin_referer($nonce_action, $nonce_name); // Capability fence if (! current_user_can('manage_options')) { wp_die(esc_html__('Insufficient permissions.', 'aigude-tools'), 403); } // Inputs $subaction = isset($_POST['ai_action']) ? sanitize_key(wp_unslash($_POST['ai_action'])) : 'add'; $server_type = isset($_POST['server']) ? sanitize_text_field(wp_unslash($_POST['server'])) : ''; $name = isset($_POST['name']) ? sanitize_text_field(wp_unslash($_POST['name'])) : ''; $api_key = isset($_POST['api_key']) ? sanitize_text_field(wp_unslash($_POST['api_key'])) : ''; $enabled = ! empty($_POST['enabled']) ? 1 : 0; $is_default = ! empty($_POST['is_default']) ? 1 : 0; // Validate $errors = array(); if ('' === $name) { $errors[] = __('Name cannot be empty.', 'aigude-tools'); } if ('' === $api_key) { $errors[] = __('API Key cannot be empty.', 'aigude-tools'); } if (! in_array($server_type, aigude_get_allowed_server_types(), true)) { $errors[] = __('Invalid server type.', 'aigude-tools'); } if (empty($errors)) { if ('edit' === $subaction) { $edit_index = isset($_POST['edit_index']) ? (int) intval(wp_unslash($_POST['edit_index'])) : -1; if (isset($servers[ $edit_index ])) { $servers[ $edit_index ] = array( 'server' => $server_type, 'name' => $name, 'api_key' => $api_key, 'enabled' => $enabled, 'is_default' => $is_default ? 1 : (int) ($servers[ $edit_index ]['is_default'] ?? 0), ); if ($is_default) { $set_single_default($servers, $edit_index); } add_settings_error($messages_server, 'updated', __('Server successfully updated.', 'aigude-tools'), 'updated'); } else { add_settings_error($messages_server, 'err', __('Invalid index while editing.', 'aigude-tools'), 'error'); } } else { // Add $servers[] = array( 'server' => $server_type, 'name' => $name, 'api_key' => $api_key, 'enabled' => $enabled, 'is_default' => $is_default ? 1 : 0, ); if ($is_default) { $set_single_default($servers, count($servers) - 1); } add_settings_error($messages_server, 'added', __('New server added.', 'aigude-tools'), 'updated'); } update_option($option_key, $servers); $action = ''; $index = -1; } else { foreach ($errors as $err) { add_settings_error($messages_server, 'err', $err, 'error'); } } } // --- Handle Delete from overview ---------------------------------------- if ('delete' === $action) { // Verify nonce sent via query arg; dies on failure. check_admin_referer('aigude_server_delete', 'nonce_delete'); $index = isset($_GET['index']) ? (int) intval(wp_unslash($_GET['index'])) : -1; if ($index >= 0 && isset($servers[ $index ])) { unset($servers[ $index ]); $servers = array_values($servers); // If no servers left, nothing to normalize. If there are, ensure at most one default remains. $found_default = false; foreach ($servers as $i => $srv) { if (! empty($srv['is_default'])) { if ($found_default) { $servers[ $i ]['is_default'] = 0; } $found_default = true; } } update_option($option_key, $servers); add_settings_error($messages_server, 'deleted', __('Server deleted.', 'aigude-tools'), 'updated'); $action = ''; $index = -1; } else { add_settings_error($messages_server, 'err', __('Invalid index for delete.', 'aigude-tools'), 'error'); } } // --- Handle context enrichment submit ------------------------------------ if (isset($_POST['submit_aigude_context'])) { check_admin_referer($context_nonce_action, $context_nonce_name); $rag_enabled = ! empty($_POST['aigude_rag_enabled']) ? '1' : '0'; update_option(AIGUDE_Context_Service::OPTION, $rag_enabled); add_settings_error($messages_context, 'context_saved', __('Context enrichment settings saved.', 'aigude-tools'), 'updated'); } // Translation provider selection is deprecated; no-op for submitted forms. if (isset($_POST['submit_translation_provider'])) { check_admin_referer($provider_nonce_action, $provider_nonce_name); add_settings_error($messages_provider, 'provider_deprecated', __('Translation provider settings are no longer used.', 'aigude-tools'), 'updated'); } // --- View ---------------------------------------------------------------- $active_tab = 'connections'; $page_url = menu_page_url('aigude-tools-settings', false); ?>

= 0 && isset($servers[ $index ])) : $srv = $servers[ $index ]; ?>

$srv) : $masked = str_repeat('*', max(4, strlen((string) ($srv['api_key'] ?? '')))); $enabled_icon = ! empty($srv['enabled']) ? '✔' : '✖'; $is_default = ! empty($srv['is_default']); $make_def_url = wp_nonce_url( add_query_arg(array( 'action' => 'make_default', 'index' => $i, 'tab' => 'connections' ), $page_url), 'aigude_server_make_default', 'nonce_set_default' ); $del_url = wp_nonce_url( add_query_arg(array( 'action' => 'delete', 'index' => $i, 'tab' => 'connections' ), $page_url), 'aigude_server_delete', 'nonce_delete' ); $edit_url = wp_nonce_url( add_query_arg(array( 'action' => 'edit', 'index' => $i, 'tab' => 'connections' ), $page_url), $nonce_edit_action, $nonce_edit_name ); ?>
★ – |

$info) : $label = class_exists('AIGUDE_Tools_Plugin') ? AIGUDE_Tools_Plugin::get_translation_provider_label($slug) : ucfirst($slug); $languages = class_exists('AIGUDE_Tools_Plugin') ? AIGUDE_Tools_Plugin::get_translation_languages($slug) : []; $notes = isset($info['notes']) ? (string) $info['notes'] : ''; $site_lang = class_exists('AIGUDE_Tools_Plugin') ? AIGUDE_Tools_Plugin::describe_site_language($slug) : ['label' => strtoupper(substr(get_locale(), 0, 2)), 'supported' => true, 'code' => '', 'source' => 'site']; $preference = null; if ($slug === $current_provider && class_exists('AIGUDE_Tools_Plugin')) { $preference = AIGUDE_Tools_Plugin::describe_language_preference($slug); } $site_supported = ! empty($site_lang['supported']); $badge_class = $site_supported ? 'supported' : 'missing'; $badge_icon = $site_supported ? 'dashicons-yes-alt' : 'dashicons-warning'; $select_id = 'aigude-provider-lang-' . sanitize_html_class($slug); $selected_lang = ($slug === $current_provider) ? $saved_target_language : 'default'; if ($selected_lang !== 'default' && ! isset($languages[$selected_lang])) { $selected_lang = 'default'; } $recent_langs_provider = class_exists('AIGUDE_Tools_Plugin') ? AIGUDE_Tools_Plugin::get_recent_langs('target', $slug) : []; $recent_langs_provider = array_values(array_filter((array) $recent_langs_provider, static function ($code) use ($languages) { return is_string($code) && isset($languages[$code]); })); $fallback_code = ''; if (!$site_supported) { if (isset($languages['EN'])) { $fallback_code = 'EN'; } else { $resolved = AIGUDE_Tools_Plugin::resolve_target_lang_code('default', $slug); if ($resolved !== '' && isset($languages[$resolved])) { $fallback_code = $resolved; } } } if ($selected_lang === 'default' && empty($recent_langs_provider)) { $site_code = isset($site_lang['code']) ? (string) $site_lang['code'] : ''; if ($site_supported && $site_code !== '' && isset($languages[$site_code])) { $selected_lang = $site_code; } elseif ($fallback_code !== '' && isset($languages[$fallback_code])) { $selected_lang = $fallback_code; } elseif (!empty($languages)) { $first_code = array_key_first($languages); if ($first_code) { $selected_lang = $first_code; } } } $summary_text = ''; if ($slug === $current_provider) { if ($preference && $preference['source'] === 'user' && ! empty($preference['supported'])) { $summary_text = sprintf($language_summary_tpl_user, $preference['label']); } elseif ($preference && $preference['source'] === 'user') { $summary_text = sprintf($language_summary_tpl_missing, $preference['label']); } else { $summary_text = sprintf($language_summary_tpl_site, $site_lang['label']); } } ?>
style="border-color:#2271b1;">