$post_type_object) { if (! in_array($post_type, (array) $settings['post_types'], true)) { continue; } add_filter('manage_' . $post_type . '_posts_columns', array($this, 'add_column')); add_filter('manage_edit-' . $post_type . '_sortable_columns', array($this, 'add_sortable_column')); add_action('manage_' . $post_type . '_posts_custom_column', array($this, 'render_column'), 10, 2); } } /** * Render onboarding notice after activation. * * @return void */ public function render_onboarding_notice() { if (! current_user_can('manage_options')) { return; } if ('1' !== (string) get_option('a360_insights_show_onboarding', '')) { return; } $screen = function_exists('get_current_screen') ? get_current_screen() : null; $screen_id = $screen ? (string) $screen->id : ''; $allowed_screens = array( 'dashboard', 'plugins', 'toplevel_page_a360-insights', 'a360-insights_page_a360-insights-settings', ); if (! in_array($screen_id, $allowed_screens, true)) { return; } $dismiss_url = wp_nonce_url( admin_url('admin-post.php?action=a360_insights_dismiss_onboarding'), 'a360_insights_dismiss_onboarding' ); ?>

string('views')) . '" aria-label="' . esc_attr($this->string('views')) . '">'; return $columns; } /** * Make views column sortable. * * @param array $columns Sortable columns. * @return array */ public function add_sortable_column($columns) { $columns['a360_insights_views'] = 'a360_insights_views'; return $columns; } /** * Render column. * * @param string $column Column. * @param int $post_id Post ID. * @return void */ public function render_column($column, $post_id) { if ('a360_insights_views' !== $column) { return; } $total = A360_Insights_DB::get_total_views($post_id); printf( '', absint($post_id), esc_attr(get_the_title($post_id)), absint($total) ); } /** * Handle sorting by views column. * * @param WP_Query $query Query object. * @return void */ public function handle_views_sorting($query) { if (! is_admin() || ! $query->is_main_query()) { return; } if ('a360_insights_views' !== $query->get('orderby')) { return; } add_filter('posts_clauses', array($this, 'sort_by_views_clauses'), 10, 2); } /** * Modify posts query to sort by total views. * * @param array $clauses Query clauses. * @param WP_Query $query Query object. * @return array */ public function sort_by_views_clauses($clauses, $query) { if ('a360_insights_views' !== $query->get('orderby')) { return $clauses; } global $wpdb; $table_name = A360_Insights_DB::table_name(); $order = 'ASC' === strtoupper((string) $query->get('order')) ? 'ASC' : 'DESC'; $clauses['join'] .= " LEFT JOIN ( SELECT post_id, COUNT(*) AS a360_views FROM {$table_name} GROUP BY post_id ) AS a360_counts ON {$wpdb->posts}.ID = a360_counts.post_id"; $clauses['orderby'] = "COALESCE(a360_counts.a360_views, 0) {$order}, {$wpdb->posts}.post_date DESC"; return $clauses; } /** * Enqueue admin assets. * * @param string $hook Hook. * @return void */ public function enqueue_assets($hook) { $is_posts_screen = 'edit.php' === $hook; $is_dashboard = 'index.php' === $hook; $is_settings_screen = in_array($hook, array( 'toplevel_page_a360-insights', 'a360-insights_page_a360-insights-settings', ), true); if (! $is_posts_screen && ! $is_dashboard && ! $is_settings_screen) { return; } wp_enqueue_script( 'chart-js', A360_INSIGHTS_URL . 'assets/chart.js', array(), '4.5.1', true ); wp_enqueue_style('a360-insights-admin', A360_INSIGHTS_URL . 'assets/admin.css', array(), A360_INSIGHTS_VERSION); wp_enqueue_script('a360-insights-admin', A360_INSIGHTS_URL . 'assets/admin.js', array('jquery', 'chart-js'), A360_INSIGHTS_VERSION, true); wp_localize_script( 'a360-insights-admin', 'a360Insights', array( 'ajaxUrl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('a360_insights_stats'), 'sourceNonce' => wp_create_nonce('a360_insights_source_stats'), 'resetNonce' => wp_create_nonce('a360_insights_reset'), 'searchNonce' => wp_create_nonce('a360_insights_search_content'), 'trendNonce' => wp_create_nonce('a360_insights_dashboard_trend'), 'today' => current_time('Y-m-d'), 'i18n' => $this->i18n(), ) ); } /** * AJAX stats endpoint. * * @return void */ public function ajax_stats() { check_ajax_referer('a360_insights_stats', 'nonce'); if (! current_user_can('edit_posts')) { wp_send_json_error(array('message' => __('Permission denied.', 'a360-insights')), 403); } $post_id = isset($_POST['postId']) ? absint($_POST['postId']) : 0; $range = isset($_POST['range']) ? sanitize_key(wp_unslash($_POST['range'])) : 'month'; $anchor = isset($_POST['anchor']) ? sanitize_text_field(wp_unslash($_POST['anchor'])) : ''; if (! $post_id || ! current_user_can('edit_post', $post_id)) { wp_send_json_error(array('message' => __('Invalid post.', 'a360-insights')), 400); } wp_send_json_success( array( 'stats' => A360_Insights_DB::get_stats($post_id, $range, $anchor), 'exportUrl' => admin_url('admin-post.php'), 'export' => array( 'action' => 'a360_insights_export_csv', 'post_id' => $post_id, 'nonce' => wp_create_nonce('a360_insights_export_' . $post_id), ), ) ); } /** * AJAX source stats endpoint. * * @return void */ public function ajax_source_stats() { check_ajax_referer('a360_insights_source_stats', 'nonce'); if (! current_user_can('edit_posts')) { wp_send_json_error(array('message' => __('Permission denied.', 'a360-insights')), 403); } $source = isset($_POST['source']) ? sanitize_key(wp_unslash($_POST['source'])) : ''; $range = isset($_POST['range']) ? sanitize_key(wp_unslash($_POST['range'])) : 'month'; $anchor = isset($_POST['anchor']) ? sanitize_text_field(wp_unslash($_POST['anchor'])) : ''; if ('' === $source) { wp_send_json_error(array('message' => __('Invalid source.', 'a360-insights')), 400); } wp_send_json_success( array( 'stats' => A360_Insights_DB::get_source_stats($source, $range, $anchor), ) ); } /** * AJAX reset endpoint. * * @return void */ public function ajax_reset() { check_ajax_referer('a360_insights_reset', 'nonce'); $post_id = isset($_POST['postId']) ? absint($_POST['postId']) : 0; $scope = isset($_POST['scope']) ? sanitize_key(wp_unslash($_POST['scope'])) : 'post'; if ('all' === $scope) { if (! current_user_can('manage_options')) { wp_send_json_error(array('message' => __('Permission denied.', 'a360-insights')), 403); } A360_Insights_DB::reset_all_views(); wp_send_json_success( array( 'message' => __('All counters have been reset.', 'a360-insights'), ) ); } if (! $post_id || ! current_user_can('edit_post', $post_id)) { wp_send_json_error(array('message' => __('Invalid post.', 'a360-insights')), 400); } A360_Insights_DB::reset_post_views($post_id); wp_send_json_success( array( 'message' => __('Counter has been reset.', 'a360-insights'), ) ); } /** * AJAX content search for settings page. * * @return void */ public function ajax_search_content() { check_ajax_referer('a360_insights_search_content', 'nonce'); if (! current_user_can('manage_options')) { wp_send_json_error(array('message' => __('Permission denied.', 'a360-insights')), 403); } $term = isset($_GET['term']) ? sanitize_text_field(wp_unslash($_GET['term'])) : ''; if (strlen($term) < 2) { wp_send_json_success(array('items' => array())); } $query = new WP_Query( array( 'post_type' => array_keys(A360_Insights_Settings::public_post_types()), 'post_status' => array('publish', 'draft', 'pending', 'private'), 's' => $term, 'posts_per_page' => 20, 'orderby' => 'relevance', 'order' => 'DESC', 'no_found_rows' => true, 'update_post_meta_cache' => false, 'update_post_term_cache' => false, ) ); $items = array(); foreach ($query->posts as $post) { $items[] = $this->format_content_item($post); } wp_send_json_success(array('items' => $items)); } /** * AJAX dashboard trend endpoint. * * @return void */ public function ajax_dashboard_trend() { check_ajax_referer('a360_insights_dashboard_trend', 'nonce'); if (! current_user_can('manage_options')) { wp_send_json_error(array('message' => __('Permission denied.', 'a360-insights')), 403); } $range = isset($_POST['range']) ? sanitize_key(wp_unslash($_POST['range'])) : 'month'; $offset = isset($_POST['offset']) ? absint(wp_unslash($_POST['offset'])) : 0; $source_filter = isset($_POST['source']) ? sanitize_key(wp_unslash($_POST['source'])) : ''; $referrer_filter = isset($_POST['referrer']) ? sanitize_text_field(wp_unslash($_POST['referrer'])) : ''; $allowed_ranges = array('day', 'week', 'month', 'year'); if (! in_array($range, $allowed_ranges, true)) { $range = 'month'; } wp_send_json_success( array( 'points' => A360_Insights_DB::get_traffic_trend($range, $offset, $source_filter, $referrer_filter), 'chartType' => 'day' === $range ? 'bar' : 'line', 'filterLabel' => $this->dashboard_filter_label($source_filter, $referrer_filter), ) ); } /** * Dashboard chart filter label. * * @param string $source_filter Source filter. * @param string $referrer_filter Referrer filter. * @return string */ private function dashboard_filter_label($source_filter, $referrer_filter) { if ($source_filter) { return ucwords(str_replace(array('-', '_'), ' ', $source_filter)); } return (string) $referrer_filter; } /** * Format post for settings selector. * * @param WP_Post|int $post Post object or ID. * @return array|null */ private function format_content_item($post) { $post = get_post($post); if (! $post) { return null; } $post_type_object = get_post_type_object($post->post_type); $type_label = $post_type_object ? $post_type_object->labels->singular_name : $post->post_type; $title = get_the_title($post); if ('' === $title) { $title = __('(no title)', 'a360-insights'); } return array( 'id' => absint($post->ID), 'title' => html_entity_decode($title, ENT_QUOTES, get_bloginfo('charset')), 'type' => html_entity_decode($type_label, ENT_QUOTES, get_bloginfo('charset')), 'edit' => get_edit_post_link($post->ID, ''), ); } /** * Get selected content items for the settings page. * * @param array $ids Post IDs. * @return array */ private function get_selected_content_items($ids) { $items = array(); foreach (array_map('absint', (array) $ids) as $post_id) { $item = $this->format_content_item($post_id); if ($item) { $items[] = $item; } } return $items; } /** * Register WordPress dashboard widget. * * @return void */ public function register_dashboard_widget() { if (! current_user_can('edit_posts')) { return; } wp_add_dashboard_widget( 'a360_insights_dashboard_widget', __('A360 Insights', 'a360-insights'), array($this, 'render_dashboard_widget') ); } /** * Render WordPress dashboard widget. * * @return void */ public function render_dashboard_widget() { if (! current_user_can('edit_posts')) { return; } $summary = A360_Insights_DB::get_dashboard_summary(); ?>
%
render_dashboard_list(__('Top AI sources', 'a360-insights'), $summary['top_ai_sources'] ?? array(), 'ai_sources'); ?> render_dashboard_list(__('Top content', 'a360-insights'), $summary['top_content'] ?? array(), 'content'); ?> render_dashboard_list(__('Top campaigns', 'a360-insights'), $summary['top_campaigns'] ?? array(), 'campaigns'); ?> render_dashboard_list(__('Top sources', 'a360-insights'), $summary['top_sources'] ?? array(), 'sources'); ?>

empty_state_message($type)); ?>

__('AI visits will appear here when visitors arrive from ChatGPT, Copilot, Gemini and other AI assistants.', 'a360-insights'), 'content' => __('Top content will appear here after tracked pages or posts receive visits.', 'a360-insights'), 'campaigns' => __('Campaigns will appear here when UTM parameters are detected in incoming visits.', 'a360-insights'), 'sources' => __('Traffic channels will appear here as soon as A360 Insights records visits.', 'a360-insights'), 'referrers' => __('Referral domains will appear here when visitors come from external websites.', 'a360-insights'), ); return isset($messages[$type]) ? $messages[$type] : __('No data yet.', 'a360-insights'); } /** * Render dashboard empty state. * * @param string $title Empty state title. * @param string $message Empty state message. * @return void */ private function render_empty_state($title, $message) { ?>
'array', 'sanitize_callback' => array('A360_Insights_Settings', 'sanitize'), 'default' => A360_Insights_Settings::defaults(), ) ); } private function source_icon($source) { $source = strtolower((string) $source); if (false !== strpos($source, 'codex')) { return 'CX'; } if (false !== strpos($source, 'chatgpt') || false !== strpos($source, 'openai')) { return 'AI'; } if (false !== strpos($source, 'gemini')) { return '✦'; } if (false !== strpos($source, 'copilot')) { return 'C'; } if (false !== strpos($source, 'perplexity')) { return 'P'; } if (false !== strpos($source, 'claude')) { return 'C'; } if (false !== strpos($source, 'meta_ai')) { return 'M'; } if (false !== strpos($source, 'mistral')) { return 'M'; } if ('you' === $source || false !== strpos($source, 'you.com')) { return 'Y'; } if (false !== strpos($source, 'poe')) { return 'P'; } if (false !== strpos($source, 'phind')) { return 'P'; } if (false !== strpos($source, 'deepseek')) { return 'D'; } if (false !== strpos($source, 'grok')) { return 'G'; } if (false !== strpos($source, 'google')) { return 'G'; } if (false !== strpos($source, 'facebook')) { return 'f'; } if (false !== strpos($source, 'youtube')) { return '▶'; } if (false !== strpos($source, 'bing')) { return 'b'; } if (false !== strpos($source, 'direct')) { return '↗'; } return '•'; } public function render_dashboard_page() { if (! current_user_can('manage_options')) { return; } // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only admin filters, no data is changed. $range = isset($_GET['range']) // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only admin filters, no data is changed. ? sanitize_key(wp_unslash($_GET['range'])) : 'month'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only admin filters, no data is changed. $offset = isset($_GET['offset']) // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only admin filters, no data is changed. ? absint(wp_unslash($_GET['offset'])) : 0; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only admin filters, no data is changed. $source_filter = isset($_GET['source']) // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only admin filters, no data is changed. ? sanitize_key(wp_unslash($_GET['source'])) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only admin filters, no data is changed. $referrer_filter = isset($_GET['referrer']) // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only admin filters, no data is changed. ? sanitize_text_field(wp_unslash($_GET['referrer'])) : ''; $allowed_ranges = array('day', 'week', 'month', 'year'); if (! in_array($range, $allowed_ranges, true)) { $range = 'month'; } $kpi = A360_Insights_DB::get_dashboard_kpi($range, $offset); $total_views = (int) $kpi['total_views']; $ai_views = (int) $kpi['ai_views']; $search_views = (int) $kpi['search_views']; $referral_views = (int) $kpi['referral_views']; $top_ai_sources = A360_Insights_DB::get_top_ai_sources(5, $range, $offset); $ai_sources_overview = A360_Insights_DB::get_ai_sources_overview($range, $offset); $top_referrers = A360_Insights_DB::get_top_referrers(8, $range, $offset); $top_content = A360_Insights_DB::get_top_content(8, $range, $offset); $ai_percent = $total_views > 0 ? round(($ai_views / $total_views) * 100, 1) : 0; $search_percent = $total_views > 0 ? round(($search_views / $total_views) * 100, 1) : 0; $referral_percent = $total_views > 0 ? round(($referral_views / $total_views) * 100, 1) : 0; $daily_views = A360_Insights_DB::get_traffic_trend($range, $offset, $source_filter, $referrer_filter); // $site_trend = A360_Insights_DB::get_daily_views_by_type('site', $range, $offset); // $ai_trend = A360_Insights_DB::get_daily_views_by_type('ai', $range, $offset); // $search_trend = A360_Insights_DB::get_daily_views_by_type('search', $range, $offset); // $referral_trend = A360_Insights_DB::get_daily_views_by_type('referral', $range, $offset); $trend_label = array( 'day' => __('Today by hour', 'a360-insights'), 'week' => __('Last 7 days', 'a360-insights'), 'month' => __('Last 30 days', 'a360-insights'), 'year' => __('Last 12 months', 'a360-insights'), ); $trend_label = isset($trend_label[$range]) ? $trend_label[$range] : __('Last 30 days', 'a360-insights'); $period_label = A360_Insights_DB::get_period_label($range, $offset); ?>

__('Day', 'a360-insights'), 'week' => __('Week', 'a360-insights'), 'month' => __('Month', 'a360-insights'), 'year' => __('Year', 'a360-insights'), ); foreach ($ranges as $range_key => $range_label_item) : $url = add_query_arg( array( 'page' => 'a360-insights', 'range' => $range_key, 'offset' => 0, 'source' => $source_filter ? $source_filter : false, 'referrer' => $referrer_filter ? $referrer_filter : false, ), admin_url('admin.php') ); ?>
‹ 0) : ?> › ›
📊
🤖
%
🔍
%
🔗
%
0) { printf( /* translators: 1: source name, 2: views. */ esc_html__('Top source: %1$s with %2$s views', 'a360-insights'), esc_html(ucwords(str_replace(array('-', '_'), ' ', $top_source))), esc_html(number_format_i18n($top_views)) ); } else { echo esc_html__('No AI sources detected in this period yet.', 'a360-insights'); } ?>
'a360-insights', 'range' => $range, 'offset' => $offset, 'source' => $source_key, 'referrer' => false, ), admin_url('admin.php') ); ?> source_icon($source_key)); ?>

source_icon($row['source'])); ?>
render_empty_state( __('No AI traffic yet', 'a360-insights'), $this->empty_state_message('ai_sources') ); ?>

source_icon($row['source'])); ?>
render_empty_state( __('No referrers yet', 'a360-insights'), $this->empty_state_message('referrers') ); ?>

render_empty_state( __('No content views yet', 'a360-insights'), $this->empty_state_message('content') ); ?>
> dashboard_filter_label($source_filter, $referrer_filter)); ?>

get_selected_content_items((array) $settings['selected_post_ids']); $selected_ids = implode(',', array_map('absint', (array) $settings['selected_post_ids'])); $selected_post_type_count = count((array) $settings['post_types']); $selected_content_count = count((array) $settings['selected_post_ids']); $status_item_label = __('Selected items', 'a360-insights'); $status_item_count = $selected_content_count; if ('all' === $settings['tracking_mode']) { $status_item_label = __('Tracked post types', 'a360-insights'); $status_item_count = $selected_post_type_count; } elseif ('exclude' === $settings['tracking_mode']) { $status_item_label = __('Excluded items', 'a360-insights'); $status_item_count = $selected_content_count; } ?>

'a360-insights', 'a360_reset' => 'success', ), admin_url('options-general.php') ) ); exit; } /** * Get translated UI string. * * @param string $key String key. * @return string */ private function string($key) { $strings = $this->strings(); return isset($strings[$key]) ? $strings[$key] : $key; } /** * UI strings. * * Uses plugin-side fallback translations because JS/localized strings * require compiled language files on WordPress.org installations. * * @return array */ private function i18n() { return $this->strings(); } /** * Get UI strings for supported locales. * * @return array */ private function strings() { $locale = function_exists('determine_locale') ? determine_locale() : get_locale(); $lang = strtolower(substr((string) $locale, 0, 2)); $en = array( 'title' => 'Post statistics', 'sourceTitle' => 'Source statistics', 'total' => 'Total views', 'overview' => 'Overview', 'sources' => 'Sources', 'campaigns' => 'Campaigns', 'medium' => 'Medium', 'trafficChannels' => 'Traffic channels', 'campaignsHint' => 'UTM campaigns detected for this content in the selected period.', 'day' => 'Day', 'week' => 'Week', 'month' => 'Month', 'year' => 'Year', 'topReferrers' => 'Top referrers', 'topContent' => 'Top content', 'recent' => 'Recent visits', 'source' => 'Source', 'contentTitle' => 'Title', 'views' => 'Views', 'date' => 'Date', 'campaign' => 'Campaign', 'exportCsv' => 'Export CSV', 'noData' => 'No data yet.', 'noCampaignsTitle' => 'No campaigns yet', 'noCampaignsText' => 'UTM campaigns will appear here when incoming visits include campaign parameters.', 'noReferrersTitle' => 'No referrers yet', 'noReferrersText' => 'Referral domains will appear here when visitors come from external websites.', 'noRecentTitle' => 'No recent visits yet', 'noRecentText' => 'Recent visits will appear here after A360 Insights records traffic for this period.', 'noSourceContentTitle' => 'No content yet', 'noSourceContentText' => 'Top content for this source will appear here after matching visits are recorded.', 'close' => 'Close', 'loading' => 'Loading…', 'previous' => 'Previous', 'next' => 'Next', 'today' => 'Today', 'thisWeek' => 'This week', 'thisMonth' => 'This month', 'resetPost' => 'Reset this counter', 'resetAll' => 'Reset all counters', 'confirmPost' => 'Reset counter for this post? This cannot be undone.', 'confirmAll' => 'Reset counters for all posts and pages? This cannot be undone.', 'resetDone' => 'Counter reset completed.', ); $translations = array( 'pl' => array( 'title' => 'Statystyki wpisu', 'sourceTitle' => 'Statystyki źródła', 'total' => 'Łączna liczba odsłon', 'overview' => 'Przegląd', 'sources' => 'Źródła', 'campaigns' => 'Kampanie', 'medium' => 'Medium', 'trafficChannels' => 'Kanały ruchu', 'campaignsHint' => 'Kampanie UTM wykryte dla tej treści w wybranym okresie.', 'day' => 'Dzień', 'week' => 'Tydzień', 'month' => 'Miesiąc', 'year' => 'Rok', 'topReferrers' => 'Najlepsze źródła', 'topContent' => 'Najlepsze treści', 'recent' => 'Ostatnie wejścia', 'source' => 'Źródło', 'contentTitle' => 'Tytuł', 'views' => 'Odsłony', 'date' => 'Data', 'campaign' => 'Kampania', 'exportCsv' => 'Eksport CSV', 'noData' => 'Brak danych.', 'noCampaignsTitle' => 'Brak kampanii', 'noCampaignsText' => 'Kampanie UTM pojawią się tutaj, gdy wejścia będą zawierać parametry kampanii.', 'noReferrersTitle' => 'Brak źródeł', 'noReferrersText' => 'Domeny odsyłające pojawią się tutaj, gdy odwiedzający przyjdą z zewnętrznych stron.', 'noRecentTitle' => 'Brak ostatnich wejść', 'noRecentText' => 'Ostatnie wejścia pojawią się tutaj po zarejestrowaniu ruchu dla wybranego okresu.', 'noSourceContentTitle' => 'Brak treści', 'noSourceContentText' => 'Najlepsze treści dla tego źródła pojawią się tutaj po zarejestrowaniu pasujących wejść.', 'close' => 'Zamknij', 'loading' => 'Ładowanie…', 'previous' => 'Poprzedni', 'next' => 'Następny', 'today' => 'Dzisiaj', 'thisWeek' => 'Ten tydzień', 'thisMonth' => 'Ten miesiąc', 'resetPost' => 'Resetuj ten licznik', 'resetAll' => 'Resetuj wszystkie liczniki', 'confirmPost' => 'Zresetować licznik dla tego wpisu? Tej operacji nie można cofnąć.', 'confirmAll' => 'Zresetować liczniki dla wszystkich wpisów i stron? Tej operacji nie można cofnąć.', 'resetDone' => 'Reset licznika zakończony.', ), 'de' => array( 'title' => 'Beitragsstatistiken', 'sourceTitle' => 'Quellenstatistiken', 'total' => 'Aufrufe insgesamt', 'overview' => 'Übersicht', 'sources' => 'Quellen', 'campaigns' => 'Kampagnen', 'medium' => 'Medium', 'trafficChannels' => 'Traffic-Kanäle', 'campaignsHint' => 'UTM-Kampagnen für diesen Inhalt im ausgewählten Zeitraum.', 'day' => 'Tag', 'week' => 'Woche', 'month' => 'Monat', 'year' => 'Jahr', 'topReferrers' => 'Top-Referrer', 'topContent' => 'Top-Inhalte', 'recent' => 'Letzte Besuche', 'source' => 'Quelle', 'contentTitle' => 'Titel', 'views' => 'Aufrufe', 'date' => 'Datum', 'campaign' => 'Kampagne', 'exportCsv' => 'CSV exportieren', 'noData' => 'Noch keine Daten.', 'noCampaignsTitle' => 'Noch keine Kampagnen', 'noCampaignsText' => 'UTM-Kampagnen erscheinen hier, sobald Besuche Kampagnenparameter enthalten.', 'noReferrersTitle' => 'Noch keine Referrer', 'noReferrersText' => 'Verweisende Domains erscheinen hier, wenn Besucher von externen Websites kommen.', 'noRecentTitle' => 'Noch keine letzten Besuche', 'noRecentText' => 'Letzte Besuche erscheinen hier, sobald A360 Insights Traffic für diesen Zeitraum erfasst.', 'noSourceContentTitle' => 'Noch keine Inhalte', 'noSourceContentText' => 'Top-Inhalte für diese Quelle erscheinen hier, sobald passende Besuche erfasst werden.', 'close' => 'Schließen', 'loading' => 'Wird geladen…', 'previous' => 'Zurück', 'next' => 'Weiter', 'today' => 'Heute', 'thisWeek' => 'Diese Woche', 'thisMonth' => 'Dieser Monat', 'resetPost' => 'Diesen Zähler zurücksetzen', 'resetAll' => 'Alle Zähler zurücksetzen', 'confirmPost' => 'Zähler für diesen Beitrag zurücksetzen? Dies kann nicht rückgängig gemacht werden.', 'confirmAll' => 'Zähler für alle Beiträge und Seiten zurücksetzen? Dies kann nicht rückgängig gemacht werden.', 'resetDone' => 'Zähler wurde zurückgesetzt.', ), 'fr' => array( 'title' => 'Statistiques de l’article', 'sourceTitle' => 'Statistiques de la source', 'total' => 'Vues totales', 'overview' => 'Vue d’ensemble', 'sources' => 'Sources', 'campaigns' => 'Campagnes', 'medium' => 'Medium', 'trafficChannels' => 'Canaux de trafic', 'campaignsHint' => 'Campagnes UTM détectées pour ce contenu sur la période sélectionnée.', 'day' => 'Jour', 'week' => 'Semaine', 'month' => 'Mois', 'year' => 'Année', 'topReferrers' => 'Principaux référents', 'topContent' => 'Contenus principaux', 'recent' => 'Visites récentes', 'source' => 'Source', 'contentTitle' => 'Titre', 'views' => 'Vues', 'date' => 'Date', 'campaign' => 'Campagne', 'exportCsv' => 'Exporter CSV', 'noData' => 'Aucune donnée.', 'noCampaignsTitle' => 'Aucune campagne pour le moment', 'noCampaignsText' => 'Les campagnes UTM apparaîtront ici lorsque les visites entrantes contiendront des paramètres de campagne.', 'noReferrersTitle' => 'Aucun référent pour le moment', 'noReferrersText' => 'Les domaines référents apparaîtront ici lorsque les visiteurs viendront de sites externes.', 'noRecentTitle' => 'Aucune visite récente', 'noRecentText' => 'Les visites récentes apparaîtront ici après l’enregistrement du trafic pour cette période.', 'noSourceContentTitle' => 'Aucun contenu pour le moment', 'noSourceContentText' => 'Les contenus principaux pour cette source apparaîtront ici après l’enregistrement de visites correspondantes.', 'close' => 'Fermer', 'loading' => 'Chargement…', 'previous' => 'Précédent', 'next' => 'Suivant', 'today' => 'Aujourd’hui', 'thisWeek' => 'Cette semaine', 'thisMonth' => 'Ce mois-ci', 'resetPost' => 'Réinitialiser ce compteur', 'resetAll' => 'Réinitialiser tous les compteurs', 'confirmPost' => 'Réinitialiser le compteur de cet article ? Cette action est irréversible.', 'confirmAll' => 'Réinitialiser les compteurs de tous les articles et pages ? Cette action est irréversible.', 'resetDone' => 'Compteur réinitialisé.', ), 'es' => array( 'title' => 'Estadísticas de la entrada', 'sourceTitle' => 'Estadísticas de la fuente', 'total' => 'Vistas totales', 'overview' => 'Resumen', 'sources' => 'Fuentes', 'campaigns' => 'Campañas', 'medium' => 'Medio', 'trafficChannels' => 'Canales de tráfico', 'campaignsHint' => 'Campañas UTM detectadas para este contenido en el periodo seleccionado.', 'day' => 'Día', 'week' => 'Semana', 'month' => 'Mes', 'year' => 'Año', 'topReferrers' => 'Principales referentes', 'topContent' => 'Contenido principal', 'recent' => 'Visitas recientes', 'source' => 'Fuente', 'contentTitle' => 'Título', 'views' => 'Vistas', 'date' => 'Fecha', 'campaign' => 'Campaña', 'exportCsv' => 'Exportar CSV', 'noData' => 'Sin datos todavía.', 'noCampaignsTitle' => 'Aún no hay campañas', 'noCampaignsText' => 'Las campañas UTM aparecerán aquí cuando las visitas entrantes incluyan parámetros de campaña.', 'noReferrersTitle' => 'Aún no hay referentes', 'noReferrersText' => 'Los dominios de referencia aparecerán aquí cuando los visitantes lleguen desde sitios externos.', 'noRecentTitle' => 'Aún no hay visitas recientes', 'noRecentText' => 'Las visitas recientes aparecerán aquí después de que A360 Insights registre tráfico para este periodo.', 'noSourceContentTitle' => 'Aún no hay contenido', 'noSourceContentText' => 'El contenido principal para esta fuente aparecerá aquí después de registrar visitas coincidentes.', 'close' => 'Cerrar', 'loading' => 'Cargando…', 'previous' => 'Anterior', 'next' => 'Siguiente', 'today' => 'Hoy', 'thisWeek' => 'Esta semana', 'thisMonth' => 'Este mes', 'resetPost' => 'Restablecer este contador', 'resetAll' => 'Restablecer todos los contadores', 'confirmPost' => '¿Restablecer el contador de esta entrada? Esta acción no se puede deshacer.', 'confirmAll' => '¿Restablecer los contadores de todas las entradas y páginas? Esta acción no se puede deshacer.', 'resetDone' => 'Contador restablecido.', ), 'nl' => array( 'title' => 'Berichtstatistieken', 'sourceTitle' => 'Bronstatistieken', 'total' => 'Totaal aantal weergaven', 'overview' => 'Overzicht', 'sources' => 'Bronnen', 'campaigns' => 'Campagnes', 'medium' => 'Medium', 'trafficChannels' => 'Verkeerskanalen', 'campaignsHint' => 'UTM-campagnes die voor deze inhoud in de geselecteerde periode zijn gedetecteerd.', 'day' => 'Dag', 'week' => 'Week', 'month' => 'Maand', 'year' => 'Jaar', 'topReferrers' => 'Topverwijzers', 'topContent' => 'Topinhoud', 'recent' => 'Recente bezoeken', 'source' => 'Bron', 'contentTitle' => 'Titel', 'views' => 'Weergaven', 'date' => 'Datum', 'campaign' => 'Campagne', 'exportCsv' => 'CSV exporteren', 'noData' => 'Nog geen gegevens.', 'noCampaignsTitle' => 'Nog geen campagnes', 'noCampaignsText' => 'UTM-campagnes verschijnen hier wanneer inkomende bezoeken campagneparameters bevatten.', 'noReferrersTitle' => 'Nog geen verwijzers', 'noReferrersText' => 'Verwijzende domeinen verschijnen hier wanneer bezoekers vanaf externe websites komen.', 'noRecentTitle' => 'Nog geen recente bezoeken', 'noRecentText' => 'Recente bezoeken verschijnen hier nadat A360 Insights verkeer voor deze periode heeft geregistreerd.', 'noSourceContentTitle' => 'Nog geen inhoud', 'noSourceContentText' => 'Topinhoud voor deze bron verschijnt hier nadat overeenkomende bezoeken zijn geregistreerd.', 'close' => 'Sluiten', 'loading' => 'Laden…', 'previous' => 'Vorige', 'next' => 'Volgende', 'today' => 'Vandaag', 'thisWeek' => 'Deze week', 'thisMonth' => 'Deze maand', 'resetPost' => 'Deze teller resetten', 'resetAll' => 'Alle tellers resetten', 'confirmPost' => 'Teller voor dit bericht resetten? Dit kan niet ongedaan worden gemaakt.', 'confirmAll' => 'Tellers voor alle berichten en pagina’s resetten? Dit kan niet ongedaan worden gemaakt.', 'resetDone' => 'Teller gereset.', ), 'pt' => array( 'title' => 'Estatísticas do post', 'sourceTitle' => 'Estatísticas da fonte', 'total' => 'Total de visualizações', 'overview' => 'Visão geral', 'sources' => 'Fontes', 'campaigns' => 'Campanhas', 'medium' => 'Meio', 'trafficChannels' => 'Canais de tráfego', 'campaignsHint' => 'Campanhas UTM detectadas para este conteúdo no período selecionado.', 'day' => 'Dia', 'week' => 'Semana', 'month' => 'Mês', 'year' => 'Ano', 'topReferrers' => 'Principais referenciadores', 'topContent' => 'Conteúdo principal', 'recent' => 'Visitas recentes', 'source' => 'Fonte', 'contentTitle' => 'Título', 'views' => 'Visualizações', 'date' => 'Data', 'campaign' => 'Campanha', 'exportCsv' => 'Exportar CSV', 'noData' => 'Ainda sem dados.', 'noCampaignsTitle' => 'Ainda sem campanhas', 'noCampaignsText' => 'As campanhas UTM aparecerão aqui quando as visitas recebidas incluírem parâmetros de campanha.', 'noReferrersTitle' => 'Ainda sem referenciadores', 'noReferrersText' => 'Os domínios referenciadores aparecerão aqui quando os visitantes vierem de sites externos.', 'noRecentTitle' => 'Ainda sem visitas recentes', 'noRecentText' => 'As visitas recentes aparecerão aqui depois que o A360 Insights registrar tráfego para este período.', 'noSourceContentTitle' => 'Ainda sem conteúdo', 'noSourceContentText' => 'O conteúdo principal desta fonte aparecerá aqui depois que visitas correspondentes forem registradas.', 'close' => 'Fechar', 'loading' => 'Carregando…', 'previous' => 'Anterior', 'next' => 'Próximo', 'today' => 'Hoje', 'thisWeek' => 'Esta semana', 'thisMonth' => 'Este mês', 'resetPost' => 'Redefinir este contador', 'resetAll' => 'Redefinir todos os contadores', 'confirmPost' => 'Redefinir o contador deste post? Esta ação não pode ser desfeita.', 'confirmAll' => 'Redefinir os contadores de todos os posts e páginas? Esta ação não pode ser desfeita.', 'resetDone' => 'Contador redefinido.', ), 'it' => array( 'title' => 'Statistiche dell’articolo', 'sourceTitle' => 'Statistiche della fonte', 'total' => 'Visualizzazioni totali', 'overview' => 'Panoramica', 'sources' => 'Fonti', 'campaigns' => 'Campagne', 'medium' => 'Mezzo', 'trafficChannels' => 'Canali di traffico', 'campaignsHint' => 'Campagne UTM rilevate per questo contenuto nel periodo selezionato.', 'day' => 'Giorno', 'week' => 'Settimana', 'month' => 'Mese', 'year' => 'Anno', 'topReferrers' => 'Referrer principali', 'topContent' => 'Contenuti principali', 'recent' => 'Visite recenti', 'source' => 'Fonte', 'contentTitle' => 'Titolo', 'views' => 'Visualizzazioni', 'date' => 'Data', 'campaign' => 'Campagna', 'exportCsv' => 'Esporta CSV', 'noData' => 'Ancora nessun dato.', 'noCampaignsTitle' => 'Ancora nessuna campagna', 'noCampaignsText' => 'Le campagne UTM appariranno qui quando le visite in ingresso includeranno parametri di campagna.', 'noReferrersTitle' => 'Ancora nessun referrer', 'noReferrersText' => 'I domini referrer appariranno qui quando i visitatori arriveranno da siti esterni.', 'noRecentTitle' => 'Ancora nessuna visita recente', 'noRecentText' => 'Le visite recenti appariranno qui dopo che A360 Insights avrà registrato traffico per questo periodo.', 'noSourceContentTitle' => 'Ancora nessun contenuto', 'noSourceContentText' => 'I contenuti principali per questa fonte appariranno qui dopo la registrazione di visite corrispondenti.', 'close' => 'Chiudi', 'loading' => 'Caricamento…', 'previous' => 'Precedente', 'next' => 'Successivo', 'today' => 'Oggi', 'thisWeek' => 'Questa settimana', 'thisMonth' => 'Questo mese', 'resetPost' => 'Reimposta questo contatore', 'resetAll' => 'Reimposta tutti i contatori', 'confirmPost' => 'Reimpostare il contatore per questo articolo? L’azione non può essere annullata.', 'confirmAll' => 'Reimpostare i contatori per tutti gli articoli e le pagine? L’azione non può essere annullata.', 'resetDone' => 'Contatore reimpostato.', ), ); if (isset($translations[$lang])) { return array_merge($en, $translations[$lang]); } return $en; } }