Admin → Extension Manager → Install.'; $lang['select_all'] = 'Select All'; $lang['x_selected_backups'] = '(%d selected)'; $lang['selected'] = 'selected'; $lang['backup_file'] = 'Backup File'; $lang['size'] = 'Size'; $lang['actions'] = 'Actions'; $lang['download'] = 'Download'; $lang['restore'] = 'Restore'; $lang['rename'] = 'Rename'; $lang['no_backups_yet'] = 'No backups yet. Click "Create Backup Now" to create your first backup.'; $lang['select_zip_file'] = 'Please select a ZIP file'; $lang['confirm_upload'] = 'Upload and install new plugin version?'; $lang['restore_confirm'] = "Restore from backup: %s?\n\nThis will replace the current plugin files with the backup version."; $lang['restore_error'] = 'Restore failed: Backup file not found.'; $lang['enter_new_name'] = 'Enter new name for the backup:'; $lang['delete_backup_confirm'] = 'Delete this backup: %s?'; $lang['delete_selected_confirm'] = 'Delete %d selected backup(s)?'; // Outlook Sync Tab $lang['outlook_sync_config'] = 'Outlook Sync Configuration'; $lang['export_config'] = 'Export Config'; $lang['import_config'] = 'Import Config'; $lang['importing'] = 'Importing...'; $lang['import_success'] = 'Import successful! Reloading...'; $lang['azure_credentials'] = 'Microsoft Azure App Credentials'; $lang['azure_register_hint'] = 'Register at Azure Portal → App registrations'; $lang['tenant_id'] = 'Tenant ID'; $lang['client_id'] = 'Client ID (Application ID)'; $lang['client_secret'] = 'Client Secret'; $lang['keep_secret_safe'] = 'Keep this secret safe!'; $lang['outlook_settings'] = 'Outlook Settings'; $lang['user_email'] = 'User Email'; $lang['timezone'] = 'Timezone'; $lang['default_category'] = 'Default Category'; $lang['reminder_minutes'] = 'Reminder (minutes)'; $lang['sync_options'] = 'Sync Options'; $lang['sync_completed_tasks'] = 'Sync completed tasks'; $lang['delete_from_outlook'] = 'Delete from Outlook when removed'; $lang['sync_all_namespaces'] = 'Sync all namespaces'; $lang['select_namespaces_to_sync'] = 'Select namespaces to sync:'; $lang['namespace_to_category'] = 'Namespace → Category'; $lang['ns_mapping_hint'] = 'One per line: namespace=Category'; $lang['color_to_category'] = 'Event Color → Category'; $lang['color_mapping_hint'] = 'Map calendar colors to Outlook categories'; $lang['none'] = '-- None --'; $lang['save_configuration'] = 'Save Configuration'; $lang['config_exported'] = 'Config exported successfully!'; $lang['config_export_warning'] = "This file contains encrypted credentials.\nKeep it secure!"; $lang['export_failed'] = 'Export failed'; $lang['error'] = 'Error'; $lang['sync_status'] = 'Sync Status'; $lang['sync_now'] = 'Sync Now'; $lang['stop_sync'] = 'Stop Sync'; $lang['syncing'] = 'Syncing...'; $lang['last_sync_label'] = 'Last sync'; $lang['never_synced'] = 'Never'; $lang['sync_log'] = 'Sync Log'; $lang['download_log'] = 'Download Log'; $lang['clear_log'] = 'Clear Log'; $lang['no_log_entries'] = 'No log entries'; $lang['log_cleared'] = 'Log cleared'; // Themes Tab $lang['sidebar_widget_settings'] = 'Sidebar Widget Settings'; $lang['sidebar_widget_desc'] = 'Customize the appearance and behavior of the sidebar calendar widget.'; $lang['week_start_day'] = 'Week Start Day'; $lang['week_start_desc'] = 'Choose which day the week calendar grid starts with:'; $lang['monday'] = 'Monday'; $lang['sunday'] = 'Sunday'; $lang['week_starts_monday'] = 'Week starts on Monday (ISO standard)'; $lang['week_starts_sunday'] = 'Week starts on Sunday (US/Canada standard)'; $lang['itinerary_section'] = 'Itinerary Section'; $lang['itinerary_desc'] = 'Choose whether the Today/Tomorrow/Important Events sections are expanded or collapsed by default:'; $lang['expanded'] = 'Expanded'; $lang['collapsed'] = 'Collapsed'; $lang['show_itinerary_default'] = 'Show itinerary sections by default'; $lang['hide_itinerary_default'] = 'Hide itinerary sections by default (click bar to expand)'; $lang['visual_theme'] = 'Visual Theme'; $lang['theme_matrix'] = 'Matrix Edition'; $lang['theme_matrix_desc'] = 'Dark green theme with Matrix-style glow effects and neon accents'; $lang['theme_purple'] = 'Purple Dream'; $lang['theme_purple_desc'] = 'Rich purple theme with elegant violet accents and soft glow'; $lang['theme_professional'] = 'Professional Blue'; $lang['theme_professional_desc'] = 'Clean blue and grey theme with modern professional styling, no glow effects'; $lang['theme_pink'] = 'Pink Bling'; $lang['theme_pink_desc'] = 'Glamorous hot pink theme with maximum sparkle, hearts, and diamonds ✨'; $lang['theme_wiki'] = 'Wiki Default'; $lang['theme_wiki_desc'] = 'Automatically matches your DokuWiki template theme using CSS variables - adapts to light and dark themes'; $lang['preview'] = 'Preview'; $lang['save_settings'] = 'Save Settings'; $lang['settings_saved'] = 'Settings saved successfully!'; // Sync Controls $lang['sync_controls'] = 'Sync Controls'; $lang['run_sync_now'] = 'Run Sync Now'; $lang['stop_sync'] = 'Stop Sync'; $lang['no_cron_detected'] = 'No cron job detected'; $lang['running'] = 'Running...'; $lang['starting_sync'] = 'Starting sync...'; $lang['stopping_sync'] = 'Stopping sync...'; $lang['duplicate_log_warning'] = 'Duplicate log entries: Your crontab has a >> redirect. The sync script logs internally, so this causes duplicate entries. Remove the redirect from your crontab.'; $lang['show_cron_details'] = 'Show cron details'; $lang['cron_setup_hint'] = 'To enable automatic syncing, add to crontab:'; $lang['cron_note'] = 'Note: The script logs to %s automatically. Do not use >> redirect.'; $lang['log_not_writable'] = 'Log file not writable. Run:'; // Live Sync Log $lang['live_sync_log'] = 'Live Sync Log'; $lang['log_location'] = 'Location:'; $lang['updates_interval'] = 'Updates every 2 seconds'; $lang['pause'] = 'Pause'; $lang['resume'] = 'Resume'; $lang['loading_log'] = 'Loading log...'; $lang['no_log_data'] = 'No log data available'; $lang['clear_log_confirm'] = "Clear the sync log file?\n\nThis will delete all log entries."; $lang['log_cleared_success'] = 'Log cleared successfully'; // Color names for color mapping $lang['color_blue'] = 'Blue'; $lang['color_green'] = 'Green'; $lang['color_red'] = 'Red'; $lang['color_orange'] = 'Orange'; $lang['color_purple'] = 'Purple'; $lang['color_teal'] = 'Teal'; // Placeholder texts $lang['enter_client_secret'] = 'Enter client secret'; // Error messages $lang['error_admin_required'] = 'Admin access required'; $lang['error_unknown_action'] = 'Unknown admin action'; $lang['error_save_config'] = 'Error: Could not save configuration file'; $lang['error_log_not_writable'] = 'Log file not writable'; // Update Plugin JavaScript strings $lang['select_zip_file'] = 'Please select a ZIP file'; $lang['upload_confirm'] = "Upload and install: %s?\n\nThis will replace all plugin files.\nYour configuration and data will be preserved.\n\nContinue?"; $lang['selected'] = 'selected'; $lang['no_backups_selected'] = 'No backups selected'; $lang['delete_selected_confirm'] = "Delete %d selected backup(s)?\n\n%s\n\nThis cannot be undone!"; $lang['deleted_with_errors'] = 'Deleted %d backups. Errors: %s'; $lang['rename_prompt'] = "Enter new backup name (without .zip extension):\n\nCurrent: %s"; $lang['invalid_filename'] = 'Invalid filename. Use only letters, numbers, dots, dashes, and underscores.'; // Additional error and status messages $lang['no_log_file'] = 'No log file found. Sync hasn\'t run yet.'; $lang['admin_access_required'] = 'Admin access required'; $lang['unknown_admin_action'] = 'Unknown admin action'; // Configuration save messages $lang['config_saved_success'] = 'Configuration saved successfully!'; $lang['config_save_error'] = 'Error: Could not save configuration file'; $lang['important_ns_saved'] = 'Important namespaces saved'; // Import/Export config messages $lang['export_success'] = "Config exported successfully!\n\nāš ļø This file contains encrypted credentials.\nKeep it secure!"; $lang['export_failed'] = 'Export failed'; $lang['importing'] = 'Importing...'; $lang['import_successful'] = 'Import successful! Reloading...'; $lang['import_failed'] = 'Import failed'; // Cleanup messages $lang['cleanup_complete'] = 'Cleanup complete'; $lang['failed'] = 'Failed'; // Recurring pattern descriptions $lang['every_x_days'] = 'Every %d days'; $lang['every_x_weeks'] = 'Every %d weeks'; $lang['every_x_months'] = 'Every %d months'; $lang['every_x_years'] = 'Every %d years'; // Upload/restore messages $lang['failed_to_add'] = 'Failed to add: %s'; $lang['cannot_read'] = 'Cannot read: %s'; // Import/cleanup messages $lang['import_complete'] = 'Import complete! Imported %d new events'; $lang['cleanup_deleted'] = 'Cleanup complete! Deleted %d event(s). Backup created: %s'; // Recurring pattern labels $lang['daily'] = 'Daily'; $lang['weekly'] = 'Weekly'; $lang['bi_weekly'] = 'Bi-weekly'; $lang['monthly'] = 'Monthly'; $lang['quarterly'] = 'Quarterly'; $lang['semi_annual'] = 'Semi-annual'; $lang['yearly'] = 'Yearly'; // Day abbreviations for patterns $lang['day_sun'] = 'Sun'; $lang['day_mon'] = 'Mon'; $lang['day_tue'] = 'Tue'; $lang['day_wed'] = 'Wed'; $lang['day_thu'] = 'Thu'; $lang['day_fri'] = 'Fri'; $lang['day_sat'] = 'Sat'; // Ordinal labels $lang['ordinal_1st'] = '1st'; $lang['ordinal_2nd'] = '2nd'; $lang['ordinal_3rd'] = '3rd'; $lang['ordinal_4th'] = '4th'; $lang['ordinal_5th'] = '5th'; $lang['ordinal_last'] = 'Last'; // Pattern format strings $lang['pattern_day_x'] = '%s (day %s)'; $lang['pattern_ordinal_day'] = '%s (%s %s)'; // Import status $lang['skipped_duplicates'] = ', skipped %d duplicates'; // AJAX response messages $lang['removed_past_recurring'] = 'Removed %d past recurring occurrences'; $lang['added_occurrences'] = 'Added %d new occurrences'; $lang['removed_past_before'] = 'Removed %d past occurrences before %s'; $lang['paused_occurrences'] = 'Paused %d future occurrences'; $lang['resumed_occurrences'] = 'Resumed %d occurrences'; $lang['start_date_unchanged'] = 'Start date unchanged'; $lang['shifted_occurrences'] = 'Shifted %d occurrences %s by %d days'; $lang['respaced_occurrences'] = 'Respaced %d future occurrences to %s (%d days)'; $lang['sync_script_not_found'] = 'Sync script not found at: %s'; $lang['cannot_create_log_dir'] = 'Cannot create log directory: %s'; $lang['cannot_create_log_file'] = 'Cannot create log file: %s'; $lang['log_not_writable_chmod'] = 'Log file not writable: %s - Run: chmod 666 %s'; $lang['cannot_find_php'] = 'Cannot find PHP binary'; $lang['sync_completed'] = 'Sync completed! Check log for details.'; $lang['stop_signal_sent'] = 'Stop signal sent to sync process'; $lang['failed_abort_flag'] = 'Failed to create abort flag'; $lang['config_not_found'] = 'Config file not found'; $lang['config_exported'] = 'Config exported successfully'; $lang['no_config_data'] = 'No config data provided'; $lang['decryption_failed'] = 'Decryption failed. This config file was exported from a different DokuWiki installation (different secret key).'; // Direction strings for shift $lang['forward'] = 'forward'; $lang['back'] = 'back'; // Additional AJAX/backend messages $lang['no_future_to_respace'] = 'No future occurrences to respace'; $lang['sync_failed_exit'] = 'Sync failed (exit code: %d)'; $lang['theme_saved_refresh'] = 'āœ“ Theme and settings saved successfully! Refresh any page with the sidebar to see changes.'; // Upload/Update error messages $lang['upload_failed'] = 'Upload failed: %s'; $lang['no_file_uploaded'] = 'No file uploaded'; $lang['dir_not_writable'] = 'Plugin directory is not writable. Please check permissions: %s'; $lang['parent_dir_not_writable'] = 'Plugin parent directory is not writable. Please check permissions: %s'; $lang['invalid_file_type'] = 'Invalid file type. Please upload a ZIP file.'; $lang['backup_not_created'] = 'Backup file was not created'; $lang['backup_too_small'] = 'Backup file is too small (%s). Only %d files were added. Backup aborted.'; $lang['backup_incomplete'] = 'Backup incomplete: Only %d files were added (expected 30+). Backup aborted.'; $lang['backup_zip_failed'] = 'Failed to create backup ZIP file'; $lang['backup_failed'] = 'Backup failed: %s'; $lang['open_zip_failed'] = 'Failed to open ZIP file'; $lang['plugin_updated'] = 'Plugin updated successfully!'; $lang['backup_saved_as'] = ' Backup saved as: %s'; $lang['no_backup_specified'] = 'No backup file specified'; $lang['invalid_backup_filename'] = 'Invalid backup filename'; $lang['backup_not_found'] = 'Backup file not found'; $lang['backup_deleted'] = 'Backup deleted: %s'; $lang['delete_backup_failed'] = 'Failed to delete backup. Check file permissions.'; $lang['missing_filenames'] = 'Missing filename(s)'; $lang['invalid_filename_format'] = 'Invalid filename format'; $lang['file_exists'] = 'A file with the new name already exists'; $lang['backup_renamed'] = 'Backup renamed: %s → %s'; $lang['rename_backup_failed'] = 'Failed to rename backup. Check file permissions.'; $lang['extension_manager_unavailable'] = 'DokuWiki Extension Manager not available. Please install manually: Download the backup, go to Admin → Extension Manager → Install, and upload the ZIP file.'; $lang['plugin_restored'] = 'Plugin restored from backup: %s (via Extension Manager)'; $lang['restore_failed'] = 'Restore failed: %s'; $lang['dir_not_readable'] = 'Plugin directory is not readable. Please check permissions.'; $lang['cannot_save_backup'] = 'Plugin parent directory is not writable. Cannot save backup.'; $lang['backup_created_success'] = 'āœ“ Manual backup created successfully: %s (%s, %d files)'; $lang['dir_does_not_exist'] = 'Directory does not exist: %s'; $lang['dir_not_readable_err'] = 'Directory is not readable: %s'; // Config import/export additional messages $lang['invalid_config_php_tag'] = 'Invalid config file: missing PHP opening tag. The file may be corrupted or from a different installation.'; $lang['invalid_config_prohibited'] = 'Invalid config file: contains prohibited code patterns'; $lang['invalid_config_return'] = 'Invalid config file: must contain a return array statement'; $lang['config_write_failed'] = 'Failed to write config file'; $lang['config_imported'] = 'Config imported successfully'; // Log file messages $lang['log_file_created'] = 'Log file created'; $lang['log_not_exist_create'] = 'Log file does not exist and cannot be created: %s'; $lang['log_not_writable_sudo'] = 'Log file not writable. Run: sudo chmod 666 %s'; $lang['file_put_failed'] = 'file_put_contents failed on: %s'; // Cache messages $lang['cache_cleared'] = 'Cache cleared successfully!'; $lang['cache_not_found'] = 'Cache directory not found'; // Recurring event messages $lang['deleted_recurring'] = 'Deleted %d occurrences of recurring event: %s'; $lang['updated_recurring'] = 'Updated %d occurrences of recurring event%s'; // Event management messages $lang['no_events_selected'] = 'No events selected'; $lang['moved_events'] = 'Moved %d event(s) to namespace: %s'; $lang['event_file_not_found'] = 'Event file not found'; $lang['event_read_failed'] = 'Could not read event file'; $lang['event_not_found'] = 'Event not found'; $lang['moved_event'] = 'Moved "%s" to %s'; // Namespace management messages $lang['namespace_empty'] = 'Namespace name cannot be empty'; $lang['namespace_invalid'] = 'Invalid namespace name. Use only letters, numbers, underscore, hyphen, and colon.'; $lang['namespace_exists'] = 'Namespace \'%s\' already exists with events'; $lang['namespace_create_failed'] = 'Failed to create namespace directory'; $lang['namespace_created'] = 'Created namespace: %s'; $lang['namespace_traversal'] = 'Invalid namespace: path traversal not allowed'; $lang['namespace_not_found'] = 'Namespace directory not found: %s'; $lang['namespace_deleted'] = 'Deleted namespace \'%s\': %d events in %d files'; $lang['namespace_renamed'] = 'Renamed namespace \'%s\' to \'%s\': %d events in %d files'; $lang['old_namespace_invalid'] = 'Invalid old namespace name. Use only letters, numbers, underscore, hyphen, and colon.'; $lang['new_namespace_invalid'] = 'Invalid new namespace name. Use only letters, numbers, underscore, hyphen, and colon.'; $lang['old_namespace_not_found'] = 'Old namespace directory not found: %s'; $lang['new_namespace_exists'] = 'New namespace directory already exists: %s'; $lang['rename_failed'] = 'Failed to rename directory'; $lang['cannot_rename_empty'] = 'Cannot rename to empty namespace'; $lang['source_namespace_not_found'] = 'Source namespace not found: %s'; $lang['target_namespace_exists'] = 'Target namespace already exists: %s'; $lang['rename_namespace_failed'] = 'Failed to rename namespace'; $lang['deleted_events'] = 'Deleted %d event(s)'; // Cron interval strings $lang['runs_every_minute'] = 'Runs every minute'; $lang['runs_every_x_minutes'] = 'Runs every %d minutes'; $lang['runs_hourly'] = 'Runs hourly'; $lang['runs_every_hour'] = 'Runs every hour'; $lang['runs_every_x_hours'] = 'Runs every %d hours'; $lang['runs_daily'] = 'Runs daily'; $lang['custom_schedule'] = 'Custom schedule'; // ========== SIDEBAR WIDGET / FRONTEND STRINGS ========== // Navigation & buttons $lang['today_btn'] = 'Today'; $lang['add_btn'] = '+ Add'; $lang['search_placeholder'] = 'šŸ” Search...'; $lang['search_this_month'] = 'Search this month only'; $lang['click_to_jump'] = 'Click to jump to month'; $lang['events_header'] = 'Events'; // Itinerary section headers $lang['itinerary_today'] = 'Today'; $lang['itinerary_tomorrow'] = 'Tomorrow'; $lang['itinerary_important'] = 'Important Events'; $lang['important_tooltip'] = 'Important'; // Event dialog - title $lang['dialog_add_event'] = 'Add Event'; $lang['dialog_edit_event'] = 'Edit Event'; // Event dialog - labels $lang['field_title'] = 'šŸ“ Title'; $lang['field_title_placeholder'] = 'Event or task title...'; $lang['field_namespace'] = 'šŸ“ Namespace'; $lang['field_namespace_placeholder'] = 'Type to search or leave empty for default...'; $lang['field_description'] = 'šŸ“„ Description'; $lang['field_description_placeholder'] = 'Optional details...'; $lang['field_start_date'] = 'šŸ“… Start Date'; $lang['field_end_date'] = 'šŸ End Date'; $lang['field_start_time'] = 'šŸ• Start Time'; $lang['field_end_time'] = 'šŸ• End Time'; $lang['field_color'] = 'šŸŽØ Color'; // Event dialog - time options $lang['time_all_day'] = 'All day'; $lang['time_same_as_start'] = 'Same as start'; // Event dialog - recurring options $lang['recurring_label'] = 'šŸ”„ Repeating Event'; $lang['recurring_repeat_every'] = 'Repeat every'; $lang['recurring_days'] = 'Day(s)'; $lang['recurring_weeks'] = 'Week(s)'; $lang['recurring_months'] = 'Month(s)'; $lang['recurring_years'] = 'Year(s)'; $lang['recurring_on_these_days'] = 'On these days:'; $lang['recurring_repeat_on'] = 'Repeat on:'; $lang['recurring_day_of_month'] = 'Day of month'; $lang['recurring_weekday_pattern'] = 'Weekday pattern'; $lang['recurring_day'] = 'Day'; $lang['recurring_of_each_month'] = 'of each month'; $lang['recurring_until'] = 'Repeat Until (optional)'; $lang['recurring_until_hint'] = 'Leave empty for 1 year of events'; // Ordinal positions $lang['ordinal_first'] = 'First'; $lang['ordinal_second'] = 'Second'; $lang['ordinal_third'] = 'Third'; $lang['ordinal_fourth'] = 'Fourth'; $lang['ordinal_fifth'] = 'Fifth'; $lang['ordinal_last'] = 'Last'; // Day names (short) $lang['day_sun'] = 'Sun'; $lang['day_mon'] = 'Mon'; $lang['day_tue'] = 'Tue'; $lang['day_wed'] = 'Wed'; $lang['day_thu'] = 'Thu'; $lang['day_fri'] = 'Fri'; $lang['day_sat'] = 'Sat'; // Day names (full) $lang['day_sunday'] = 'Sunday'; $lang['day_monday'] = 'Monday'; $lang['day_tuesday'] = 'Tuesday'; $lang['day_wednesday'] = 'Wednesday'; $lang['day_thursday'] = 'Thursday'; $lang['day_friday'] = 'Friday'; $lang['day_saturday'] = 'Saturday'; // Color names $lang['color_blue'] = 'šŸ”µ Blue'; $lang['color_green'] = '🟢 Green'; $lang['color_red'] = 'šŸ”“ Red'; $lang['color_orange'] = '🟠 Orange'; $lang['color_purple'] = '🟣 Purple'; $lang['color_pink'] = 'šŸ”“ Pink'; $lang['color_teal'] = '🟢 Teal'; $lang['color_custom'] = 'šŸŽØ Custom...'; // Task checkbox $lang['task_label'] = 'šŸ“‹ This is a task (can be checked off)'; // Dialog buttons $lang['btn_cancel'] = 'Cancel'; $lang['btn_save'] = 'šŸ’¾ Save'; $lang['btn_delete'] = 'Delete'; // Default event title $lang['default_event'] = 'Event'; $lang['no_upcoming_events'] = 'No upcoming events'; // Range headers $lang['range_today'] = 'Today'; $lang['range_this_week'] = 'This Week'; // Month names (full) - for JavaScript $lang['month_january'] = 'January'; $lang['month_february'] = 'February'; $lang['month_march'] = 'March'; $lang['month_april'] = 'April'; $lang['month_may'] = 'May'; $lang['month_june'] = 'June'; $lang['month_july'] = 'July'; $lang['month_august'] = 'August'; $lang['month_september'] = 'September'; $lang['month_october'] = 'October'; $lang['month_november'] = 'November'; $lang['month_december'] = 'December'; // Month names (short) - for JavaScript $lang['month_jan'] = 'Jan'; $lang['month_feb'] = 'Feb'; $lang['month_mar'] = 'Mar'; $lang['month_apr'] = 'Apr'; $lang['month_may_short'] = 'May'; $lang['month_jun'] = 'Jun'; $lang['month_jul'] = 'Jul'; $lang['month_aug'] = 'Aug'; $lang['month_sep'] = 'Sep'; $lang['month_oct'] = 'Oct'; $lang['month_nov'] = 'Nov'; $lang['month_dec'] = 'Dec'; // JavaScript UI strings $lang['events_for_date'] = 'Events - %s'; $lang['past_events'] = 'Past Events (%d)'; $lang['no_events_day'] = 'No events on this day'; $lang['add_event_btn'] = '+ Add Event'; $lang['add_event_short'] = '+ ADD EVENT'; $lang['delete_event_confirm'] = 'Delete this event?'; // Badge labels $lang['badge_past_due'] = 'PAST DUE'; $lang['badge_today'] = 'TODAY'; // Additional messages $lang['no_events_month'] = 'No events this month'; $lang['no_events_week'] = 'No events this week';