$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(
'%3$d ',
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();
?>
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);
?>
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;
}
}