Panel/modules/steam_workshop/lang/en_US.php
copilot-swe-agent[bot] 69f415ad86
feat(steam_workshop): production rewrite with full admin profile page and server settings
- module.php: bump db_version to 2; full v2 schema in install_queries[0]; ALTER TABLE migration in install_queries[2] adding 11 new profile columns plus server_workshop_settings table
- WorkshopRepository: expand saveProfile() with all new fields (steam_app_id, steamcmd_login_mode, steamcmd_path, mod_separator, copy_keys, key paths, pre/post scripts, validation_notes); add nullOrStr helper; add server settings CRUD (getServerSettings, saveServerSettings, recordUpdateResult, setUpdateQueued, listQueuedUpdateHomes); update insertOrUpdateMod with custom_folder; update listAllEnabledMods to select new columns
- WorkshopProfileController: full extractProfileData() with all new fields; validateProfileData with folder template check
- views/admin/profile_form.php: full rewrite – all required fields (steam_app_id, workshop_app_id, login mode, SteamCMD path, OS, cache path, install path, folder naming dropdown, launch params, mod separator, copy method, copy keys with JS show/hide, key paths, pre/per-mod/post bash scripts with DayZ example, validation notes, config file template)
- views/admin/profiles.php: updated list view columns (App IDs, Login, Method)
- WorkshopInstaller.php: full rewrite with %var% template support (+ legacy {var} compat); buildTemplateVars() resolves all 14 variables; pre/post script execution; triggerSteamCmdDownload uses new profile fields; copyKeys helper
- WorkshopModController: add save_settings and queue_update POST actions; handleModsPage loads serverSettings + allProfiles
- views/user_workshop_mods.php: full rewrite – server settings form (enable, profile selector, update mode, restart behavior), update status grid (status/error/time/success time), queue update button, mod table with custom_folder column and toggle/order auto-submit
- lang/en_US.php: ~80 new string keys for all v2 fields
- steam_workshop.css: new v2 styles (3-col grid, script textarea, status grid, server settings card, badges)"

Agent-Logs-Url: https://github.com/GameServerPanel/GSP/sessions/e7f0d80d-f775-4794-adbd-cf48b55bc9c1

Co-authored-by: iaretechnician <2749183+iaretechnician@users.noreply.github.com>
2026-05-04 19:49:36 +00:00

300 lines
21 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 [
'heading_overview' => 'Steam Workshop automation (preview)',
'heading_edit_home' => 'Edit Workshop settings for %s',
'button_edit' => 'Configure',
'button_create_config' => 'Create config',
'button_save' => 'Save settings',
'button_cancel' => 'Back to list',
'label_feature_flag' => 'Enable scheduled Workshop updates for this server',
'label_adapter' => 'Game adapter',
'label_interval' => 'Update interval (minutes)',
'label_interval_hint' => 'Runs on the agent scheduler. Allowed range: 15360 minutes.',
'label_staging_dir' => 'Staging directory (optional)',
'label_install_strategy' => 'Install strategy',
'label_on_update_action' => 'On update action',
'label_post_install_script' => 'Post-install script (absolute path)',
'label_mod_import' => 'Workshop IDs list (one "id,@ModName" per line)',
'hint_mod_import' => 'Paste from Modlist.txt or import from a collection. IDs are sanitized automatically.',
'hint_admin_only' => 'Managed by your administrator.',
'adapter_locked_note' => 'This adapter is enforced for the current game type by your administrator.',
'admin_heading_game_mapping' => 'Adapter mapping by game type',
'admin_subheading_game_mapping' => 'Pick which adapter becomes the default whenever a server of that game opens the Workshop UI.',
'admin_col_game_key' => 'Game key',
'admin_col_adapter' => 'Adapter',
'admin_no_game_keys' => 'No server configuration XML files were detected.',
'admin_heading_adapters' => 'Available adapters',
'admin_col_key' => 'Key',
'admin_col_mods_dir' => 'Mods directory',
'admin_col_notes' => 'Notes',
'admin_heading_per_game' => 'Per-game adapters',
'admin_subheading_per_game' => 'Each game should have its own adapter XML for Steam Workshop automation.',
'admin_col_status' => 'Status',
'admin_col_updated' => 'Last updated',
'admin_col_actions' => 'Actions',
'admin_heading_edit_adapter' => 'Editing adapter for %s',
'admin_hint_select_game' => 'Select a game in the table above to edit or create its adapter.',
'status_no_adapter' => 'No adapter defined',
'status_enabled' => 'Enabled',
'status_disabled' => 'Disabled',
'status_hot_reload' => 'Hot reload ready',
'status_restart_required' => 'Restart required',
'empty_state_admin' => 'No game homes are assigned yet. Use "Assign Game Homes" to continue.',
'empty_state_user' => 'No servers available. Ask an administrator to assign a game home.',
'message_config_saved' => 'Workshop settings saved.',
'error_missing_home' => 'Select a server before editing Workshop settings.',
'error_home_not_found' => 'Unable to locate that server or you do not have permission.',
'mods_table_heading' => 'Parsed Workshop entries',
'mods_table_empty' => 'No Workshop IDs have been added yet.',
'mods_header_id' => 'Workshop ID',
'mods_header_label' => 'Label',
'mods_header_source' => 'Source',
'mods_header_enabled' => 'Enabled',
'install_copy' => 'Copy files into the server directory',
'install_symlink' => 'Symlink from Steam workshop content',
'install_staging' => 'Download to staging only (manual apply)',
'action_queue_for_restart' => 'Queue for restart',
'action_hot_reload_if_supported' => 'Hot reload if the adapter allows it',
'summary_adapter' => 'Adapter',
'summary_interval' => 'Interval',
'summary_mods' => 'Mods',
'summary_last_saved' => 'Last saved',
'summary_hot_reload' => 'Hot reload',
'raw_definition_label' => 'Raw Workshop list',
'message_mappings_saved' => 'Adapter mappings saved.',
'message_adapter_saved' => 'Adapter saved.',
'message_adapter_deleted' => 'Adapter deleted.',
'error_admin_only' => 'Administrator access required.',
'mod_picker_heading' => 'Workshop library',
'mod_picker_hint' => 'Search Steam Workshop and add mods to keep them synced automatically.',
'mod_picker_search_label' => 'Search Steam Workshop',
'mod_picker_search_placeholder' => 'Example: 221100 or QoL tweaks',
'mod_picker_search_button' => 'Search',
'mod_picker_selected_heading' => 'Selected mods',
'mod_picker_selected_hint' => 'Enable syncing to pull each mod before game server restarts.',
'mod_picker_selected_empty' => 'No mods selected yet. Use the search above to add your first entry.',
'mod_picker_results_heading' => 'Search results',
'mod_picker_results_select' => 'Select',
'mod_picker_results_title' => 'Title',
'mod_picker_results_author' => 'Author',
'mod_picker_action_add' => 'Add',
'mod_picker_action_remove' => 'Remove',
'mod_picker_status_loading' => 'Searching Steam Workshop…',
'mod_picker_status_error' => 'Unable to contact the Steam Workshop. Try again in a moment.',
'mod_picker_results_empty' => 'No workshop items matched that search.',
'mod_picker_status_need_query' => 'Enter a Workshop ID or keyword before searching.',
'mod_picker_toggle_label' => 'Sync',
'mod_picker_request_label' => 'Submitting request',
'mod_picker_request_hint' => 'Exact Steam URL preview. The input shows the text that will be submitted.',
'mod_picker_request_input_label' => 'Workshop query preview',
'error_game_key_required' => 'Select a valid game key before editing the adapter.',
'error_adapter_delete_failed' => 'Adapter could not be deleted.',
'button_edit_adapter' => 'Edit',
'button_create_adapter' => 'Create',
'button_delete_adapter' => 'Delete',
'button_save_adapter' => 'Save adapter',
'confirm_delete_adapter' => 'Delete this adapter? Servers mapped to it will fall back to defaults.',
'label_game_key' => 'Game key',
'label_adapter_name' => 'Adapter display name',
'label_adapter_app_id' => 'Steam App ID',
'label_adapter_mods_dir' => 'Mods directory',
'label_adapter_keys_dir' => 'Keys directory (optional)',
'label_adapter_hot_reload' => 'Supports hot reload',
'label_adapter_activation' => 'Activation template',
'label_adapter_notes' => 'Notes',
'error_missing_query' => 'Enter a search term before querying the Workshop.',
// -------------------------------------------------------
// Workshop game configuration admin (WorkshopProfileController)
// -------------------------------------------------------
'config_heading_list' => 'Workshop Game Configurations',
'config_intro' => 'One configuration per supported game. Each configuration controls how SteamCMD downloads and installs Workshop mods for servers of that game type.',
'config_btn_create' => 'Add Game Configuration',
'config_list_empty' => 'No Workshop configurations defined yet. Add one for each game that supports Steam Workshop mods.',
'config_confirm_delete' => 'Delete this Workshop configuration? Servers using it will no longer have Workshop mod support.',
'config_back_list' => 'Back to configurations',
'config_heading_edit' => 'Edit Workshop Configuration: %s',
'config_heading_create' => 'Add Workshop Game Configuration',
'config_steamcmd_heading' => 'How mods are downloaded',
'config_steamcmd_note' => 'Workshop mods are downloaded using SteamCMD with the command: +workshop_download_item {app_id} {mod_id}. The cache path below is where SteamCMD stores downloaded mod files on the agent machine. The install path below is where those files are copied into the game server directory.',
'config_label_app_id' => 'Steam App ID',
'config_hint_app_id' => 'The Steam App ID used with +workshop_download_item, e.g. 107410 for Arma 3',
'config_hint_game_key' => 'Short identifier matching the game XML key, e.g. arma3_linux',
'config_section_copy' => 'Copy / sync method',
'config_hint_launch_tpl' => 'Extra launch parameters added when this game has Workshop mods enabled. E.g. -mod=@{mod_id}',
'config_label_enabled' => 'Configuration enabled (allows servers to use Workshop mods for this game)',
'profile_col_game' => 'Game',
'profile_col_key' => 'Game Key',
'profile_col_method' => 'Install Method',
'profile_col_restart' => 'Restart?',
'profile_col_status' => 'Status',
'profile_section_basic' => 'Basic info',
'profile_section_paths' => 'Paths & templates',
'profile_section_config' => 'Config & launch parameters',
'profile_section_flags' => 'Flags',
'profile_label_game_name' => 'Game name',
'profile_label_os' => 'Supported OS',
'profile_label_cache_path' => 'SteamCMD cache path template',
'profile_hint_cache_path' => 'Where SteamCMD downloads mods on the agent. E.g. {steamcmd_path}/steamapps/workshop/content/{workshop_app_id}/{mod_id}',
'profile_label_install_path' => 'Server install path template',
'profile_hint_install_path' => 'Where mod files are placed inside the game server directory. E.g. {server_path}/mods/{mod_folder}',
'profile_label_folder_name' => 'Mod folder name template',
'profile_hint_folder_name' => 'Folder name for each mod inside the install path. Default: @{mod_id}',
'profile_label_copy_method' => 'Method used to copy mod files from SteamCMD cache to the server',
'profile_label_install_script'=> 'Custom install script (optional, admin-defined)',
'profile_hint_install_script' => 'Only used when copy method is custom_script. Template variables are replaced before execution.',
'profile_label_config_tpl' => 'Config file template (optional)',
'profile_label_launch_tpl' => 'Launch parameter template (optional)',
'profile_label_requires_restart' => 'Server restart required after mod install or update',
'profile_template_vars' => 'Available: {home_id} {agent_id} {workshop_app_id} {mod_id} {mod_title} {mod_folder} {steamcmd_path} {server_path} {install_path} {cache_path}',
'profile_saved' => 'Workshop configuration saved.',
'profile_save_error' => 'Failed to save Workshop configuration.',
'profile_deleted' => 'Workshop configuration deleted.',
'profile_delete_error' => 'Failed to delete Workshop configuration.',
'profile_not_found' => 'Configuration not found.',
'button_delete' => 'Delete',
'error_game_key_invalid' => 'Game key may only contain letters, digits, underscores, dots, and hyphens.',
'error_game_name_required' => 'Game name is required.',
'error_app_id_required' => 'Workshop App ID is required (numeric).',
'error_cache_path_required' => 'SteamCMD cache path template is required.',
'error_install_path_required' => 'Server install path template is required.',
// -------------------------------------------------------
// User mod management (WorkshopModController)
// -------------------------------------------------------
'user_workshop_heading' => 'Steam Workshop',
'user_workshop_server_heading' => 'Workshop Mods %s',
'col_server' => 'Server',
'col_game' => 'Game',
'col_mods_count' => 'Installed mods',
'col_profile' => 'Profile',
'col_mod_id' => 'Workshop ID',
'col_mod_title' => 'Title',
'col_load_order' => 'Load order',
'col_cache_status' => 'Cache status',
'no_profile' => 'No profile',
'hint_no_profile' => 'Ask an admin to create a Workshop profile for this game.',
'btn_manage_mods' => 'Manage Mods',
'no_profile_notice' => 'No Workshop profile is configured for this game. An administrator needs to create one first.',
'heading_installed_mods' => 'Installed Mods',
'no_installed_mods' => 'No mods installed yet.',
'heading_cached_mods' => 'Available Cached Mods (this agent)',
'heading_install_mod' => 'Install Mod by Workshop ID',
'label_workshop_id_input' => 'Workshop ID',
'placeholder_workshop_id' => 'e.g. 1234567890',
'btn_install_mod' => 'Install',
'btn_remove_mod' => 'Remove',
'btn_sync_now' => 'Sync now',
'confirm_remove_mod' => 'Remove this mod from this server? (Files on disk are not deleted.)',
'mod_installed' => 'Mod installed successfully.',
'mod_install_error' => 'Install failed: ',
'restart_required' => 'A server restart is required to activate this mod.',
'mod_removed' => 'Mod removed from this server.',
'mod_remove_error' => 'Failed to remove mod.',
'sync_success' => 'Mod synced successfully.',
'sync_no_change' => 'Mod is already up to date.',
'sync_error' => 'Sync failed: ',
'error_missing_params' => 'Missing required parameters.',
'error_no_profile' => 'No Workshop profile configured for this game.',
'error_mod_not_found' => 'Mod or profile not found.',
'error_toggle_failed' => 'Failed to update mod status.',
'error_order_failed' => 'Failed to update load order.',
// -------------------------------------------------------
// New v2 labels
// -------------------------------------------------------
// Admin profile form new fields
'config_steamcmd_note' => 'Workshop mods are downloaded using SteamCMD: +workshop_download_item <App ID> <Mod ID>. Configure the paths and scripts below to control how mods are installed for servers of this game type.',
'config_label_enabled' => 'Profile enabled',
'config_hint_game_key' => 'Short identifier matching the game XML key, e.g. dayz_linux',
'config_hint_app_id' => 'The App ID used with +workshop_download_item, e.g. 221100 for DayZ',
'config_hint_launch_tpl' => 'Complete launch parameter string appended to server start. Each mod folder is joined with the separator above.',
'profile_section_basic' => 'Basic identification',
'profile_section_steam' => 'Steam & SteamCMD settings',
'profile_section_paths' => 'Download & install paths',
'profile_section_folder' => 'Mod folder naming',
'profile_section_launch' => 'Launch parameters',
'profile_section_scripts' => 'Bash scripts',
'profile_section_flags' => 'Options & validation',
'profile_label_game_name' => 'Game display name',
'profile_label_steam_app_id' => 'Steam App ID',
'profile_hint_steam_app_id' => 'The Steam game App ID (e.g. 221100 for DayZ). Used when Steam login is required.',
'config_label_app_id' => 'Workshop App ID',
'config_hint_app_id' => 'The App ID used with +workshop_download_item, e.g. 221100 for DayZ',
'profile_label_steamcmd_path' => 'SteamCMD path on agent',
'profile_hint_steamcmd_path' => 'Full path to steamcmd.sh on the remote agent. Leave blank to use the agent default (/home/gameserver/steamcmd/steamcmd.sh).',
'profile_label_steam_login_required'=> 'Steam login required (game is not free / requires ownership)',
'profile_label_steamcmd_login_mode' => 'SteamCMD login mode',
'profile_hint_steamcmd_login_mode' => 'Use anonymous for free Workshop mods. Use configured account for games requiring ownership.',
'profile_label_os' => 'Supported OS',
'profile_label_cache_path' => 'Workshop download/cache path',
'profile_hint_cache_path' => 'Where SteamCMD stores downloaded mod content on the agent. E.g. /home/gameserver/steamcmd/steamapps/workshop/content/%workshop_app_id%/%workshop_id%',
'profile_label_install_path' => 'Server mod install root',
'profile_hint_install_path' => 'Base directory inside the server where mods are installed. E.g. %server_path%/mods/%install_name%',
'profile_label_folder_format' => 'Folder naming format',
'profile_hint_folder_format' => 'How each mod folder is named inside the install root.',
'profile_label_folder_name' => 'Custom folder name template',
'profile_hint_folder_name' => 'Use %workshop_id% or %mod_name%. E.g. @%workshop_id%',
'profile_label_mod_launch_param' => 'Mod launch parameter format',
'profile_hint_mod_launch_param' => 'How the full mod list is passed to the server start command. E.g. -mod=%mods%',
'profile_label_mod_separator' => 'Mod separator',
'profile_hint_mod_separator' => 'Character used to join multiple mod folder names in the launch parameter.',
'profile_label_launch_tpl' => 'Full launch parameter template (optional)',
'profile_label_copy_method' => 'Copy method',
'profile_label_copy_keys' => 'Copy mod keys (*.bikey) to server keys directory',
'profile_label_key_source' => 'Key source path',
'profile_hint_key_source' => 'Path inside the mod cache where key files live. E.g. %source_path%/keys',
'profile_label_key_dest' => 'Key destination path',
'profile_hint_key_dest' => 'Where keys are copied on the server. E.g. %server_path%/keys',
'profile_label_pre_script' => 'Pre-update bash script',
'profile_hint_pre_script' => 'Runs once before any mod is downloaded/installed. Variables: %home_id% %server_path% %workshop_app_id%',
'profile_label_install_script' => 'Per-mod install bash script',
'profile_hint_install_script' => 'Runs once for each mod. All template variables listed above are available.',
'profile_label_post_script' => 'Post-update bash script',
'profile_hint_post_script' => 'Runs once after all mods have been installed. Variables: %home_id% %server_path% %workshop_app_id%',
'profile_label_requires_restart' => 'Server restart required after mod install or update',
'profile_label_validation_notes' => 'Validation notes / help text (shown to server owners)',
'profile_label_config_tpl' => 'Config file template (optional)',
'profile_template_vars' => 'Variables: %home_id% %server_path% %steam_app_id% %workshop_app_id% %workshop_id% %mod_name% %install_name% %download_path% %source_path% %target_path% %keys_source_path% %keys_target_path% %steamcmd_path%',
'profile_template_vars_heading' => 'Template variables:',
'profile_scripts_order' => 'Execution order:',
'profile_scripts_per_mod' => 'repeated for each mod',
'profile_script_example_toggle' => 'Show DayZ-style example',
'profile_col_app_ids' => 'App IDs',
'profile_col_login' => 'Login',
'profile_col_steam' => 'Steam',
'profile_col_workshop' => 'Workshop',
'profile_badge_login_required' => 'Login req.',
'profile_col_game' => 'Game',
'profile_col_key' => 'Game Key',
'profile_col_method' => 'Install Method',
'profile_col_restart' => 'Restart?',
'profile_col_status' => 'Status',
'error_folder_template_required' => 'Custom folder name template is required when format is set to custom.',
// Server-level settings (user/server page)
'heading_server_settings' => 'Workshop Settings for this server',
'label_workshop_enabled' => 'Enable Workshop for this server',
'label_select_profile' => 'Workshop game profile',
'label_auto_detect' => 'Auto-detect from game type',
'label_update_mode' => 'Update mode',
'label_restart_behavior' => 'Restart behavior',
'update_mode_manual' => 'Manual only',
'update_mode_scheduled' => 'Scheduled',
'update_mode_on_restart' => 'Before server restart',
'restart_behavior_none' => 'No restart',
'restart_behavior_queue' => 'Queue restart',
'restart_behavior_stop' => 'Stop / Update / Start',
'btn_queue_update' => 'Queue manual update',
'label_last_update_status' => 'Last update status',
'label_last_update_time' => 'Last update time',
'label_last_success_time' => 'Last successful update',
'label_last_update_error' => 'Last error',
'update_queued_notice' => 'A manual update is queued and will run on the next scheduler cycle.',
'settings_saved' => 'Workshop settings saved.',
'update_queued' => 'Manual update queued. It will run on the next scheduler cycle.',
'col_mod_folder' => 'Install folder',
'label_admin_notes' => 'Admin notes:',
];