515 lines
37 KiB
PHP
515 lines
37 KiB
PHP
<?php
|
|
|
|
return [
|
|
'navigation_label' => 'Short Links',
|
|
'navigation_group' => 'Tools',
|
|
'resource_title' => 'Short URL',
|
|
|
|
// Form Tabs
|
|
'tab_link' => 'Link Details',
|
|
'tab_tracking' => 'Tracking Settings',
|
|
'tab_qr_design' => 'QR Code Design',
|
|
'tab_app_linking' => 'App Linking',
|
|
|
|
// App Linking
|
|
'form_section_app_linking' => 'App Linking / Deep Links',
|
|
'auto_open_app_mobile' => 'Auto open app on mobile',
|
|
'auto_open_app_mobile_helper' => 'Enable this if you want your link to automatically open as an app when accessed on mobile.',
|
|
'supported_operating_systems' => 'Supported Operating Systems',
|
|
'supported_apps' => 'Supported Apps',
|
|
'supported_apps_helper' => 'If you do not find your app here, you can use the Targeting feature to redirect the user to your app with your custom deep link.',
|
|
'matched' => 'Matched',
|
|
|
|
// Link Form Fields
|
|
'destination_url' => 'Destination URL',
|
|
'destination_url_helper' => 'The original URL you want to redirect visitors to.',
|
|
'url_key' => 'Short Key',
|
|
'url_key_helper' => 'Custom key for the short URL (leave empty for auto-generated).',
|
|
'redirect_code' => 'Redirect Code',
|
|
'redirect_code_301' => '301 (Permanent Redirect - better SEO)',
|
|
'redirect_code_302' => '302 (Temporary Redirect - better tracking)',
|
|
'status' => 'Active Status',
|
|
'single_use' => 'Single Use',
|
|
'single_use_helper' => 'Automatically disable this link after it has been visited once.',
|
|
'forward_query_params' => 'Forward Query Parameters',
|
|
'forward_query_params_helper' => 'Append incoming query parameters (like UTM tags) to the destination URL.',
|
|
'expires_at' => 'Expires At',
|
|
'activated_at' => 'Active From',
|
|
'max_visits' => 'Max Visits Limit',
|
|
'max_visits_helper' => 'Optional limit of total visits allowed before this link is deactivated.',
|
|
'expiration_redirect_url' => 'Expiration Redirect URL',
|
|
'expiration_redirect_url_helper' => 'Fallback URL to redirect to when the link is expired or inactive (leaves blank for 410 Gone error page).',
|
|
'form_section_validity' => 'Validity & Limits',
|
|
'use_date_validity' => 'Set Date Range Limits',
|
|
'notes' => 'Internal Notes',
|
|
'ga_tracking_id' => 'Google Analytics 4 Measurement ID',
|
|
'ga_tracking_id_helper' => 'Optional G-XXXXXXXXXX ID to track redirects server-side.',
|
|
|
|
// UTM Builder
|
|
'utm_builder' => 'UTM Campaign Builder',
|
|
'utm_builder_helper' => 'Dynamically append UTM parameters to the destination URL. Changes are synchronized in real-time.',
|
|
'utm_source' => 'Campaign Source (utm_source)',
|
|
'utm_source_placeholder' => 'google, newsletter, facebook...',
|
|
'utm_medium' => 'Campaign Medium (utm_medium)',
|
|
'utm_medium_placeholder' => 'cpc, email, social...',
|
|
'utm_campaign' => 'Campaign Name (utm_campaign)',
|
|
'utm_campaign_placeholder' => 'spring_sale, promo_2026...',
|
|
'utm_term' => 'Campaign Term (utm_term)',
|
|
'utm_term_placeholder' => 'yacht_charter, buy_yachts...',
|
|
'utm_content' => 'Campaign Content (utm_content)',
|
|
'utm_content_placeholder' => 'logo_link, text_ad...',
|
|
|
|
// Tracking Form Fields
|
|
'track_visits' => 'Enable Visit Tracking',
|
|
'track_ip' => 'Track IP Address',
|
|
'track_browser' => 'Track Browser Name',
|
|
'track_browser_version' => 'Track Browser Version',
|
|
'track_os' => 'Track Operating System',
|
|
'track_os_version' => 'Track OS Version',
|
|
'track_device_type' => 'Track Device Type (desktop/mobile/tablet)',
|
|
'track_referer' => 'Track Referer URL',
|
|
'track_browser_language' => 'Track Browser Language',
|
|
|
|
// QR Design Fields
|
|
'qr_size' => 'QR Code Size (px)',
|
|
'qr_margin' => 'Quiet Zone Margin',
|
|
'qr_dot_style' => 'Dot Style',
|
|
'qr_fg_color' => 'Foreground Color',
|
|
'qr_bg_color' => 'Background Color',
|
|
'qr_gradient_enabled' => 'Enable Gradient',
|
|
'qr_gradient_from' => 'Gradient Color From',
|
|
'qr_gradient_to' => 'Gradient Color To',
|
|
'qr_gradient_type' => 'Gradient Type',
|
|
'qr_gradient_linear' => 'Linear',
|
|
'qr_gradient_radial' => 'Radial',
|
|
'qr_download' => 'Download QR Code',
|
|
'qr_copied' => 'Short URL copied to clipboard!',
|
|
|
|
// QR Designer Panel UI Labels
|
|
'qr_label_size' => 'Size (px)',
|
|
'qr_label_margin' => 'Margin',
|
|
'qr_label_style' => 'Style',
|
|
'qr_label_color' => 'Color',
|
|
'qr_label_from' => 'From',
|
|
'qr_label_to' => 'To',
|
|
'qr_label_foreground_color' => 'Foreground Color',
|
|
'qr_label_single_color' => 'Single Color',
|
|
'qr_label_gradient' => 'Gradient',
|
|
'qr_label_gradient_type' => 'Gradient Type',
|
|
'qr_label_background' => 'Background',
|
|
'qr_label_transparent' => 'Transparent',
|
|
'qr_label_eye_config' => 'Eye Config',
|
|
'qr_label_eye_square_style' => 'Eye Square Style',
|
|
'qr_label_eye_dot_style' => 'Eye Dot Style',
|
|
'qr_label_eye_color' => 'Eye Color',
|
|
'qr_label_preview' => 'Preview',
|
|
'qr_option_square' => 'Square',
|
|
'qr_option_dots' => 'Dots',
|
|
'qr_option_rounded' => 'Rounded',
|
|
'qr_option_classy' => 'Classy',
|
|
'qr_option_classy_rounded' => 'Classy Rounded',
|
|
'qr_option_extra_rounded' => 'Extra Rounded',
|
|
'qr_chart_visits_label' => 'Visits',
|
|
'qr_label_dots_background' => 'Dots & Background',
|
|
'qr_label_custom_eye_config' => 'Custom Eye Config',
|
|
'qr_label_logo_overlay' => 'Logo & Icon Overlay',
|
|
'qr_label_drag_drop_upload' => 'Drag & drop or click to upload logo',
|
|
'qr_label_upload_supports' => 'Supports PNG, JPG, SVG up to 10MB',
|
|
'qr_label_drag_drop_replace' => 'Drag & drop or click to replace',
|
|
'qr_label_uploading_logo' => 'Uploading logo...',
|
|
'qr_logo_upload_parse_error' => 'Error parsing server response!',
|
|
'qr_logo_upload_error' => 'Error during logo file upload!',
|
|
'qr_logo_upload_connection_error' => 'Connection error during logo file upload!',
|
|
'qr_label_remove_logo' => 'Remove logo',
|
|
'qr_label_logo_shape' => 'Logo Shape',
|
|
'qr_label_logo_size' => 'Logo Size',
|
|
'qr_label_logo_margin' => 'Logo Margin',
|
|
'qr_label_clear_dots' => 'Clear Dots Behind Logo',
|
|
'qr_label_live_preview' => 'Live Preview',
|
|
'qr_option_circle' => 'Circle',
|
|
'qr_label_png' => 'PNG',
|
|
'qr_label_svg' => 'SVG',
|
|
|
|
// Table Columns
|
|
'col_short_url' => 'Short URL',
|
|
'col_destination_url' => 'Destination URL',
|
|
'col_total_visits' => 'Total Visits',
|
|
'col_status' => 'Status',
|
|
'col_expires_at' => 'Expires At',
|
|
'col_created_at' => 'Created At',
|
|
|
|
// Actions
|
|
'action_stats' => 'Statistics',
|
|
'action_copy' => 'Copy URL',
|
|
'action_qr' => 'QR Code',
|
|
'action_edit' => 'Edit URL',
|
|
'action_delete' => 'Delete URL',
|
|
'action_share' => 'Share Link',
|
|
'share_title' => 'Share Link',
|
|
'share_description' => 'Share this short link via:',
|
|
'share_copy' => 'Copy',
|
|
'share_copied' => 'Short link copied to clipboard!',
|
|
'qr_modal_helper' => 'Scan, copy, or download your custom QR code.',
|
|
'qr_download_svg' => 'Download SVG',
|
|
'qr_download_png' => 'Download PNG',
|
|
'success_modal_title' => 'Your link & QR code are ready!',
|
|
'success_modal_subtitle' => 'Time to get some clicks 🎉',
|
|
'success_modal_helper' => 'Copy and share manually or choose a platform.',
|
|
'open_link' => 'Open link',
|
|
'close_button' => 'Close',
|
|
'dont_show_again' => "Don't show sharing options after creating a link",
|
|
|
|
// Stats Page
|
|
'stats_title' => 'Statistics',
|
|
'stats_tab_statistics' => 'Statistics',
|
|
'stats_tab_visit_logs' => 'Visit Logs',
|
|
'stats_card_total' => 'Total Visits',
|
|
'stats_card_unique' => 'Unique Visitors',
|
|
'stats_card_today' => 'Today',
|
|
'stats_card_today_clicks' => 'Clicks Today',
|
|
'stats_card_week' => 'This Week',
|
|
'stats_card_month' => 'This Month',
|
|
'stats_chart_title' => 'Visits — Last 30 Days',
|
|
'stats_no_chart_data' => 'No visits yet in the last 30 days.',
|
|
'stats_breakdown_countries' => 'Top Countries',
|
|
'stats_breakdown_devices' => 'Device Types',
|
|
'stats_breakdown_browsers' => 'Browsers',
|
|
'stats_breakdown_os' => 'Operating Systems',
|
|
'stats_breakdown_referers' => 'Top Referers',
|
|
'stats_no_country_data' => 'No country data.',
|
|
'stats_no_device_data' => 'No device data.',
|
|
'stats_no_browser_data' => 'No browser data.',
|
|
'stats_no_os_data' => 'No OS data.',
|
|
'stats_no_referer_data' => 'No referer data.',
|
|
'stats_table_title' => 'Visit Logs',
|
|
'stats_btn_back' => 'Back to list',
|
|
'stats_btn_copy' => 'Copy Short URL',
|
|
'stats_col_time' => 'Time',
|
|
'stats_col_country' => 'Country',
|
|
'stats_col_device' => 'Device',
|
|
'stats_col_browser' => 'Browser',
|
|
'stats_col_os' => 'OS',
|
|
'stats_col_ip' => 'IP',
|
|
'stats_no_visits' => 'No visits recorded yet.',
|
|
// Settings Page
|
|
'settings_nav_label' => 'Settings',
|
|
'settings_save_btn' => 'Save Settings',
|
|
'settings_saved' => 'Settings saved successfully!',
|
|
|
|
'settings_tab_general' => 'General',
|
|
'settings_tab_geoip' => 'Geo-IP',
|
|
'settings_tab_ga4' => 'Google Analytics 4',
|
|
|
|
'settings_section_routing' => 'Routing & Redirects',
|
|
'settings_section_queue' => 'Queue',
|
|
'settings_section_geoip' => 'Geo-IP Detection',
|
|
'settings_section_ga4' => 'GA4 Measurement Protocol',
|
|
'settings_ga4_description' => 'Configure server-side Google Analytics 4 event tracking via the Measurement Protocol. Events are sent in the background without blocking the redirect.',
|
|
|
|
'settings_site_name' => 'Site Name Override',
|
|
'settings_site_name_helper' => 'Custom brand/site name displayed on redirect prompt screens. If empty, falls back to config("app.name").',
|
|
'settings_route_prefix' => 'Route Prefix',
|
|
'settings_route_prefix_helper' => 'URL segment before the short key, e.g. "/s/abc123". Leave empty to serve links directly from the root domain (e.g. "domain.com/abc123"). Change requires a config:clear.',
|
|
'settings_redirect_code_helper' => 'Temporary redirect (302) forces browsers to request the short URL every time, ensuring accurate tracking of all visits. Permanent redirect (301) is cached by browsers and search engines (better for SEO), but subsequent visits from the same device might not be logged in statistics.',
|
|
'settings_key_length' => 'Auto-generated Key Length',
|
|
'settings_key_length_helper' => 'Number of characters for auto-generated short keys (base62). 6 chars = ~56 billion unique keys.',
|
|
'settings_cache_ttl' => 'Redirect Cache TTL',
|
|
'settings_cache_ttl_helper' => 'Seconds to cache resolved short URL records. Set to 0 to disable (not recommended in production).',
|
|
'settings_queue_connection' => 'Queue Connection',
|
|
'settings_queue_connection_helper' => 'Laravel queue connection used for async visit tracking. Use "sync" for synchronous (slower redirects), or "redis"/"sqs" for production.',
|
|
|
|
'settings_geoip_enabled' => 'Enable Geo-IP Detection',
|
|
'settings_geoip_enabled_helper' => 'Detect and record the visitor\'s country on each visit.',
|
|
'settings_geoip_driver' => 'Detection Driver',
|
|
'settings_geoip_driver_helper' => 'Method used to resolve the visitor country from their IP address.',
|
|
'settings_geoip_driver_headers' => 'CDN Headers (fastest — Cloudflare, CloudFront)',
|
|
'settings_geoip_driver_maxmind' => 'MaxMind Local DB (offline, zero latency)',
|
|
'settings_geoip_driver_ipapi' => 'ip-api.com (free API, 45 req/min limit)',
|
|
'settings_geoip_cache_ttl' => 'Geo-IP Result Cache TTL',
|
|
'settings_geoip_cache_ttl_helper' => 'Time (in seconds) to cache the resolved location per visitor IP. Prevents querying APIs/databases repeatedly on subsequent clicks from the same user. Default: 86400 (24 hours). Max: 31536000 (1 year).',
|
|
'settings_geoip_timeout' => 'API Timeout',
|
|
'settings_geoip_timeout_helper' => 'Maximum seconds to wait for an external Geo-IP API response before giving up.',
|
|
'settings_maxmind_path' => 'MaxMind Database Path',
|
|
'settings_maxmind_path_helper' => 'Absolute path to your GeoLite2-Country.mmdb or GeoIP2-Country.mmdb file. Required when driver is set to MaxMind.',
|
|
'settings_maxmind_info_callout' => '<div class="callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-white/10" data-callout-type="info"><div class="mt-0.5 w-4" data-component-part="callout-icon"><svg viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="flex-none size-5 text-neutral-800 dark:text-neutral-300" aria-label="Info"><path d="M8 0C3.58125 0 0 3.58125 0 8C0 12.4187 3.58125 16 8 16C12.4187 16 16 12.4187 16 8C16 3.58125 12.4187 0 8 0ZM8 14.5C4.41563 14.5 1.5 11.5841 1.5 8C1.5 4.41594 4.41563 1.5 8 1.5C11.5844 1.5 14.5 4.41594 14.5 8C14.5 11.5841 11.5844 14.5 8 14.5ZM9.25 10.5H8.75V7.75C8.75 7.3375 8.41563 7 8 7H7C6.5875 7 6.25 7.3375 6.25 7.75C6.25 8.1625 6.5875 8.5 7 8.5H7.25V10.5H6.75C6.3375 10.5 6 10.8375 6 11.25C6 11.6625 6.3375 12 6.75 12H9.25C9.66406 12 10 11.6641 10 11.25C10 10.8359 9.66563 10.5 9.25 10.5ZM8 6C8.55219 6 9 5.55219 9 5C9 4.44781 8.55219 4 8 4C7.44781 4 7 4.44687 7 5C7 5.55313 7.44687 6 8 6Z"></path></svg></div><div class="text-sm prose dark:prose-invert min-w-0 w-full text-neutral-800 dark:text-neutral-300" data-component-part="callout-content"><span><strong>How to configure MaxMind (Offline Geo-IP):</strong><br>1. Register for a free account at <a href="https://www.maxmind.com" target="_blank" class="underline text-primary-600 dark:text-primary-400">maxmind.com</a>.<br>2. Download the free <strong>GeoLite2 Country</strong> or <strong>GeoLite2 City</strong> database in binary format (file extension <code class="px-1 py-0.5 rounded bg-gray-200 dark:bg-gray-800 text-xs">.mmdb</code>).<br>3. Upload the file to your server, e.g. under the path <code class="px-1 py-0.5 rounded bg-gray-200 dark:bg-gray-800 text-xs">storage/geoip/GeoLite2-Country.mmdb</code>.<br>4. Paste the absolute path below and click the <strong>Verify file</strong> button on the right side of the field.</span></div></div>',
|
|
'settings_maxmind_verify' => 'Verify file',
|
|
'settings_maxmind_verify_ok' => '✅ File found & readable',
|
|
'settings_maxmind_verify_fail' => '❌ File not found or not readable',
|
|
'settings_maxmind_verify_empty' => 'Please enter a path first.',
|
|
|
|
'settings_ga4_api_secret' => 'Measurement Protocol API Secret',
|
|
'settings_ga4_api_secret_helper' => 'Generate this in GA4 → Admin → Data Streams → your stream → Measurement Protocol API secrets.',
|
|
'settings_ga4_firebase_app_id' => 'Firebase App ID (optional)',
|
|
'settings_ga4_firebase_app_id_helper' => 'Required only if tracking a Firebase / app stream. Leave empty for standard web GA4 streams.',
|
|
'settings_ga4_verify' => 'Test connection',
|
|
'settings_ga4_verify_ok' => '✅ API Secret is valid — GA4 connection successful',
|
|
'settings_ga4_verify_fail' => '❌ Invalid API Secret — GA4 rejected the request',
|
|
'settings_ga4_verify_empty' => 'Please enter an API Secret first.',
|
|
'settings_ga4_verify_error' => '⚠️ Connection error — could not reach GA4',
|
|
|
|
'settings_section_buffering' => 'Visit Counters Buffering',
|
|
'settings_buffering_enabled' => 'Buffer Visit Counts in Cache',
|
|
'settings_buffering_helper' => 'When enabled, visit count increments are temporarily buffered in the application cache and must be flushed periodically to the database via "php artisan short-url:sync-counters". This prevents row-locking issues and performance degradation under high-traffic spikes.',
|
|
'settings_buffering_worker_info' => '<div class="callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-white/10" data-callout-type="info"><div class="mt-0.5 w-4" data-component-part="callout-icon"><svg viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="flex-none size-5 text-neutral-800 dark:text-neutral-300" aria-label="Info"><path d="M8 0C3.58125 0 0 3.58125 0 8C0 12.4187 3.58125 16 8 16C12.4187 16 16 12.4187 16 8C16 3.58125 12.4187 0 8 0ZM8 14.5C4.41563 14.5 1.5 11.5841 1.5 8C1.5 4.41594 4.41563 1.5 8 1.5C11.5844 1.5 14.5 4.41594 14.5 8C14.5 11.5841 11.5844 14.5 8 14.5ZM9.25 10.5H8.75V7.75C8.75 7.3375 8.41563 7 8 7H7C6.5875 7 6.25 7.3375 6.25 7.75C6.25 8.1625 6.5875 8.5 7 8.5H7.25V10.5H6.75C6.3375 10.5 6 10.8375 6 11.25C6 11.6625 6.3375 12 6.75 12H9.25C9.66406 12 10 11.6641 10 11.25C10 10.8359 9.66563 10.5 9.25 10.5ZM8 6C8.55219 6 9 5.55219 9 5C9 4.44781 8.55219 4 8 4C7.44781 4 7 4.44687 7 5C7 5.55313 7.44687 6 8 6Z"></path></svg></div><div class="text-sm prose dark:prose-invert min-w-0 w-full [&_kbd]:bg-background-light dark:[&_kbd]:bg-background-dark [_code]:!text-current [_kbd]:!text-current [_a]:!text-current [_a]:border-current [_strong]:!text-current text-neutral-800 dark:text-neutral-300" data-component-part="callout-content"><span><strong>Required Cron Task (Scheduler):</strong> You have enabled click counter buffering. You must add the following task to your server\'s crontab:<br><code class="px-1.5 py-0.5 rounded bg-gray-200 dark:bg-gray-800 text-xs">* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1</code><br>Command run automatically in the background by the scheduler:<br><code class="px-1.5 py-0.5 rounded bg-gray-200 dark:bg-gray-800 text-xs">php artisan short-url:sync-counters</code></span></div></div>',
|
|
|
|
// CDN Trust Settings
|
|
'settings_trust_cdn_headers' => 'Trust CDN & Proxy Headers',
|
|
'settings_trust_cdn_headers_helper' => 'Enable this if your app sits behind a CDN (like Cloudflare, AWS CloudFront) or a reverse proxy. This allows extracting the real client IP and country code from CDN headers. Warning: only enable this if you are actually behind a proxy, otherwise client IP addresses can be spoofed!',
|
|
'settings_trust_cdn_headers_info_callout' => '<div class="callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border border-amber-200 bg-amber-50 dark:border-amber-700 dark:bg-amber-950/20" data-callout-type="warning"><div class="mt-0.5 w-4" data-component-part="callout-icon"><svg viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="flex-none size-5 text-amber-800 dark:text-amber-300" aria-label="Warning"><path fill-rule="evenodd" d="M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-8-5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 10 5Zm0 10a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z" clip-rule="evenodd" /></svg></div><div class="text-sm prose dark:prose-invert min-w-0 w-full text-amber-900 dark:text-amber-200" data-component-part="callout-content"><span><strong>Warning (IP Address Security):</strong> You have enabled trust for proxy headers. Enable this option <u>only</u> if your website is behind:<br>• <strong>Cloudflare</strong> (reads from CF-Connecting-IP)<br>• <strong>AWS CloudFront</strong> or another CDN system<br>• <strong>Nginx/Apache reverse proxy</strong> forwarding X-Forwarded-For.<br><br><strong>Turn this option OFF</strong> if your server connects directly to users. If left ON without a proxy, malicious users can easily spoof their IP address by sending a custom header.</span></div></div>',
|
|
'settings_geoip_headers_warning' => '<div class="callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border border-amber-200 bg-amber-50 dark:border-amber-700 dark:bg-amber-950/20" data-callout-type="warning"><div class="mt-0.5 w-4" data-component-part="callout-icon"><svg viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="flex-none size-5 text-amber-800 dark:text-amber-300" aria-label="Warning"><path fill-rule="evenodd" d="M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-8-5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5A.75.75 0 0 1 10 5Zm0 10a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z" clip-rule="evenodd" /></svg></div><div class="text-sm prose dark:prose-invert min-w-0 w-full text-amber-900 dark:text-amber-200" data-component-part="callout-content"><span><strong>Proxy Header Trust Disabled:</strong> You selected <em>CDN Headers</em> as the Geo-IP driver, but the option <strong>"Trust CDN & Proxy Headers"</strong> in the <em>General</em> tab is disabled. Location detection will not function until you enable it.</span></div></div>',
|
|
|
|
// Stats View & Export Localization
|
|
'stats_filter_visited_from' => 'Visited From',
|
|
'stats_filter_visited_until' => 'Visited Until',
|
|
'stats_action_export' => 'Export CSV',
|
|
'stats_csv_time' => 'Time',
|
|
'stats_csv_ip' => 'IP Address',
|
|
'stats_csv_country' => 'Country',
|
|
'stats_csv_device' => 'Device',
|
|
'stats_csv_browser' => 'Browser',
|
|
'stats_csv_os' => 'OS',
|
|
'stats_csv_referer' => 'Referer',
|
|
|
|
// Bulk Actions Localization
|
|
'action_enable_selected' => 'Enable selected',
|
|
'action_disable_selected' => 'Disable selected',
|
|
|
|
// Form Sections Localization
|
|
'form_section_options' => 'Options',
|
|
'form_section_notes' => 'Internal Notes',
|
|
'form_section_tracking' => 'Visit Tracking',
|
|
'form_section_tracked_fields' => 'Tracked Fields',
|
|
'form_section_analytics' => 'Third-Party Analytics',
|
|
|
|
// New Dashboard Analytics Keys
|
|
'stats_card_top_source' => 'Top UTM Source',
|
|
'stats_card_top_country' => 'Top Country',
|
|
'stats_filter_date_range' => 'Date Range',
|
|
'stats_preset_24_hours' => 'Last 24 Hours',
|
|
'stats_preset_7_days' => 'Last 7 Days',
|
|
'stats_preset_30_days' => 'Last 30 Days',
|
|
'stats_preset_90_days' => 'Last 90 Days',
|
|
'stats_preset_custom' => 'Custom Range',
|
|
'stats_breakdown_cities' => 'Top Cities',
|
|
'stats_no_city_data' => 'No city data.',
|
|
'stats_breakdown_utm_source' => 'Campaign Sources',
|
|
'stats_breakdown_utm_medium' => 'Campaign Mediums',
|
|
'stats_breakdown_utm_campaign' => 'Campaign Names',
|
|
'stats_no_utm_data' => 'No UTM data recorded.',
|
|
|
|
// New Targeting & Security Tab and fields
|
|
'tab_targeting' => 'Targeting & Security',
|
|
'security_section_title' => 'Security Controls',
|
|
'password' => 'Access Password',
|
|
'password_helper' => 'Require visitors to enter a password before being redirected.',
|
|
'show_warning_page' => 'Show Redirect Warning Page',
|
|
'show_warning_page_helper' => 'Show an intermediate screen warning visitors about external redirection (NSFW/phishing protection).',
|
|
'targeting_type' => 'Targeting Strategy',
|
|
'targeting_type_none' => 'None (Direct Redirect)',
|
|
'targeting_type_device' => 'Device-Based Redirects',
|
|
'targeting_type_country' => 'Country-Based (Geo-IP) Redirects',
|
|
'targeting_type_rotation' => 'A/B Split Rotation',
|
|
'targeting_type_language' => 'Browser Language-Based Redirects',
|
|
'device_targeting_rules' => 'Device Rules',
|
|
'country_targeting_rules' => 'Country Rules',
|
|
'language_targeting_rules' => 'Language Rules',
|
|
'rotation_targeting_rules' => 'Rotation Targets',
|
|
'device_mobile' => 'Mobile Destination URL',
|
|
'device_tablet' => 'Tablet Destination URL',
|
|
'device_desktop' => 'Desktop Destination URL',
|
|
'country_code' => 'Country Code',
|
|
'language_code' => 'Language Code',
|
|
'rotation_url' => 'Destination URL',
|
|
'rotation_weight' => 'Traffic Weight',
|
|
'rotation_weight_helper' => 'Percentage of traffic to route to this URL (e.g. 50 for 50%). Weights are balanced proportionally.',
|
|
|
|
// New Settings Page Fields
|
|
'settings_tab_advanced' => 'Performance & Security',
|
|
'settings_section_aggregation' => 'High-Traffic Log Management',
|
|
'settings_retention_days' => 'Raw Log Retention Period',
|
|
'settings_retention_days_helper' => 'Select the duration for which you want to keep detailed raw click logs before they are deleted.',
|
|
'settings_aggregation_enabled' => 'Enable Automatic Daily Pruning & Aggregation',
|
|
'settings_aggregation_enabled_helper' => 'When enabled, the plugin automatically registers a daily task in the scheduler (at 02:00) to aggregate visits into daily statistics and delete raw logs older than the chosen retention period.',
|
|
'retention_30_days' => '30 Days',
|
|
'retention_60_days' => '60 Days',
|
|
'retention_90_days' => '90 Days',
|
|
'retention_180_days' => '180 Days (Half Year)',
|
|
'retention_365_days' => '365 Days (1 Year)',
|
|
'retention_730_days' => '2 Years',
|
|
'settings_section_rate_limiting' => 'Rate Limiting / Bot Protection',
|
|
'settings_rate_limiting_enabled' => 'Enable Limit Protection',
|
|
'settings_rate_limiting_enabled_helper' => 'Limit the rate of redirects per client IP address.',
|
|
'settings_rate_limiting_max_attempts' => 'Max Redirects Allowed',
|
|
'settings_rate_limiting_max_attempts_helper' => 'Maximum allowed redirection requests within the decay window.',
|
|
'settings_rate_limiting_decay_seconds' => 'Decay Window (Seconds)',
|
|
'settings_rate_limiting_decay_seconds_helper' => 'Time period for the rate limiter.',
|
|
|
|
// Queue Settings Additions
|
|
'settings_queue_name' => 'Queue Name',
|
|
'settings_queue_name_helper' => 'The target queue to which tracking and buffering sync jobs are dispatched. Default: "default".',
|
|
'settings_queue_worker_info' => '<div class="callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-white/10" data-callout-type="info"><div class="mt-0.5 w-4" data-component-part="callout-icon"><svg viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="flex-none size-5 text-neutral-800 dark:text-neutral-300" aria-label="Info"><path d="M8 0C3.58125 0 0 3.58125 0 8C0 12.4187 3.58125 16 8 16C12.4187 16 16 12.4187 16 8C16 3.58125 12.4187 0 8 0ZM8 14.5C4.41563 14.5 1.5 11.5841 1.5 8C1.5 4.41594 4.41563 1.5 8 1.5C11.5844 1.5 14.5 4.41594 14.5 8C14.5 11.5841 11.5844 14.5 8 14.5ZM9.25 10.5H8.75V7.75C8.75 7.3375 8.41563 7 8 7H7C6.5875 7 6.25 7.3375 6.25 7.75C6.25 8.1625 6.5875 8.5 7 8.5H7.25V10.5H6.75C6.3375 10.5 6 10.8375 6 11.25C6 11.6625 6.3375 12 6.75 12H9.25C9.66406 12 10 11.6641 10 11.25C10 10.8359 9.66563 10.5 9.25 10.5ZM8 6C8.55219 6 9 5.55219 9 5C9 4.44781 8.55219 4 8 4C7.44781 4 7 4.44687 7 5C7 5.55313 7.44687 6 8 6Z"></path></svg></div><div class="text-sm prose dark:prose-invert min-w-0 w-full [&_kbd]:bg-background-light dark:[&_kbd]:bg-background-dark [_code]:!text-current [_kbd]:!text-current [_a]:!text-current [_a]:border-current [_strong]:!text-current text-neutral-800 dark:text-neutral-300" data-component-part="callout-content"><span><strong>Queue Worker Required:</strong> The selected connection runs asynchronously. You must run a background worker to process these jobs:<br><code class="px-1.5 py-0.5 rounded bg-gray-200 dark:bg-gray-800 text-xs">php artisan queue:work --queue=:queue</code></span></div></div>',
|
|
'settings_geoip_stats_cache_ttl' => 'Stats Dashboard Cache TTL',
|
|
'settings_geoip_stats_cache_ttl_helper' => 'Time (in seconds) to cache stats calculation on the dashboard. When viewing charts and logs, the system loads calculated numbers from cache instead of querying millions of rows from SQL on every refresh. Default: 300 (5 minutes). Max: 86400 (24 hours).',
|
|
|
|
// Default Tracking Tab
|
|
'settings_tab_tracking_defaults' => 'Default Tracking',
|
|
'settings_section_tracking_defaults' => 'Default Visitor Tracking Settings',
|
|
'settings_section_tracking_defaults_helper' => 'These settings govern the default tracking status for newly created short URLs.',
|
|
'settings_track_visits_default' => 'Enable Tracking by Default',
|
|
'settings_track_ip_default' => 'Default IP Address Tracking',
|
|
'settings_track_browser_default' => 'Default Browser Tracking',
|
|
'settings_track_browser_version_default' => 'Default Browser Version Tracking',
|
|
'settings_track_os_default' => 'Default OS Tracking',
|
|
'settings_track_os_version_default' => 'Default OS Version Tracking',
|
|
'settings_track_referer_default' => 'Default Referer URL Tracking',
|
|
'settings_track_device_type_default' => 'Default Device Type Tracking',
|
|
'settings_track_browser_language_default' => 'Default Browser Language Tracking',
|
|
|
|
// QR Defaults Tab
|
|
'settings_tab_qr' => 'QR Defaults',
|
|
'settings_section_qr_defaults' => 'Default QR Code Design Options',
|
|
'settings_section_qr_defaults_helper' => 'Configure standard design styling automatically loaded for newly generated QR codes.',
|
|
'settings_qr_size' => 'Default Size (px)',
|
|
'settings_qr_margin' => 'Default Margin',
|
|
'settings_qr_dot_style' => 'Default Dot Style',
|
|
'settings_qr_foreground_color' => 'Default Foreground Color',
|
|
'settings_qr_background_color' => 'Default Background Color',
|
|
'settings_qr_gradient_enabled' => 'Enable Gradient by Default',
|
|
'settings_qr_gradient_from' => 'Gradient Color From',
|
|
'settings_qr_gradient_to' => 'Gradient Color To',
|
|
'settings_qr_gradient_type' => 'Default Gradient Type',
|
|
|
|
// Views
|
|
'password_title' => 'Password Required',
|
|
'password_description' => 'This link is password-protected. Please enter the correct password to continue.',
|
|
'password_placeholder' => 'Enter password',
|
|
'password_btn_unlock' => 'Unlock & Redirect',
|
|
'password_error' => 'Incorrect password.',
|
|
'warning_title' => 'Security Redirect Warning',
|
|
'warning_description' => 'You are leaving this secure portal and being redirected to an external target link. Please ensure you trust the address below:',
|
|
'warning_btn_continue' => 'Continue to Destination',
|
|
'warning_btn_back' => 'Go Back',
|
|
'pixel_loading_title' => 'Connecting...',
|
|
'pixel_loading_description' => 'Preparing your connection and forwarding you now.',
|
|
|
|
// Marketing & API Tab
|
|
'tab_marketing' => 'Marketing & API',
|
|
'marketing_pixels_title' => 'Retargeting Pixels (Client-Side)',
|
|
'marketing_pixels_desc' => 'Add ad tracking scripts to capture visitor cookies and build remarketing lists.',
|
|
'pixel_meta' => 'Meta Pixel ID',
|
|
'pixel_google' => 'Google Tag / GA4 ID',
|
|
'pixel_linkedin' => 'LinkedIn Partner ID',
|
|
'marketing_webhooks_title' => 'Link Webhook Integration',
|
|
'marketing_webhooks_desc' => 'Configure a custom destination URL to send a real-time HTTP POST notification on each click.',
|
|
'webhook_url' => 'Dedicated Webhook URL',
|
|
|
|
// Settings tab additions
|
|
'settings_tab_developer' => 'API & Webhooks',
|
|
'settings_section_rest_api' => 'REST API Access',
|
|
'settings_api_enabled' => 'Enable Developer REST API',
|
|
'settings_api_enabled_helper' => 'Allow external systems to create, list, and delete short URLs via the REST API. Disable to block all /api/short-url/* endpoints with a 503 response.',
|
|
'settings_section_global_webhook' => 'Global Webhook Configuration',
|
|
'settings_global_webhook_enabled' => 'Enable Global Webhook',
|
|
'settings_global_webhook_enabled_helper' => 'When enabled, the plugin will dispatch HTTP POST notifications for all short link events.',
|
|
'settings_global_webhook_url' => 'Global Webhook URL',
|
|
'settings_global_webhook_url_helper' => 'Destination URL to dispatch event payloads asynchronously in the background for all links.',
|
|
'settings_webhook_events' => 'Monitored Webhook Events',
|
|
'settings_webhook_events_helper' => 'Select which events should trigger a POST notification.',
|
|
'webhook_event_visited' => 'Link Visited (Click)',
|
|
'webhook_event_created' => 'Link Created',
|
|
'webhook_event_expired' => 'Link Expired (Date)',
|
|
'webhook_event_limit_reached' => 'Link Click Limit Reached',
|
|
'settings_section_api_keys' => 'Developer API Keys',
|
|
'settings_api_keys_description' => 'Manage API keys to integrate with external systems (e.g. CRM, Zapier, Make). Authenticate requests using the X-Api-Key header.',
|
|
'settings_api_keys' => 'Active API Keys',
|
|
'api_key_name' => 'Key Name (Description)',
|
|
'api_key' => 'API Key',
|
|
'active' => 'Active',
|
|
|
|
// Security v2.0
|
|
'settings_section_security_v2' => 'Security & Anti-Fraud v2.0',
|
|
'settings_section_security_v2_desc' => 'Configure VPN/proxy detection and Google Safe Browsing URL validation.',
|
|
'settings_vpn_detection_enabled' => 'Enable VPN & Proxy Detection',
|
|
'settings_vpn_detection_enabled_helper' => 'When enabled, incoming visits will be checked for VPN, proxy, or Tor usage.',
|
|
'settings_vpn_driver' => 'Detection Driver',
|
|
'settings_vpn_driver_helper' => 'Choose between the free IP-API service or VPNAPI.io.',
|
|
'settings_vpn_driver_ipapi' => 'IP-API (Free)',
|
|
'settings_vpn_driver_vpnapi' => 'VPNAPI.io (Premium / Free)',
|
|
'settings_vpnapi_key' => 'VPNAPI.io Key',
|
|
'settings_vpnapi_key_helper' => 'Your API key from vpnapi.io (required for vpnapi driver).',
|
|
'settings_vpn_block_action' => 'VPN Block Action',
|
|
'settings_vpn_block_action_helper' => 'Choose whether to only flag VPN traffic in statistics or actively block them with a 403 Forbidden page.',
|
|
'settings_vpn_block_flag_only' => 'Flag in stats only (allow redirect)',
|
|
'settings_vpn_block_block_403' => 'Block traffic (serve 403 Forbidden)',
|
|
'settings_safe_browsing_enabled' => 'Enable Google Safe Browsing URL Verification',
|
|
'settings_safe_browsing_enabled_helper' => 'Verify target URLs against Google\'s Threat List to block phishing, malware, and social engineering links.',
|
|
'settings_safe_browsing_api_key' => 'Google Safe Browsing API Key',
|
|
'settings_safe_browsing_api_key_helper' => 'Your Google Developer Console Web API key.',
|
|
'settings_safe_browsing_test' => 'Test API Connection',
|
|
'settings_safe_browsing_test_empty' => 'Please enter an API key first.',
|
|
'settings_safe_browsing_test_ok' => 'Google Safe Browsing connection OK (API is active).',
|
|
'settings_safe_browsing_test_fail' => 'Google Safe Browsing key validation failed.',
|
|
'settings_safe_browsing_test_error' => 'API connection error.',
|
|
|
|
// World Map Widget
|
|
'world_map_title' => 'Visitor World Map',
|
|
'world_map_total_clicks' => 'total clicks',
|
|
'world_map_countries' => 'countries',
|
|
'world_map_fewer' => 'Fewer',
|
|
'world_map_more' => 'More',
|
|
'world_map_top_countries' => 'Top Countries',
|
|
'world_map_no_data' => 'No geographic data yet.',
|
|
'world_map_no_data_sub' => 'Enable Geo-IP detection to start recording visitor locations.',
|
|
'stats_card_qr_scans' => 'QR Code Scans',
|
|
'stats_breakdown_languages' => 'Top Languages',
|
|
'stats_no_language_data' => 'No language data.',
|
|
'badge_clicks' => 'clicks',
|
|
'badge_unique' => 'unique',
|
|
'badge_qr' => 'QR',
|
|
'badge_qr_scans' => 'QR scans',
|
|
'badge_expires' => 'Expires: :date',
|
|
'badge_no_expiry' => 'No expiry',
|
|
'badge_redirect' => ':code redirect',
|
|
'pixels_navigation_label' => 'Retargeting Pixels',
|
|
'pixel_resource_title' => 'Retargeting Pixel',
|
|
'pixel_name' => 'Pixel Name',
|
|
'pixel_type' => 'Provider',
|
|
'pixel_id_label' => 'Pixel ID / Tag ID',
|
|
'pixel_status_active' => 'Active',
|
|
'settings_tab_deep_linking' => 'Deep Linking',
|
|
'settings_section_deep_linking' => 'Universal Links & App Links Association Files',
|
|
'settings_deep_linking_enabled' => 'Enable Deep Linking Files',
|
|
'settings_deep_linking_enabled_helper' => 'When enabled, the plugin serves AASA and AssetLinks configuration files from your root domain.',
|
|
'settings_aasa_json' => 'apple-app-site-association (iOS)',
|
|
'settings_aasa_json_helper' => 'Specify the valid JSON configuration for Apple App Site Association. Do not include wrapping script tags.',
|
|
'settings_assetlinks_json' => 'assetlinks.json (Android)',
|
|
'settings_assetlinks_json_helper' => 'Specify the valid JSON array configuration for Android Digital Asset Links.',
|
|
'validation_invalid_json' => 'The entered text is not a valid JSON string.',
|
|
|
|
// App Linking Preview
|
|
'app_linking_supported_os' => 'Supported Operating Systems:',
|
|
'app_linking_supported_apps' => 'Supported Apps',
|
|
'app_linking_supported_apps_helper' => 'If you do not find your app here, you can use the Targeting feature to redirect the user to your app with your custom deep link.',
|
|
'app_linking_matched' => 'Matched',
|
|
'app_linking_preconfigured_count' => ':count apps pre-configured for automatic redirection.',
|
|
'app_linking_redirect_active' => 'Opens directly inside :app',
|
|
'app_linking_auto_open' => 'Auto-Open',
|
|
'app_linking_matched_description' => 'When clicked on a mobile device, this link will open immediately inside the native <strong>:app</strong> application instead of the web browser.',
|
|
'app_linking_deep_link_scheme' => 'Mobile app path (Deep Link): :scheme',
|
|
'app_linking_standard_redirect' => 'This link will open in a standard mobile browser (no matching mobile app found).',
|
|
|
|
// App Redirect Page
|
|
'app_redirect_title' => 'Opening App...',
|
|
'app_redirect_opening_in' => 'Opening in :app',
|
|
'app_redirect_waiting_text' => 'We are redirecting you to the native application. Please wait a moment...',
|
|
'app_redirect_btn_open' => 'Open Native App',
|
|
'app_redirect_btn_browser' => 'Open in Browser',
|
|
'app_redirect_in_app_warning_title' => 'In-App Browser Detected',
|
|
'app_redirect_in_app_warning_desc' => 'Redirections can be restricted inside Instagram or Facebook. Tap the three dots (•••) in the top-right corner and select "Open in Safari" or "Open in Chrome" to launch the app.',
|
|
|
|
// Link Expired Page
|
|
'expired_title' => 'Link Inactive or Expired',
|
|
'expired_description' => 'This link is no longer active. It may have reached its click limit, expiration date, or has been deactivated.',
|
|
'expired_btn_home' => 'Go to Homepage',
|
|
];
|