v1.3.0
AtheraStudio SyncDrop
- <?php
- declare(strict_types=1);
-
- return [
- 'noscript' => 'AtheraStudio SyncDrop needs JavaScript for security checks and file hashing.',
- 'nav_label' => 'Menu',
- 'nav_sync' => 'Sync',
- 'nav_history' => 'History',
- 'nav_settings' => 'Settings',
- 'nav_logout' => 'Log out',
- 'theme' => 'Toggle theme',
- 'copy' => 'Copy',
- 'download' => 'Download',
- 'cancel' => 'Cancel',
- 'save' => 'Save',
- 'language' => 'Language',
-
- 'setup_title' => 'Install SyncDrop',
- 'setup_lead' => 'Create the administrator account. Credentials are stored outside the web root in {file}.',
- 'setup_code_title' => 'Prove you own this hosting',
- 'setup_code_hint' => 'Open the file manager of your hosting and find the file {file} in the folder above the web root of this site (usually the folder that contains public_html). Copy the setup code from it. The code is valid for one hour.',
- 'setup_code' => 'Setup code',
- 'setup_submit' => 'Create account and continue',
- 'username' => 'Username',
- 'username_hint' => '3–32 characters: letters, digits, dot, dash, underscore.',
- 'alert_email' => 'E-mail for security alerts',
- 'alert_email_hint' => 'Every login, lockout and security change is reported here.',
- 'password' => 'Password',
- 'password_hint' => 'At least 12 characters with three of: lowercase, uppercase, digit, symbol. Must not contain the username.',
- 'password_repeat' => 'Repeat password',
- 'password_current' => 'Current password',
- 'password_new' => 'New password',
-
- 'login_title' => 'Sign in',
- 'login_lead' => 'Sign in to deploy files to your server.',
- 'login_submit' => 'Sign in',
- 'login_protected' => 'Protected by proof-of-work, rate limiting, IP bans and two-factor authentication.',
-
- 'twofa_title' => 'Two-factor authentication',
- 'twofa_lead' => 'Enter the 6-digit code from your authenticator app.',
- 'twofa_code' => 'Authentication code',
- 'twofa_hint' => 'Lost your phone? Enter one of your recovery codes instead.',
- 'twofa_submit' => 'Verify',
-
- 'enroll_title' => 'Set up two-factor authentication',
- 'enroll_lead' => 'Two-factor authentication is required. It protects your server even if your password leaks.',
- 'enroll_step1' => 'Install Google Authenticator, Microsoft Authenticator, Authy, 2FAS or any TOTP app.',
- 'enroll_step2' => 'Scan the QR code below or enter the key manually.',
- 'enroll_step3' => 'Type the 6-digit code shown by the app to confirm.',
- 'enroll_manual' => 'Manual entry key',
- 'enroll_submit' => 'Enable two-factor authentication',
-
- 'recovery_title' => 'Recovery codes',
- 'recovery_lead' => 'Use a recovery code to sign in when you cannot use your authenticator app. Each code works once.',
- 'recovery_once' => 'They are shown only once',
- 'recovery_warning' => 'Save these codes in a password manager or print them. Anyone who has them and your password can sign in.',
- 'recovery_done' => 'I have saved my codes',
-
- 'sync_title' => 'Sync files',
- 'sync_target' => 'Destination on the server',
- 'sync_drop' => 'Drop a project folder here',
- 'sync_drop_hint' => 'Only new and changed files are sent. Files are compared by SHA-256.',
- 'sync_pick' => 'Choose folder',
- 'sync_strip' => 'Send the contents of the chosen folder',
- 'sync_strip_hint' => 'When on, the folder itself is not created on the server, only what is inside it.',
- 'sync_safety' => 'Every file is verified and replaced atomically with a backup. Any error restores the previous state. SyncDrop never deletes files on the server and never touches .env or .git.',
- 'sync_changes' => 'Changes to send',
- 'sync_no_targets' => 'No destination is configured yet. Add the folder SyncDrop should deploy to.',
- 'stat_new' => 'New',
- 'stat_changed' => 'Changed',
- 'stat_same' => 'Unchanged',
- 'stat_skipped' => 'Skipped',
- 'col_file' => 'File',
- 'col_size' => 'Size',
- 'col_status' => 'Status',
- 'col_date' => 'Date',
- 'col_target' => 'Destination',
- 'col_files' => 'Files',
- 'col_event' => 'Event',
- 'col_device' => 'Device',
-
- 'history_title' => 'History',
- 'history_deploys' => 'Deployments',
- 'history_security' => 'Security log',
- 'history_empty' => 'Nothing here yet.',
- 'history_counts' => '{n} new, {c} changed',
- 'status_ok' => 'Deployed',
- 'status_failed' => 'Failed, restored',
- 'status_rolled_back' => 'Rolled back',
- 'rollback' => 'Restore previous version',
-
- 'settings_title' => 'Settings',
- 'settings_alerts' => 'Security alerts',
- 'settings_alerts_on' => 'Send an e-mail on every login and security change',
- 'settings_test_mail' => 'Save and send a test e-mail',
- 'settings_password' => 'Password',
- 'settings_password_save' => 'Change password',
- 'settings_2fa' => 'Two-factor authentication',
- 'settings_2fa_on' => 'Enabled',
- 'settings_recovery_left' => 'Recovery codes left: {n} of 10.',
- 'settings_recovery_new' => 'Generate new recovery codes',
- 'settings_sessions' => 'Sessions',
- 'settings_sessions_hint' => 'Signs out every other browser and device immediately.',
- 'settings_sessions_btn' => 'Sign out everywhere else',
- 'settings_targets' => 'Destinations',
- 'target_ok' => 'Available',
- 'target_unavailable' => 'unavailable',
- 'target_name' => 'Name',
- 'target_path' => 'Absolute server path',
- 'target_path_hint' => 'For example the public_html folder of a domain. It must exist and be writable.',
- 'target_exclude' => 'Never send these files',
- 'target_exclude_hint' => 'One pattern per line, e.g. node_modules/, *.log, /config/local.php. .env, .git and SyncDrop files are always excluded.',
- 'target_add' => 'Add destination',
- 'target_remove' => 'Remove',
- 'target_remove_confirm' => 'Remove this destination? Files on the server stay untouched.',
-
- 'fatal_title' => 'SyncDrop cannot start',
- 'fatal_base' => 'SyncDrop could not find a safe folder outside the web root for its configuration. Copy config.sample.php to config.php and set "base" to a writable folder that is not reachable from the web.',
- 'fatal_data' => 'The configuration folder outside the web root is not writable, so SyncDrop cannot store its configuration safely.',
- 'fatal_ext' => 'A required PHP extension is missing (hash, random or mbstring).',
-
- 'err_antibot' => 'The security check failed. Reload the page and try again.',
- 'err_locked' => 'Too many failed attempts. Try again in {min} min.',
- 'err_locked_short' => 'Too many failed attempts. Try again later.',
- 'err_setup_code' => 'The setup code is incorrect.',
- 'err_username' => 'The username must have 3–32 characters: letters, digits, dot, dash or underscore.',
- 'err_email' => 'Enter a valid e-mail address.',
- 'err_password_weak' => 'The password is too weak.',
- 'err_password_match' => 'The passwords do not match.',
- 'err_password_current' => 'The current password is incorrect.',
- 'err_login' => 'Incorrect username or password.',
- 'err_code' => 'The code is incorrect or has already been used.',
- 'err_stage_expired' => 'The sign-in took too long. Sign in again.',
- 'err_too_many' => 'Too many incorrect codes. Sign in again.',
- 'err_rollback' => 'This deployment cannot be restored. Only the most recent deployment of a destination can be rolled back.',
- 'err_target_name' => 'Enter a name of up to 60 characters.',
- 'err_target_exists' => 'This folder is already a destination.',
- 'err_target_missing' => 'The folder does not exist.',
- 'err_target_root' => 'The filesystem root cannot be a destination.',
- 'err_target_readonly' => 'PHP cannot write to this folder.',
- 'err_target_forbidden' => 'This folder belongs to SyncDrop and cannot be a destination.',
-
- 'msg_saved' => 'Saved.',
- 'msg_test_sent' => 'Saved. A test e-mail was sent.',
- 'msg_test_failed' => 'Saved, but the server could not send the test e-mail.',
- 'msg_password_changed' => 'Password changed. All other sessions were signed out.',
- 'msg_sessions' => 'All other sessions were signed out.',
- 'msg_rollback_ok' => 'Restored the previous version of {n} files.',
- 'msg_rollback_partial' => 'Restored {n} files. {s} files were changed after the deployment and were left as they are.',
-
- 'method_totp' => 'authenticator app',
- 'method_recovery' => 'recovery code',
-
- 'alert_footer' => 'IP: {ip}' . "\n" . 'Device: {ua}' . "\n" . 'Time: {time}' . "\n" . 'Server: {host}' . "\n\n" . 'If this was not you, change your password and sign out all sessions in SyncDrop settings.',
- 'alert_login_subject' => 'new sign-in',
- 'alert_login_body' => 'User {user} signed in to SyncDrop using the {method}.',
- 'alert_lockout_subject' => 'sign-in blocked',
- 'alert_lockout_body' => 'Several failed sign-in attempts were detected and SyncDrop blocked further attempts ({scope}).',
- 'alert_recovery_subject' => 'recovery code used',
- 'alert_recovery_body' => 'A recovery code was used to sign in. Codes left: {left}.',
- 'alert_2fa_subject' => 'two-factor authentication enabled',
- 'alert_2fa_body' => 'Two-factor authentication was enabled for {user}.',
- 'alert_email_subject' => 'alert e-mail changed',
- 'alert_email_body' => 'Security alerts will now be sent to {email}.',
- 'alert_test_subject' => 'test e-mail',
- 'alert_test_body' => 'Security alerts work. This is a test message.',
- 'alert_password_subject' => 'password changed',
- 'alert_password_body' => 'The password of {user} was changed and all other sessions were signed out.',
- 'alert_recovery_new_subject' => 'new recovery codes',
- 'alert_recovery_new_body' => 'New recovery codes were generated. The previous codes no longer work.',
-
- 'ev_login_ok' => 'Signed in',
- 'ev_login_failed' => 'Failed sign-in',
- 'ev_password_ok' => 'Password accepted',
- 'ev_lockout' => 'Sign-in blocked',
- 'ev_logout' => 'Signed out',
- 'ev_setup_done' => 'Installed',
- 'ev_totp_enrolled' => '2FA enabled',
- 'ev_recovery_used' => 'Recovery code used',
- 'ev_recovery_regenerated' => 'New recovery codes',
- 'ev_password_changed' => 'Password changed',
- 'ev_sessions_revoked' => 'Sessions signed out',
- 'ev_alerts_changed' => 'Alerts changed',
- 'ev_alert_sent' => 'Alert sent',
- 'ev_alert_failed' => 'Alert not sent',
- 'ev_target_added' => 'Destination added',
- 'ev_target_saved' => 'Destination saved',
- 'ev_target_removed' => 'Destination removed',
- 'ev_deploy_begin' => 'Upload started',
- 'ev_deploy_ok' => 'Deployed',
- 'ev_deploy_aborted' => 'Upload cancelled',
- 'ev_deploy_verify_failed' => 'Verification failed',
- 'ev_deploy_rolled_back' => 'Error, restored',
- 'ev_rollback' => 'Version restored',
-
- 'js_solving' => 'Security check…',
- 'js_hashing' => 'Computing checksums…',
- 'js_comparing' => 'Comparing with the server…',
- 'js_uploading' => 'Uploading…',
- 'js_verifying' => 'Verifying and replacing files…',
- 'js_done' => 'Done: {n} new, {c} changed files deployed.',
- 'js_failed' => 'The deployment failed. Nothing was changed on the server.',
- 'js_rolled_back' => 'An error occurred while replacing files. The previous version was restored automatically.',
- 'js_nothing' => 'Everything is up to date. There is nothing to send.',
- 'js_pick_first' => 'Choose a folder first.',
- 'js_files' => '{n} files',
- 'js_summary' => '{n} files to send ({size})',
- 'js_send' => 'Send changes',
- 'js_working' => 'Working…',
- 'js_status_n' => 'New',
- 'js_status_c' => 'Changed',
- 'js_status_s' => 'Unchanged',
- 'js_status_x' => 'Excluded',
- 'js_status_e' => 'Invalid path',
- 'js_status_b' => 'Too large',
- 'js_too_many' => 'Too many files. The limit is {max} per deployment.',
- 'js_more' => 'and {n} more…',
- 'js_copied' => 'Copied',
- 'js_confirm_rollback' => 'Restore the version from before this deployment?',
- 'js_err_auth' => 'Your session has expired. Sign in again.',
- 'js_err_busy' => 'Another deployment is in progress. Try again in a moment.',
- 'js_err_disk' => 'Not enough free disk space on the server.',
- 'js_err_verify' => 'Some files arrived damaged. Nothing was changed. Try again.',
- 'js_err_generic' => 'Something went wrong. Nothing was changed on the server.',
-
- 'nav_shield' => 'IP shield',
- 'shield_title' => 'IP shield',
- 'shield_lead' => 'SyncDrop scores suspicious requests per IP address: security scanners, probing for files, attack patterns, bot traps and failed sign-ins. At 100 points within 24 hours the address is banned automatically for 24 hours, then 7 days, then 30 days for repeat offenders. Addresses that signed in successfully in the last 30 days are never banned automatically.',
- 'shield_your_ip' => 'Your IP address',
- 'shield_trusted' => 'trusted',
- 'shield_allowed' => 'allowlisted',
- 'shield_untrusted' => 'not trusted yet',
- 'shield_active' => 'Active bans',
- 'shield_active_split' => 'automatic: {a} · manual: {m}',
- 'shield_watched' => 'Under watch',
- 'shield_bans' => 'Banned addresses',
- 'shield_no_bans' => 'No address is banned.',
- 'shield_ban_title' => 'Ban an address',
- 'shield_address' => 'IP address or range (CIDR)',
- 'shield_address_hint' => 'For example 203.0.113.7, 203.0.113.0/24 or 2001:db8::/48.',
- 'shield_duration' => 'Duration',
- 'shield_note' => 'Note (optional)',
- 'shield_ban_btn' => 'Ban',
- 'shield_ban_confirm' => 'Ban this address for 30 days?',
- 'shield_d_3600' => '1 hour',
- 'shield_d_86400' => '24 hours',
- 'shield_d_604800' => '7 days',
- 'shield_d_2592000' => '30 days',
- 'shield_d_0' => 'Permanently',
- 'shield_unban' => 'Unban',
- 'shield_unban_confirm' => 'Unban this address?',
- 'shield_forever' => 'permanent',
- 'shield_auto' => 'automatic',
- 'shield_manual' => 'manual',
- 'shield_allow_title' => 'Allowlist',
- 'shield_allow_hint' => 'Allowlisted addresses are never scored or banned. Add only addresses you control, such as a static office IP.',
- 'shield_allow_btn' => 'Add to allowlist',
- 'shield_allow_me' => 'Add my IP address',
- 'shield_allow_empty' => 'The allowlist is empty.',
- 'shield_me_note' => 'Added from this device',
- 'shield_remove' => 'Remove',
- 'shield_watch_title' => 'Under watch (last 24 hours)',
- 'shield_watch_empty' => 'No suspicious activity in the last 24 hours.',
- 'shield_points' => '{n} of 100 points',
- 'shield_blocked' => 'Access denied. This IP address has been blocked by AtheraStudio SyncDrop after suspicious activity.',
- 'shield_r_scanner' => 'Security scanner',
- 'shield_r_signature' => 'Attack pattern in the request',
- 'shield_r_honeypot' => 'Bot trap filled in',
- 'shield_r_pow_forged' => 'Forged security check',
- 'shield_r_pow_invalid' => 'Invalid security check',
- 'shield_r_probe' => 'Probing for files',
- 'shield_r_method' => 'Unusual HTTP method',
- 'shield_r_host' => 'Invalid Host header',
- 'shield_r_api_anon' => 'API call without a session',
- 'shield_r_lockout' => 'Repeated failed sign-ins',
- 'shield_r_fail_password' => 'Wrong password',
- 'shield_r_fail_totp' => 'Wrong 2FA code',
- 'shield_r_fail_setup_code' => 'Wrong setup code',
- 'shield_r_fail_antibot' => 'Failed antibot check',
- 'shield_r_manual' => 'Banned manually',
- 'col_address' => 'Address',
- 'col_reason' => 'Reason',
- 'col_since' => 'Since',
- 'col_until' => 'Until',
- 'col_last' => 'Last attempt',
- 'col_points' => 'Points',
- 'err_ban_invalid' => 'Enter a valid IP address or CIDR range.',
- 'err_ban_range' => 'The range is too wide. Use at least /16 for IPv4 and /32 for IPv6.',
- 'err_ban_self' => 'This would ban your own IP address.',
- 'err_allow_full' => 'The allowlist is full (200 entries).',
- 'msg_banned' => 'The address was banned.',
- 'msg_unbanned' => 'The address was unbanned.',
- 'msg_allowed' => 'The address was added to the allowlist.',
- 'msg_allow_removed' => 'The address was removed from the allowlist.',
- 'alert_ban_subject' => 'IP address banned',
- 'alert_ban_body' => 'SyncDrop automatically banned {ban} until {until}. Last reason: {reason}. You can lift the ban in SyncDrop under IP shield.',
- 'ev_threat' => 'Suspicious request',
- 'ev_ip_banned' => 'IP banned',
- 'ev_ip_unbanned' => 'IP unbanned',
- 'ev_allow_added' => 'Allowlist entry added',
- 'ev_allow_removed' => 'Allowlist entry removed',
-
- 'view_title' => 'Preview',
- 'view_close' => 'Close',
- 'view_diff' => 'Changes',
- 'view_new' => 'New version',
- 'view_old' => 'On the server',
- 'view_wrap' => 'Wrap lines',
- 'js_view' => 'Preview',
- 'js_view_loading' => 'Loading…',
- 'js_view_binary' => 'This is a binary file or it is not UTF-8 text, so it cannot be previewed.',
- 'js_view_large' => 'The file is larger than 1 MB, so it cannot be previewed.',
- 'js_view_server_binary' => 'The version on the server is a binary file, so only the new version is shown.',
- 'js_view_server_large' => 'The version on the server is larger than 1 MB, so only the new version is shown.',
- 'js_view_server_missing' => 'The file is no longer on the server, so only the new version is shown.',
- 'js_view_same' => 'The lines are identical. Only line endings, encoding or the BOM mark differ.',
- 'js_view_too_many' => 'There are too many differences to compare line by line. Open New version or On the server.',
- 'js_view_hidden' => '{n} unchanged lines',
- 'js_view_lines' => 'lines: {n}',
- 'nav_update' => 'Updates',
- 'update_title' => 'Updates',
- 'update_nav_new' => 'Update available',
- 'update_current' => 'Installed version {v}',
- 'update_latest' => 'You have the latest version',
- 'update_new' => 'New version',
- 'update_available' => 'Version {v} is available',
- 'update_released' => 'Released {d}',
- 'update_changes' => 'What’s new',
- 'update_install' => 'Update to {v}',
- 'update_confirm' => 'Install version {v}? SyncDrop makes a backup before changing any files.',
- 'update_check' => 'Check again',
- 'update_checked' => 'Checked {t}',
- 'update_safety' => 'Every package is signed with the AtheraStudio key and verified before it is installed. Your account, settings, config.php and data are never touched.',
- 'update_backups' => 'Backups',
- 'update_backups_hint' => 'A backup is made automatically before every update. You can restore the newest backup when it belongs to the installed version. The last {n} backups are kept.',
- 'update_backups_empty' => 'No backups yet.',
- 'col_versions' => 'Versions',
- 'update_restore' => 'Restore',
- 'update_restore_confirm' => 'Restore version {v}? The files from this update will be replaced with the backup.',
- 'update_delete' => 'Delete',
- 'update_delete_confirm' => 'Delete this backup? This cannot be undone.',
- 'update_msg_done' => 'Installed version {v} ({n} files).',
- 'update_msg_restored' => 'Restored version {v} ({n} files).',
- 'update_msg_restore_partial' => 'Restored {n} files, but {s} could not be written. The backup was kept; check the permissions of the SyncDrop folder.',
- 'update_msg_deleted' => 'Backup deleted.',
- 'update_need_zip' => 'This server is missing the PHP zip extension, so updates are unavailable.',
- 'update_need_sodium' => 'This server is missing the PHP sodium extension, so signatures cannot be checked and updates are unavailable.',
- 'update_need_http' => 'This server cannot make HTTPS requests (no curl or openssl), so updates are unavailable.',
- 'update_err_network' => 'Could not reach the update server. Try again later.',
- 'update_err_server' => 'The update server returned an error. Try again later.',
- 'update_err_manifest' => 'The update server sent data that could not be read.',
- 'update_err_size' => 'The update package is too large, so it was not downloaded.',
- 'update_err_storage' => 'Could not write a temporary file in the SyncDrop data folder.',
- 'update_err_checksum' => 'The download does not match its checksum, so it was not used. Try again.',
- 'update_err_archive' => 'The downloaded package is damaged. Try again.',
- 'update_err_signature' => 'The package signature is invalid, so the update was stopped. Nothing was changed.',
- 'update_err_current' => 'There is no newer version to install.',
- 'update_err_busy' => 'An update is already running. Wait a moment.',
- 'update_err_backup' => 'The backup could not be made, so nothing was changed.',
- 'update_err_write' => 'The files could not be written, so every change was undone. Check the permissions of the SyncDrop folder.',
- 'update_err_restore' => 'This backup cannot be restored. Only the newest backup can be restored, and only when it belongs to the installed version.',
- 'update_err_missing' => 'This backup was not found.',
- 'ev_update_ok' => 'Updated',
- 'ev_update_failed' => 'Update undone',
- 'ev_update_rejected' => 'Package rejected',
- 'ev_update_restored' => 'Version restored',
- 'ev_update_deleted' => 'Backup deleted',
- 'alert_update_subject' => 'Updated to version {to}',
- 'alert_update_body' => 'SyncDrop was updated from version {from} to {to}. A backup of the previous files is on the Updates page.',
- ];
-