Files
filament-short-url/resources/lang/en/default.php

990 lines
68 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
return [
'navigation_label' => 'Links',
'navigation_group' => 'URL Shortener',
'resource_title' => 'Short URL',
'empty_state_heading' => 'No links yet',
'empty_state_description' => 'Start creating short links for your marketing campaigns, referral programs, and more.',
'empty_state_action' => 'Create link',
'empty_state_pixel_heading' => 'No pixels yet',
'empty_state_pixel_description' => 'Add tracking pixels from Meta, Google, TikTok and more to retarget visitors who click your links.',
'empty_state_pixel_action' => 'Create pixel',
// Form Tabs
'tab_link' => 'Link Details',
'tab_tracking' => 'Tracking',
'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_type' => 'Destination Type',
'destination_type_single' => 'Single URL',
'destination_type_split' => 'A/B Split Test',
'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.',
'max_visits_no_limit' => 'No limit',
'max_visits_suffix' => 'visits',
'number_stepper_decrease' => 'Decrease value',
'number_stepper_increase' => 'Increase value',
'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',
'use_date_validity_helper' => 'Schedule when the link becomes active and when it should stop working.',
'validity_tab_intro' => 'Control when your link is available and how many times it can be clicked. Leave everything off for a link that stays open indefinitely.',
'validity_schedule_card_title' => 'Schedule availability',
'validity_schedule_card_subtitle' => 'Optional start and end dates for campaigns, launches, or limited-time offers.',
'validity_schedule_empty_title' => 'Always available',
'validity_schedule_empty_desc' => 'Turn on the switch above to set an activation date, expiration date, or both.',
'validity_schedule_timeline_label' => 'Active window',
'validity_activated_at_helper' => 'Leave empty to activate immediately when saved.',
'validity_expires_at_helper' => 'Optional. After this moment the link stops redirecting.',
'validity_single_use_toggle' => 'Enable single-use mode',
'validity_single_use_active_note' => 'Single-use is on — the link deactivates after the first successful visit. Max visits limit is ignored.',
'validity_max_visits_locked' => 'Unavailable while single-use is enabled',
'tracking_visit_card_title' => 'Visit analytics',
'tracking_visit_card_subtitle' => 'Collect click statistics for this link — disable for privacy-first or redirect-only links.',
'tracking_visit_empty_title' => 'Tracking disabled',
'tracking_visit_empty_desc' => 'Turn on the switch above to record visits and configure which data points are stored.',
'tracking_fields_identity_title' => 'Identity & source',
'tracking_fields_device_title' => 'Device & browser',
'track_ip_desc' => 'IP address for geo insights and abuse signals.',
'track_referer_desc' => 'Referring page URL when the visitor arrives from another site.',
'track_browser_desc' => 'Browser family such as Chrome, Safari, or Firefox.',
'track_browser_version_desc' => 'Exact browser version string from the user agent.',
'track_os_desc' => 'Operating system name such as iOS, Windows, or Android.',
'track_os_version_desc' => 'OS version reported by the visitor device.',
'track_device_type_desc' => 'Device category — desktop, mobile, tablet, or bot.',
'track_browser_language_desc' => 'Preferred language from the Accept-Language header.',
'tracking_utm_card_title' => 'Campaign parameters',
'tracking_utm_card_subtitle' => 'Append UTM tags to the destination URL. Changes sync instantly with the link target.',
'tracking_ga_card_title' => 'Google Analytics 4',
'tracking_ga_card_subtitle' => 'Optional Measurement ID for server-side redirect events via GA4 Measurement Protocol.',
'link_destination_card_title' => 'Destination',
'link_destination_card_subtitle' => 'Send visitors to one URL or split traffic across A/B test variants.',
'link_short_url_card_title' => 'Short link',
'link_short_url_card_subtitle' => 'Choose a domain and customize the back-half of your short URL.',
'link_behavior_card_title' => 'Behavior',
'link_behavior_card_subtitle' => 'Control whether the link is active and how incoming query parameters are handled.',
'link_status_desc' => 'When disabled, visitors see an error page instead of being redirected.',
'link_tags_card_title' => 'Tags',
'link_tags_card_subtitle' => 'Add up to five labels to organize, filter, and report on links.',
'link_notes_card_title' => 'Internal notes',
'link_notes_card_subtitle' => 'Private admin memo — never shown to visitors.',
'link_notes_placeholder' => 'Add a reminder for your team…',
'targeting_rules_card_title' => 'Conditional redirects',
'targeting_rules_card_subtitle' => 'Send visitors to different URLs based on device, country, language, or platform.',
'targeting_rules_empty_title' => 'No targeting rules yet',
'targeting_rules_empty_desc' => 'Add a rule below to override the default destination when specific conditions match.',
'add_targeting_rule' => 'Add rule',
'targeting_rule_conditions_title' => 'When to apply',
'targeting_rule_destination_title' => 'Redirect to',
'filter_duplicate_error' => 'Each filter type (Device, Platform, Country, Language) can only be added once.',
'app_linking_card_title' => 'App linking',
'app_linking_card_subtitle' => 'Open the native mobile app instead of the browser when a matching app is detected.',
'app_linking_empty_title' => 'App auto-open disabled',
'app_linking_empty_desc' => 'Turn on the switch above to preview and enable deep-link behavior on mobile devices.',
'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_none' => 'None',
'qr_option_square' => 'Square',
'qr_option_dots' => 'Dots',
'qr_option_dot' => 'Dot',
'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',
'qr_save_design' => 'Save Design',
// 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',
'url_key_change_confirmation_heading' => 'Replace link?',
'url_key_change_confirmation' => "You've modified the back-half of this link's URL. Saving these changes will update the key. Any references to the original link will break.",
'action_share' => 'Share Link',
'action_move' => 'Move',
'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_btn_refresh' => 'Refresh',
'stats_refresh_success' => 'Statistics refreshed in real-time!',
'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_lock_url_key' => 'Lock Short Key',
'settings_lock_url_key_helper' => 'Globally disable changing the short key after a link is created.',
'settings_disable_default_domain' => 'Disable Default Domain',
'settings_disable_default_domain_helper' => 'Prevent users from using the default app domain for new short links.',
'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 for async visit tracking. Each driver has different requirements — see the info box below when you change this value.',
'settings_redis_test' => 'Test Redis connection',
'settings_redis_test_ok' => 'Redis connection OK',
'settings_redis_test_fail' => 'Redis connection failed',
'settings_queue_worker_test' => 'Test queue worker',
'settings_queue_worker_test_ok' => 'Queue worker OK',
'settings_queue_worker_test_fail' => 'Queue worker not responding',
'settings_section_redis' => 'Redis Connection',
'settings_section_redis_description' => 'These values override database.redis and queue.connections.redis at runtime when Queue Connection is redis. Save settings after changing them.',
'settings_redis_host' => 'Redis Host',
'settings_redis_host_helper' => 'Hostname or IP of the Redis server used for queues, counters, stats, and live feed.',
'settings_redis_port' => 'Redis Port',
'settings_redis_port_helper' => 'Default: 6379.',
'settings_redis_password' => 'Redis Password',
'settings_redis_password_helper' => 'Leave empty if Redis has no password. Stored securely in settings.',
'settings_redis_database' => 'Redis Database',
'settings_redis_database_helper' => 'Logical Redis DB index (015). Default: 0.',
'settings_redis_key_prefix' => 'Key Prefix',
'settings_redis_key_prefix_helper' => 'Optional prefix for all plugin Redis keys. Leave empty to use config default.',
'settings_queue_worker_command' => '<strong>Queue Worker Required:</strong> Run a worker on the same connection and queue name as above (independent of <code>QUEUE_CONNECTION</code> in <code>.env</code>): <code class="px-1.5 py-0.5 rounded bg-gray-200 dark:bg-gray-800 text-xs">php artisan queue:work :connection --queue=:queue</code>',
'settings_queue_mode_desc_redis' => '<strong>redis</strong> — production mode: async jobs, dedicated Redis counters/stats/live feed (phpredis or Predis), auto counter buffering. Configure Redis below (overrides .env at runtime). Use the test buttons before saving.',
'settings_queue_mode_desc_database' => '<strong>database</strong> — async visit jobs stored in the <code>jobs</code> table. No dedicated Redis counters unless you enable buffering manually.',
'settings_queue_mode_desc_sqs' => '<strong>sqs</strong> — async jobs via AWS SQS. Requires valid AWS credentials in <code>config/queue.php</code>.',
'settings_queue_mode_desc_beanstalkd' => '<strong>beanstalkd</strong> — async jobs via Beanstalkd. Requires a running beanstalkd server.',
'settings_queue_mode_desc_deferred' => '<strong>deferred</strong> — jobs run after the HTTP response in the same PHP process. No separate worker, but adds post-response latency under load.',
'settings_queue_mode_desc_background' => '<strong>background</strong> — Laravel background driver: jobs run after the response without a queue worker (similar to deferred).',
'settings_queue_mode_desc_failover' => '<strong>failover</strong> — uses your Laravel failover chain in <code>config/queue.php</code>. Ensure at least one backend in the chain is reachable.',
'settings_queue_mode_desc_default' => '<strong>:connection</strong> — async visit tracking via this Laravel queue connection. Ensure it is configured in <code>config/queue.php</code>.',
'settings_queue_mode_info_sync' => '<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="text-sm text-neutral-800 dark:text-neutral-300"><strong>sync</strong> — visits are recorded during the redirect (no queue worker). Best for local dev and low traffic. Optional manual counter buffering via the toggle below.</div></div>',
'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="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm.75-11.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Zm0 2.5a.75.75 0 0 1 .75.75v4a.75.75 0 0 1-1.5 0v-4a.75.75 0 0 1 .75-.75Z"></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_measurement_id' => 'Measurement ID for connection test',
'settings_ga4_verify_measurement_id_helper' => 'Use the exact G-XXXXXXXXXX from the same GA4 data stream as your API secret. Required unless you use Firebase App ID.',
'settings_ga4_verify_measurement_required' => 'Enter a Measurement ID (G-XXXXXXXXXX) or Firebase App ID to test the connection.',
'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_redis_auto' => 'Automatically enabled with Redis queue. Visit counters, today stats, and live feed use the dedicated queue Redis connection (phpredis or Predis) — independent of CACHE_STORE. Schedule short-url:sync-counters every minute.',
'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="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm.75-11.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Zm0 2.5a.75.75 0 0 1 .75.75v4a.75.75 0 0 1-1.5 0v-4a.75.75 0 0 1 .75-.75Z"></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>',
'settings_geoip_headers_info' => '<div class="callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border border-blue-200 bg-blue-50 dark:border-blue-700 dark:bg-blue-950/20" 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-blue-800 dark:text-blue-300" aria-label="Info"><path fill-rule="evenodd" d="M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0Zm-7-4a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM9 9a.75.75 0 0 0 0 1.5h.253a.25.25 0 0 1 .244.304l-.459 2.066A1.75 1.75 0 0 0 10.747 15H11a.75.75 0 0 0 0-1.5h-.253a.25.25 0 0 1-.244-.304l.459-2.066A1.75 1.75 0 0 0 9.253 9H9Z" clip-rule="evenodd" /></svg></div><div class="text-sm prose dark:prose-invert min-w-0 w-full text-blue-900 dark:text-blue-200" data-component-part="callout-content"><span><strong>CDN Headers driver:</strong> Saving settings with this driver automatically enables <strong>Trust CDN &amp; Proxy Headers</strong>. When CDN country headers are missing, the plugin falls back to MaxMind and then ip-api.com (rate-limited) instead of returning empty geo data.</span></div></div>',
// Stats View & Export Localization
'stats_filter_visited_from' => 'Visited From',
'stats_filter_visited_until' => 'Visited Until',
'stats_filter_counted_in_stats' => 'Stats-counted visits only',
'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',
'stats_csv_utm_source' => 'UTM Source',
'stats_csv_utm_medium' => 'UTM Medium',
'stats_csv_utm_campaign' => 'UTM Campaign',
'stats_csv_utm_term' => 'UTM Term',
'stats_csv_utm_content' => 'UTM Content',
'stats_csv_variant' => 'A/B Variant',
'stats_csv_qr_scan' => 'QR Scan',
'stats_csv_bot' => 'Bot',
'stats_csv_proxy' => 'Proxy/VPN',
// 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_tracking_desc' => 'Enable or disable visit tracking and statistics for this short link.',
'form_section_tracked_fields' => 'Tracked Fields',
'form_section_tracked_fields_desc' => 'Choose which metrics are collected for this link — useful for analytics depth and privacy.',
'form_section_analytics' => 'Third-Party Analytics',
'form_section_analytics_desc' => 'Integrate this link with Google Analytics by providing a data stream identifier.',
// 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' => 'Source',
'stats_breakdown_utm_medium' => 'Medium',
'stats_breakdown_utm_campaign' => 'Campaign',
'stats_breakdown_utm_term' => 'Term',
'stats_breakdown_utm_content' => 'Content',
'stats_no_utm_data' => 'No UTM data recorded.',
// New Targeting & Security Tab and fields
'tab_targeting' => 'Targeting',
'tab_password' => 'Password',
'tab_validity' => 'Expiration',
'expiration_dates_section_title' => 'Date & Time Expiration',
'visit_limits_section_title' => 'Visit Limits',
'security_section_title' => 'Security Controls',
'password' => 'Access Password',
'password_helper' => 'Require visitors to enter a password before being redirected.',
'password_card_title' => 'Password protection',
'password_card_subtitle' => 'Require visitors to enter a password before being redirected.',
'warning_page_card_title' => 'Redirect warning page',
'warning_page_card_subtitle' => 'Show an intermediate screen before redirecting visitors to the destination.',
'warning_page_empty_title' => 'Warning page disabled',
'warning_page_empty_desc' => 'Turn on the switch above to show a safety screen before external redirects.',
'warning_page_active_title' => 'Warning page enabled',
'confirm_password' => 'Confirm Password',
'new_password' => 'New Password',
'change_password' => 'Change Password',
'remove_password' => 'Remove Password',
'password_status_active' => 'Password protection is enabled.',
'password_status_active_desc' => 'This link is protected. Visitors must enter the correct password to continue.',
'password_empty_state_title' => 'No protection',
'password_empty_state_desc' => 'Add a password to restrict access to this short link to selected people only.',
'password_settings_section' => 'Password settings',
'password_change_short' => 'Change',
'password_remove_short' => 'Remove',
'save_password' => 'Save password',
'expiration_dates_section_desc' => 'Control when the link is available. Schedule a campaign start or automatic end.',
'visit_limits_section_desc' => 'Cap total clicks. Useful for one-time tickets or limited offers.',
'set_password' => 'Set Password',
'cancel' => 'Cancel',
'confirm' => 'Confirm',
'password_required_error' => 'Password is required.',
'password_mismatch_error' => 'Passwords do not match.',
'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.',
'rotation_variants' => 'A/B Split Variants',
'rotation_variants_helper' => 'Define the URLs and weight distribution for the A/B Split Test.',
'variant_label' => 'Variant Label',
'variant_url' => 'Variant URL',
'variant_weight' => 'Traffic Share (%)',
'safe_browsing_error' => 'This URL has been flagged by Google Safe Browsing as unsafe.',
'outbound_url_blocked' => 'This outbound URL is not allowed.',
// New Advanced Targeting Builder
'targeting_rules' => 'Targeting Rules',
'add_filter' => 'Add a filter',
'match' => 'Match',
'match_or' => 'Any of the following filters (OR)',
'match_and' => 'All the following filters (AND)',
'filter_device' => 'Device',
'filter_platform' => 'Platform',
'filter_country' => 'Country',
'filter_language' => 'Browser Language',
'direct_to_url' => 'Direct to URL',
'select_devices' => 'Select devices',
'select_platforms' => 'Select operating systems',
'select_countries' => 'Select countries',
'select_languages' => 'Select browser languages',
'device_desktop_label' => 'Desktop',
'device_mobile_label' => 'Smartphone',
'device_tablet_label' => 'Tablet',
// 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 raw visit log pruning',
'settings_aggregation_enabled_helper' => 'The daily 02:00 job always aggregates visits into daily statistics. This toggle controls only whether raw visit rows older than the retention period are deleted.',
'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_route_info' => '<div class="callout my-2 px-4 py-3 rounded-xl border border-blue-200 bg-blue-50 dark:border-blue-800 dark:bg-blue-950/30 text-sm text-blue-900 dark:text-blue-200"><strong>Two layers:</strong> redirect routes also use the package middleware throttle (default <code>120/min</code> per IP). When you enable the limiter below, <em>both</em> can return HTTP 429 — the stricter one wins first.</div>',
'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="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm.75-11.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Zm0 2.5a.75.75 0 0 1 .75.75v4a.75.75 0 0 1-1.5 0v-4a.75.75 0 0 1 .75-.75Z"></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. Run a worker that listens on the same connection and queue name as above (this is independent of <code>QUEUE_CONNECTION</code> in <code>.env</code>):<br><code class="px-1.5 py-0.5 rounded bg-gray-200 dark:bg-gray-800 text-xs">php artisan queue:work :connection --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',
'settings_track_anonymize_ips' => 'IP Address Anonymization (GDPR/RODO)',
'settings_track_anonymize_ips_helper' => 'Replace the last octet of IPv4 addresses or last 80 bits of IPv6 addresses with zeros before saving them to the database to comply with GDPR/RODO regulations. The raw IP address is still hashed privately to ensure unique click statistics remain accurate.',
'stats_filter_limit_exceeded' => 'Maximum of 5 filters can be applied simultaneously.',
// 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.',
'marketing_pixels_empty_title' => 'No pixels attached',
'marketing_pixels_empty_desc' => 'Select one or more retargeting pixels to fire client-side tracking scripts when visitors click this link.',
'marketing_pixels_select_placeholder' => 'Choose retargeting pixels…',
'marketing_webhook_empty_title' => 'No webhook configured',
'marketing_webhook_empty_desc' => 'Add a destination URL to receive real-time HTTP POST notifications on each click.',
'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',
'webhook_helper_alert' => 'Once configured, each visit to this short link triggers a real-time HTTP POST request to this URL. The payload contains detailed click metadata in JSON format (URL key, destination, device, browser, operating system, geo, referrer, UTM parameters, and QR scan flag). IP addresses are not included in webhook payloads.',
'webhook_show_payload' => 'Show example JSON payload',
'webhook_payload_modal_title' => 'Example webhook payload',
'webhook_payload_modal_desc' => 'Sample JSON body for the visited event. Actual values depend on each click.',
'webhook_payload_copy' => 'Copy payload to clipboard',
// 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_owner_user_id' => 'Owner User ID',
'api_key_owner_user_id_helper' => 'Required when link scoping is enabled (default). Limits this key to links owned by that user.',
'api_key' => 'API Key',
'active' => 'Active',
'api_key_generated' => 'API Key Generated',
'api_key_warning' => "Please copy this key now. You won't be able to see it again!",
// 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_section_analytics_security' => 'Analytics & Bot Detection',
'settings_section_analytics_security_desc' => 'Optional click deduplication and advanced bot detection settings.',
'settings_click_dedup_enabled' => 'Enable Click Deduplication',
'settings_click_dedup_enabled_helper' => 'Ignore repeat clicks from the same IP within the configured time window.',
'settings_click_dedup_hours' => 'Deduplication Window (hours)',
'settings_click_dedup_hours_helper' => 'How long to treat repeat clicks from the same IP as duplicates.',
'settings_bot_verify_googlebot' => 'Verify Googlebot IP',
'settings_bot_verify_googlebot_helper' => 'Reverse-DNS + forward IP check for Googlebot user agents.',
'settings_bot_debug_secret' => 'Bot Debug Secret',
'settings_bot_debug_secret_helper' => 'Required value for ?bot=1 outside local/testing environments.',
'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_social_warning' => '<div class="callout my-2 px-4 py-3 rounded-xl border border-amber-200 bg-amber-50 dark:border-amber-800 dark:bg-amber-950/30 text-sm text-amber-900 dark:text-amber-200"><strong>Link previews:</strong> blocking mode returns HTTP 403 for VPN/proxy/datacenter IPs. Known social crawlers (Facebook, LinkedIn, Google preview bots) are <em>still allowed</em> so OG meta and cloaked pages keep working. Human visitors on VPN may be blocked.</div>',
'settings_vpn_detection_timeout' => 'VPN detection timeout',
'settings_vpn_detection_timeout_helper' => 'Maximum seconds to wait for the VPN/proxy API response on each redirect.',
'settings_vpn_detection_cache_ttl' => 'VPN detection cache TTL',
'settings_vpn_detection_cache_ttl_helper' => 'How long (in seconds) to cache VPN/proxy lookup results per IP address.',
'settings_trust_cdn_headers_auto_enabled' => '<div class="callout my-2 px-4 py-3 rounded-xl border border-blue-200 bg-blue-50 dark:border-blue-800 dark:bg-blue-950/30 text-sm text-blue-900 dark:text-blue-200">The <strong>CDN Headers</strong> Geo-IP driver (Geo-IP tab) requires trusting proxy headers. This option is <strong>automatically enabled</strong> when that driver is selected and on save.</div>',
'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_card_qr_rate' => 'QR Scan Conversion Rate',
'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_deep_link_label' => 'Deep link URL',
'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',
'weights_sum_error' => 'The sum of all variant weights must be exactly 100%. Current sum: :sum%.',
'balance_weights' => 'Adjust to 100%',
'url_key_locked_error' => 'The URL key is locked and cannot be changed.',
'custom_domain_locked_error' => 'The custom domain is locked and cannot be changed.',
'custom_domain_not_owned_error' => 'You do not have permission to use this custom domain.',
'resource_not_owned_error' => 'You do not have permission to use this resource.',
'webhook_signing_secret_required' => 'A webhook signing secret is required when the global webhook is enabled.',
'webhook_signing_secret' => 'Webhook Signing Secret',
'webhook_signing_secret_helper' => 'Required when the global webhook is enabled. Outgoing requests include HMAC-SHA256 in X-ShortUrl-Signature.',
// Stats View & Granularity & PoP Trends
'stats_prev_period' => 'prev period',
'stats_granularity_hourly' => 'Hourly',
'stats_granularity_daily' => 'Daily',
'stats_granularity_weekly' => 'Weekly',
'stats_granularity_monthly' => 'Monthly',
// Stats Security Widget
'stats_security_title' => 'Security & Bot Analytics',
'stats_security_real_users' => 'Real Users',
'stats_security_bots' => 'Bots & Crawlers',
'stats_security_vpn_blocked' => 'Blocked VPN/Proxy Traffic',
'stats_security_no_vpn_blocks' => 'No blocked VPN visits',
'stats_security_bot_ratio' => 'Bot Traffic Ratio',
'stats_security_human_clicks' => 'human clicks',
'stats_security_bot_clicks' => 'bot clicks',
'stats_security_proxy_clicks' => 'VPN/Proxy detected',
// Visit Logs Column & Modal translation enhancements
'stats_col_link' => 'Link',
'stats_col_referrer' => 'Referrer',
'stats_col_language' => 'Language',
'stats_col_utm_source' => 'UTM Source',
'stats_col_utm_medium' => 'UTM Medium',
'stats_col_utm_campaign' => 'UTM Campaign',
'stats_col_utm_term' => 'UTM Term',
'stats_col_utm_content' => 'UTM Content',
'stats_col_variant' => 'A/B Variant',
'stats_col_qr_scan' => 'QR Scan',
'stats_col_bot' => 'Bot',
'stats_col_proxy' => 'Proxy/VPN',
'stats_referer_direct' => '(direct)',
'stats_device_desktop' => 'Desktop',
'stats_device_mobile' => 'Mobile',
'stats_device_tablet' => 'Tablet',
'stats_device_bot' => 'Robot / Bot',
'stats_action_view_details' => 'View Details',
'stats_modal_visit_details' => 'Visit Details',
'stats_detail_location' => 'Location',
'stats_detail_is_bot' => 'Is Bot?',
'stats_detail_is_proxy' => 'Is Proxy/VPN?',
'stats_detail_is_qr' => 'Is QR Scan?',
'stats_detail_visited_at' => 'Visited At',
'stats_yes' => 'Yes',
'stats_no' => 'No',
'add_url' => 'Add URL',
'traffic_split' => 'Traffic Split',
'delete_confirmation_desc' => 'Are you sure you want to delete the following link? Deleting these links will remove all of their analytics. This action cannot be undone proceed with caution.',
'delete_verification_label' => 'To verify, type <strong>:short_url</strong> below',
'delete_verification_error' => 'The entered URL does not match.',
// Custom Domains
'empty_state_domain_heading' => 'No custom domains yet',
'empty_state_domain_description' => 'Add your own custom domains to serve short links using your brand identity (e.g. links.acme.com) instead of the default app domain.',
'empty_state_domain_action' => 'Add domain',
'dns_configuration_guide' => 'DNS Configuration Guide',
'dns_for_subdomains' => 'For Subdomains (CNAME)',
'dns_for_root_domains' => 'For Root Domains (A Record)',
'copied' => 'Copied!',
'domains_navigation_label' => 'Custom Domains',
'domain_resource_title' => 'Custom Domain',
'domain_label' => 'Domain Name',
'domain_status_active' => 'Active',
'domain_status_verified' => 'DNS Verified',
'domain_verification_status' => 'Verification Status',
'action_verify_dns' => 'Verify DNS',
'dns_verify_success' => 'DNS record verified successfully!',
'dns_verify_fail' => 'DNS verification failed. Please check your configuration and try again.',
'default_domain_label' => 'Default App Domain',
'dns_tab_a' => 'A Record (recommended)',
'dns_tab_cname' => 'CNAME Record',
'dns_instructions_apex' => 'To configure your apex domain :domain, set the following A record on your DNS provider:',
'dns_instructions_subdomain' => 'To configure your subdomain :domain, set the following CNAME record on your DNS provider:',
'dns_table_type' => 'Type',
'dns_table_name' => 'Name',
'dns_table_value' => 'Value',
'dns_table_ttl' => 'TTL',
'dns_warning_ttl' => 'If a TTL value of 86400 is not available, choose the highest available value. Domain propagation may take up to 12 hours.',
'dns_setup_title' => ':domain - DNS Setup',
'domain_status_valid' => 'Valid',
'domain_status_invalid' => 'Invalid',
'domain_no_redirects' => 'No redirects configured',
'domain_mapped_links' => 'Mapped to :count short link|Mapped to :count short links',
'action_delete_domain' => 'Delete Domain',
'delete_domain_confirmation_desc' => 'Are you sure you want to delete this custom domain? This action cannot be undone proceed with caution.',
'short_link_label' => 'Short Link',
// API Scopes & Rate Limits
'api_key_scope' => 'API Scope',
'api_key_scope_helper' => 'Choose the permission level for this API key.',
'api_key_scope_read_write' => 'Read & Write (Full Access)',
'api_key_scope_read_only' => 'Read Only',
'api_key_rate_limit' => 'Rate Limit',
'api_key_rate_limit_helper' => 'Define the maximum requests per minute allowed for this key.',
'api_key_rate_limit_unlimited' => 'Unlimited',
'api_key_rate_limit_rpm' => ':count requests / min',
// Folders
'folders_navigation_label' => 'Folders',
'folder_resource_title' => 'Folder',
'folder_name' => 'Folder Name',
'folder_slug' => 'Slug',
'folder_color' => 'Color',
'empty_state_folder_action' => 'Create Folder',
'empty_state_folders_heading' => 'No folders yet',
'empty_state_folders_description' => 'Organize your short links into folders.',
'action_edit_folder' => 'Edit Folder',
'action_delete_folder' => 'Delete Folder',
'link_count_one' => '1 link',
'link_count_many' => ':count links',
// Tags
'tags_navigation_label' => 'Tags',
'tag_resource_title' => 'Tag',
'tag_name' => 'Tag Name',
'tag_slug' => 'Slug',
'tag_color' => 'Color',
'empty_state_tag_action' => 'Create Tag',
'empty_state_tags_heading' => 'No tags yet',
'empty_state_tags_description' => 'Tag your short links to filter them easily.',
'action_edit_tag' => 'Edit Tag',
'action_delete_tag' => 'Delete Tag',
// Archiving
'is_archived' => 'Archived',
'is_archived_helper' => 'Archived links are hidden from the active list but continue to redirect.',
'action_archive' => 'Archive',
'action_restore' => 'Restore',
'action_archive_selected' => 'Archive Selected',
'action_restore_selected' => 'Restore Selected',
'tab_active_links' => 'Active',
'tab_archived_links' => 'Archived',
// Live Feed
'stats_tab_live_feed' => 'Live Feed',
'stats_live_feed_empty' => 'No visits recorded yet. Visits will appear here in real-time.',
'stats_live_feed_poll_interval' => 'Live via SSE',
'stats_live_feed_mode_redis' => 'Live · Redis push',
'stats_live_feed_mode_poll' => 'Live · SSE poll',
'stats_col_visitor' => 'Visitor / Location',
// Empty state mock values
'empty_state_tags_mock_redirecting' => 'Redirecting...',
'empty_state_tags_mock_promo' => 'promo',
'empty_state_tags_mock_social' => 'social',
'empty_state_tags_mock_dev' => 'dev',
// Folder links count
'folder_one_link' => '1 link',
'folder_many_links' => ':count links',
// Colors
'color_gray' => 'Gray',
'color_red' => 'Red',
'color_blue' => 'Blue',
'color_green' => 'Green',
'color_yellow' => 'Yellow',
'color_indigo' => 'Indigo',
'color_purple' => 'Purple',
'color_pink' => 'Pink',
// SEO & Social
'tab_seo_social' => 'SEO & Social',
'is_cloaked' => 'Link Cloaking',
'is_cloaked_helper' => 'Mask the destination URL in the address bar using an iframe on your short link domain.',
'is_cloaked_iframeable_hint' => 'Some destinations block iframe embedding (X-Frame-Options). Use the iframeable pre-check before enabling cloaking.',
'do_index' => 'Search Engine Indexing',
'do_index_helper' => 'Allow search engines (like Google) to index this short URL. Otherwise, it is served with a noindex tag.',
'og_title' => 'Custom Title',
'og_description' => 'Custom Description',
'og_image' => 'Custom Image',
'og_section_title' => 'Social Media Preview (Open Graph)',
'og_section_desc' => 'Customize how this link looks when shared on Facebook, X, LinkedIn, WhatsApp, and Slack.',
'seo_section_title' => 'Search Engine Indexing & Cloaking',
'seo_section_desc' => 'Manage search engine crawling settings and stealth cloaking parameters.',
'live_social_preview' => 'Social Card Preview',
'live_qr_preview' => 'QR Code Preview',
'advanced_options_section' => 'Advanced Redirect & State Options',
// Social Card Preview sidebar
'og_title_placeholder' => 'Page title will appear here',
'og_description_placeholder' => 'Page description will appear here',
'og_empty_state_hint' => 'Paste a link to auto-generate preview',
'password_prompt_preview_desc' => 'Visitors will see a password prompt before being redirected.',
'fetching_metadata' => 'Fetching preview...',
// HTTP / API messages (visitor-facing & REST)
'api_disabled' => 'The Developer API is currently disabled. Enable it in Short URL Settings → API & Webhooks.',
'api_key_missing' => 'Unauthorized. API Key is missing.',
'api_key_invalid' => 'Unauthorized. Invalid or inactive API Key.',
'api_key_owner_required' => 'Forbidden. This API key must have an owner_user_id when link scoping is enabled.',
'api_key_read_only' => 'Forbidden. This API key has read-only permissions.',
'api_rate_limit_exceeded' => 'Too many requests. API key rate limit exceeded.',
'short_url_not_found' => 'Short URL not found.',
'redirect_vpn_blocked' => 'Access denied. VPN, Proxy, or automated scraping connection detected.',
'redirect_rate_limited' => 'Too many requests. Please try again in :seconds seconds.',
'redirect_destination_blocked' => 'This link destination has been blocked for security reasons.',
'public_stats_rate_limited' => 'Too many requests.',
'public_stats_password_invalid' => 'Password required or invalid.',
'public_stats_password_rate_limited' => 'Too many incorrect password attempts. Please try again later.',
'public_stats_retry_in' => 'Please try again in :seconds seconds.',
'action_public_stats' => 'Public stats',
'public_stats_modal_title' => 'Public statistics',
'public_stats_modal_description' => 'Share a read-only stats page without giving access to the admin panel.',
'public_stats_save' => 'Save',
'public_stats_enabled_label' => 'Enable public statistics page',
'public_stats_password_label' => 'Optional password',
'public_stats_password_helper' => 'Leave blank to keep the current password. Clear by disabling public stats.',
'public_stats_disabled_hint' => 'Public stats are off. Enable the toggle and save to generate a shareable link.',
'public_stats_link_label' => 'Public stats link',
'public_stats_save_to_activate' => 'Save to activate this link.',
'public_stats_enabled_status' => 'Public stats are enabled.',
'public_stats_copied' => 'Public stats link copied.',
'public_stats_open' => 'Open',
'public_stats_saved_enabled' => 'Public statistics enabled.',
'public_stats_saved_disabled' => 'Public statistics disabled.',
'public_stats_page_title' => 'Link statistics',
'public_stats_page_subtitle' => 'Stats for /:key',
'public_stats_date_from' => 'From',
'public_stats_date_to' => 'To',
'public_stats_apply_filter' => 'Apply',
'public_stats_total_visits' => 'Total visits',
'public_stats_unique_visits' => 'Unique visits',
'public_stats_today' => 'Today',
'public_stats_this_week' => 'This week',
'public_stats_this_month' => 'This month',
'public_stats_qr_scans' => 'QR scans',
'public_stats_visits_by_day' => 'Visits by day',
'public_stats_no_data' => 'No visits recorded for this period.',
'public_stats_day' => 'Day',
'public_stats_visits' => 'Visits',
'public_stats_password_title' => 'Protected statistics',
'public_stats_password_description' => 'Enter the password to view statistics for this link.',
'public_stats_password_submit' => 'View statistics',
'redirect_html_redirecting' => 'Redirecting you to the destination website...',
'api_created' => 'Short URL created successfully.',
'api_updated' => 'Short URL updated successfully.',
'api_bulk_created' => 'Short URLs created successfully.',
'api_deleted' => 'Short URL deleted successfully.',
'api_bulk_deleted' => 'Short URLs deleted successfully.',
'api_bulk_updated' => 'Short URLs updated successfully.',
];