WebOrbiton
v1.3.0

AtheraStudio SyncDrop

371 lines · 20.9 KB
  1. <?php
  2. declare(strict_types=1);
  3. ​
  4. return [
  5. 'noscript' => 'AtheraStudio SyncDrop needs JavaScript for security checks and file hashing.',
  6. 'nav_label' => 'Menu',
  7. 'nav_sync' => 'Sync',
  8. 'nav_history' => 'History',
  9. 'nav_settings' => 'Settings',
  10. 'nav_logout' => 'Log out',
  11. 'theme' => 'Toggle theme',
  12. 'copy' => 'Copy',
  13. 'download' => 'Download',
  14. 'cancel' => 'Cancel',
  15. 'save' => 'Save',
  16. 'language' => 'Language',
  17. ​
  18. 'setup_title' => 'Install SyncDrop',
  19. 'setup_lead' => 'Create the administrator account. Credentials are stored outside the web root in {file}.',
  20. 'setup_code_title' => 'Prove you own this hosting',
  21. '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.',
  22. 'setup_code' => 'Setup code',
  23. 'setup_submit' => 'Create account and continue',
  24. 'username' => 'Username',
  25. 'username_hint' => '3–32 characters: letters, digits, dot, dash, underscore.',
  26. 'alert_email' => 'E-mail for security alerts',
  27. 'alert_email_hint' => 'Every login, lockout and security change is reported here.',
  28. 'password' => 'Password',
  29. 'password_hint' => 'At least 12 characters with three of: lowercase, uppercase, digit, symbol. Must not contain the username.',
  30. 'password_repeat' => 'Repeat password',
  31. 'password_current' => 'Current password',
  32. 'password_new' => 'New password',
  33. ​
  34. 'login_title' => 'Sign in',
  35. 'login_lead' => 'Sign in to deploy files to your server.',
  36. 'login_submit' => 'Sign in',
  37. 'login_protected' => 'Protected by proof-of-work, rate limiting, IP bans and two-factor authentication.',
  38. ​
  39. 'twofa_title' => 'Two-factor authentication',
  40. 'twofa_lead' => 'Enter the 6-digit code from your authenticator app.',
  41. 'twofa_code' => 'Authentication code',
  42. 'twofa_hint' => 'Lost your phone? Enter one of your recovery codes instead.',
  43. 'twofa_submit' => 'Verify',
  44. ​
  45. 'enroll_title' => 'Set up two-factor authentication',
  46. 'enroll_lead' => 'Two-factor authentication is required. It protects your server even if your password leaks.',
  47. 'enroll_step1' => 'Install Google Authenticator, Microsoft Authenticator, Authy, 2FAS or any TOTP app.',
  48. 'enroll_step2' => 'Scan the QR code below or enter the key manually.',
  49. 'enroll_step3' => 'Type the 6-digit code shown by the app to confirm.',
  50. 'enroll_manual' => 'Manual entry key',
  51. 'enroll_submit' => 'Enable two-factor authentication',
  52. ​
  53. 'recovery_title' => 'Recovery codes',
  54. 'recovery_lead' => 'Use a recovery code to sign in when you cannot use your authenticator app. Each code works once.',
  55. 'recovery_once' => 'They are shown only once',
  56. 'recovery_warning' => 'Save these codes in a password manager or print them. Anyone who has them and your password can sign in.',
  57. 'recovery_done' => 'I have saved my codes',
  58. ​
  59. 'sync_title' => 'Sync files',
  60. 'sync_target' => 'Destination on the server',
  61. 'sync_drop' => 'Drop a project folder here',
  62. 'sync_drop_hint' => 'Only new and changed files are sent. Files are compared by SHA-256.',
  63. 'sync_pick' => 'Choose folder',
  64. 'sync_strip' => 'Send the contents of the chosen folder',
  65. 'sync_strip_hint' => 'When on, the folder itself is not created on the server, only what is inside it.',
  66. '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.',
  67. 'sync_changes' => 'Changes to send',
  68. 'sync_no_targets' => 'No destination is configured yet. Add the folder SyncDrop should deploy to.',
  69. 'stat_new' => 'New',
  70. 'stat_changed' => 'Changed',
  71. 'stat_same' => 'Unchanged',
  72. 'stat_skipped' => 'Skipped',
  73. 'col_file' => 'File',
  74. 'col_size' => 'Size',
  75. 'col_status' => 'Status',
  76. 'col_date' => 'Date',
  77. 'col_target' => 'Destination',
  78. 'col_files' => 'Files',
  79. 'col_event' => 'Event',
  80. 'col_device' => 'Device',
  81. ​
  82. 'history_title' => 'History',
  83. 'history_deploys' => 'Deployments',
  84. 'history_security' => 'Security log',
  85. 'history_empty' => 'Nothing here yet.',
  86. 'history_counts' => '{n} new, {c} changed',
  87. 'status_ok' => 'Deployed',
  88. 'status_failed' => 'Failed, restored',
  89. 'status_rolled_back' => 'Rolled back',
  90. 'rollback' => 'Restore previous version',
  91. ​
  92. 'settings_title' => 'Settings',
  93. 'settings_alerts' => 'Security alerts',
  94. 'settings_alerts_on' => 'Send an e-mail on every login and security change',
  95. 'settings_test_mail' => 'Save and send a test e-mail',
  96. 'settings_password' => 'Password',
  97. 'settings_password_save' => 'Change password',
  98. 'settings_2fa' => 'Two-factor authentication',
  99. 'settings_2fa_on' => 'Enabled',
  100. 'settings_recovery_left' => 'Recovery codes left: {n} of 10.',
  101. 'settings_recovery_new' => 'Generate new recovery codes',
  102. 'settings_sessions' => 'Sessions',
  103. 'settings_sessions_hint' => 'Signs out every other browser and device immediately.',
  104. 'settings_sessions_btn' => 'Sign out everywhere else',
  105. 'settings_targets' => 'Destinations',
  106. 'target_ok' => 'Available',
  107. 'target_unavailable' => 'unavailable',
  108. 'target_name' => 'Name',
  109. 'target_path' => 'Absolute server path',
  110. 'target_path_hint' => 'For example the public_html folder of a domain. It must exist and be writable.',
  111. 'target_exclude' => 'Never send these files',
  112. 'target_exclude_hint' => 'One pattern per line, e.g. node_modules/, *.log, /config/local.php. .env, .git and SyncDrop files are always excluded.',
  113. 'target_add' => 'Add destination',
  114. 'target_remove' => 'Remove',
  115. 'target_remove_confirm' => 'Remove this destination? Files on the server stay untouched.',
  116. ​
  117. 'fatal_title' => 'SyncDrop cannot start',
  118. '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.',
  119. 'fatal_data' => 'The configuration folder outside the web root is not writable, so SyncDrop cannot store its configuration safely.',
  120. 'fatal_ext' => 'A required PHP extension is missing (hash, random or mbstring).',
  121. ​
  122. 'err_antibot' => 'The security check failed. Reload the page and try again.',
  123. 'err_locked' => 'Too many failed attempts. Try again in {min} min.',
  124. 'err_locked_short' => 'Too many failed attempts. Try again later.',
  125. 'err_setup_code' => 'The setup code is incorrect.',
  126. 'err_username' => 'The username must have 3–32 characters: letters, digits, dot, dash or underscore.',
  127. 'err_email' => 'Enter a valid e-mail address.',
  128. 'err_password_weak' => 'The password is too weak.',
  129. 'err_password_match' => 'The passwords do not match.',
  130. 'err_password_current' => 'The current password is incorrect.',
  131. 'err_login' => 'Incorrect username or password.',
  132. 'err_code' => 'The code is incorrect or has already been used.',
  133. 'err_stage_expired' => 'The sign-in took too long. Sign in again.',
  134. 'err_too_many' => 'Too many incorrect codes. Sign in again.',
  135. 'err_rollback' => 'This deployment cannot be restored. Only the most recent deployment of a destination can be rolled back.',
  136. 'err_target_name' => 'Enter a name of up to 60 characters.',
  137. 'err_target_exists' => 'This folder is already a destination.',
  138. 'err_target_missing' => 'The folder does not exist.',
  139. 'err_target_root' => 'The filesystem root cannot be a destination.',
  140. 'err_target_readonly' => 'PHP cannot write to this folder.',
  141. 'err_target_forbidden' => 'This folder belongs to SyncDrop and cannot be a destination.',
  142. ​
  143. 'msg_saved' => 'Saved.',
  144. 'msg_test_sent' => 'Saved. A test e-mail was sent.',
  145. 'msg_test_failed' => 'Saved, but the server could not send the test e-mail.',
  146. 'msg_password_changed' => 'Password changed. All other sessions were signed out.',
  147. 'msg_sessions' => 'All other sessions were signed out.',
  148. 'msg_rollback_ok' => 'Restored the previous version of {n} files.',
  149. 'msg_rollback_partial' => 'Restored {n} files. {s} files were changed after the deployment and were left as they are.',
  150. ​
  151. 'method_totp' => 'authenticator app',
  152. 'method_recovery' => 'recovery code',
  153. ​
  154. '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.',
  155. 'alert_login_subject' => 'new sign-in',
  156. 'alert_login_body' => 'User {user} signed in to SyncDrop using the {method}.',
  157. 'alert_lockout_subject' => 'sign-in blocked',
  158. 'alert_lockout_body' => 'Several failed sign-in attempts were detected and SyncDrop blocked further attempts ({scope}).',
  159. 'alert_recovery_subject' => 'recovery code used',
  160. 'alert_recovery_body' => 'A recovery code was used to sign in. Codes left: {left}.',
  161. 'alert_2fa_subject' => 'two-factor authentication enabled',
  162. 'alert_2fa_body' => 'Two-factor authentication was enabled for {user}.',
  163. 'alert_email_subject' => 'alert e-mail changed',
  164. 'alert_email_body' => 'Security alerts will now be sent to {email}.',
  165. 'alert_test_subject' => 'test e-mail',
  166. 'alert_test_body' => 'Security alerts work. This is a test message.',
  167. 'alert_password_subject' => 'password changed',
  168. 'alert_password_body' => 'The password of {user} was changed and all other sessions were signed out.',
  169. 'alert_recovery_new_subject' => 'new recovery codes',
  170. 'alert_recovery_new_body' => 'New recovery codes were generated. The previous codes no longer work.',
  171. ​
  172. 'ev_login_ok' => 'Signed in',
  173. 'ev_login_failed' => 'Failed sign-in',
  174. 'ev_password_ok' => 'Password accepted',
  175. 'ev_lockout' => 'Sign-in blocked',
  176. 'ev_logout' => 'Signed out',
  177. 'ev_setup_done' => 'Installed',
  178. 'ev_totp_enrolled' => '2FA enabled',
  179. 'ev_recovery_used' => 'Recovery code used',
  180. 'ev_recovery_regenerated' => 'New recovery codes',
  181. 'ev_password_changed' => 'Password changed',
  182. 'ev_sessions_revoked' => 'Sessions signed out',
  183. 'ev_alerts_changed' => 'Alerts changed',
  184. 'ev_alert_sent' => 'Alert sent',
  185. 'ev_alert_failed' => 'Alert not sent',
  186. 'ev_target_added' => 'Destination added',
  187. 'ev_target_saved' => 'Destination saved',
  188. 'ev_target_removed' => 'Destination removed',
  189. 'ev_deploy_begin' => 'Upload started',
  190. 'ev_deploy_ok' => 'Deployed',
  191. 'ev_deploy_aborted' => 'Upload cancelled',
  192. 'ev_deploy_verify_failed' => 'Verification failed',
  193. 'ev_deploy_rolled_back' => 'Error, restored',
  194. 'ev_rollback' => 'Version restored',
  195. ​
  196. 'js_solving' => 'Security check…',
  197. 'js_hashing' => 'Computing checksums…',
  198. 'js_comparing' => 'Comparing with the server…',
  199. 'js_uploading' => 'Uploading…',
  200. 'js_verifying' => 'Verifying and replacing files…',
  201. 'js_done' => 'Done: {n} new, {c} changed files deployed.',
  202. 'js_failed' => 'The deployment failed. Nothing was changed on the server.',
  203. 'js_rolled_back' => 'An error occurred while replacing files. The previous version was restored automatically.',
  204. 'js_nothing' => 'Everything is up to date. There is nothing to send.',
  205. 'js_pick_first' => 'Choose a folder first.',
  206. 'js_files' => '{n} files',
  207. 'js_summary' => '{n} files to send ({size})',
  208. 'js_send' => 'Send changes',
  209. 'js_working' => 'Working…',
  210. 'js_status_n' => 'New',
  211. 'js_status_c' => 'Changed',
  212. 'js_status_s' => 'Unchanged',
  213. 'js_status_x' => 'Excluded',
  214. 'js_status_e' => 'Invalid path',
  215. 'js_status_b' => 'Too large',
  216. 'js_too_many' => 'Too many files. The limit is {max} per deployment.',
  217. 'js_more' => 'and {n} more…',
  218. 'js_copied' => 'Copied',
  219. 'js_confirm_rollback' => 'Restore the version from before this deployment?',
  220. 'js_err_auth' => 'Your session has expired. Sign in again.',
  221. 'js_err_busy' => 'Another deployment is in progress. Try again in a moment.',
  222. 'js_err_disk' => 'Not enough free disk space on the server.',
  223. 'js_err_verify' => 'Some files arrived damaged. Nothing was changed. Try again.',
  224. 'js_err_generic' => 'Something went wrong. Nothing was changed on the server.',
  225. ​
  226. 'nav_shield' => 'IP shield',
  227. 'shield_title' => 'IP shield',
  228. '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.',
  229. 'shield_your_ip' => 'Your IP address',
  230. 'shield_trusted' => 'trusted',
  231. 'shield_allowed' => 'allowlisted',
  232. 'shield_untrusted' => 'not trusted yet',
  233. 'shield_active' => 'Active bans',
  234. 'shield_active_split' => 'automatic: {a} · manual: {m}',
  235. 'shield_watched' => 'Under watch',
  236. 'shield_bans' => 'Banned addresses',
  237. 'shield_no_bans' => 'No address is banned.',
  238. 'shield_ban_title' => 'Ban an address',
  239. 'shield_address' => 'IP address or range (CIDR)',
  240. 'shield_address_hint' => 'For example 203.0.113.7, 203.0.113.0/24 or 2001:db8::/48.',
  241. 'shield_duration' => 'Duration',
  242. 'shield_note' => 'Note (optional)',
  243. 'shield_ban_btn' => 'Ban',
  244. 'shield_ban_confirm' => 'Ban this address for 30 days?',
  245. 'shield_d_3600' => '1 hour',
  246. 'shield_d_86400' => '24 hours',
  247. 'shield_d_604800' => '7 days',
  248. 'shield_d_2592000' => '30 days',
  249. 'shield_d_0' => 'Permanently',
  250. 'shield_unban' => 'Unban',
  251. 'shield_unban_confirm' => 'Unban this address?',
  252. 'shield_forever' => 'permanent',
  253. 'shield_auto' => 'automatic',
  254. 'shield_manual' => 'manual',
  255. 'shield_allow_title' => 'Allowlist',
  256. 'shield_allow_hint' => 'Allowlisted addresses are never scored or banned. Add only addresses you control, such as a static office IP.',
  257. 'shield_allow_btn' => 'Add to allowlist',
  258. 'shield_allow_me' => 'Add my IP address',
  259. 'shield_allow_empty' => 'The allowlist is empty.',
  260. 'shield_me_note' => 'Added from this device',
  261. 'shield_remove' => 'Remove',
  262. 'shield_watch_title' => 'Under watch (last 24 hours)',
  263. 'shield_watch_empty' => 'No suspicious activity in the last 24 hours.',
  264. 'shield_points' => '{n} of 100 points',
  265. 'shield_blocked' => 'Access denied. This IP address has been blocked by AtheraStudio SyncDrop after suspicious activity.',
  266. 'shield_r_scanner' => 'Security scanner',
  267. 'shield_r_signature' => 'Attack pattern in the request',
  268. 'shield_r_honeypot' => 'Bot trap filled in',
  269. 'shield_r_pow_forged' => 'Forged security check',
  270. 'shield_r_pow_invalid' => 'Invalid security check',
  271. 'shield_r_probe' => 'Probing for files',
  272. 'shield_r_method' => 'Unusual HTTP method',
  273. 'shield_r_host' => 'Invalid Host header',
  274. 'shield_r_api_anon' => 'API call without a session',
  275. 'shield_r_lockout' => 'Repeated failed sign-ins',
  276. 'shield_r_fail_password' => 'Wrong password',
  277. 'shield_r_fail_totp' => 'Wrong 2FA code',
  278. 'shield_r_fail_setup_code' => 'Wrong setup code',
  279. 'shield_r_fail_antibot' => 'Failed antibot check',
  280. 'shield_r_manual' => 'Banned manually',
  281. 'col_address' => 'Address',
  282. 'col_reason' => 'Reason',
  283. 'col_since' => 'Since',
  284. 'col_until' => 'Until',
  285. 'col_last' => 'Last attempt',
  286. 'col_points' => 'Points',
  287. 'err_ban_invalid' => 'Enter a valid IP address or CIDR range.',
  288. 'err_ban_range' => 'The range is too wide. Use at least /16 for IPv4 and /32 for IPv6.',
  289. 'err_ban_self' => 'This would ban your own IP address.',
  290. 'err_allow_full' => 'The allowlist is full (200 entries).',
  291. 'msg_banned' => 'The address was banned.',
  292. 'msg_unbanned' => 'The address was unbanned.',
  293. 'msg_allowed' => 'The address was added to the allowlist.',
  294. 'msg_allow_removed' => 'The address was removed from the allowlist.',
  295. 'alert_ban_subject' => 'IP address banned',
  296. 'alert_ban_body' => 'SyncDrop automatically banned {ban} until {until}. Last reason: {reason}. You can lift the ban in SyncDrop under IP shield.',
  297. 'ev_threat' => 'Suspicious request',
  298. 'ev_ip_banned' => 'IP banned',
  299. 'ev_ip_unbanned' => 'IP unbanned',
  300. 'ev_allow_added' => 'Allowlist entry added',
  301. 'ev_allow_removed' => 'Allowlist entry removed',
  302. ​
  303. 'view_title' => 'Preview',
  304. 'view_close' => 'Close',
  305. 'view_diff' => 'Changes',
  306. 'view_new' => 'New version',
  307. 'view_old' => 'On the server',
  308. 'view_wrap' => 'Wrap lines',
  309. 'js_view' => 'Preview',
  310. 'js_view_loading' => 'Loading…',
  311. 'js_view_binary' => 'This is a binary file or it is not UTF-8 text, so it cannot be previewed.',
  312. 'js_view_large' => 'The file is larger than 1 MB, so it cannot be previewed.',
  313. 'js_view_server_binary' => 'The version on the server is a binary file, so only the new version is shown.',
  314. 'js_view_server_large' => 'The version on the server is larger than 1 MB, so only the new version is shown.',
  315. 'js_view_server_missing' => 'The file is no longer on the server, so only the new version is shown.',
  316. 'js_view_same' => 'The lines are identical. Only line endings, encoding or the BOM mark differ.',
  317. 'js_view_too_many' => 'There are too many differences to compare line by line. Open New version or On the server.',
  318. 'js_view_hidden' => '{n} unchanged lines',
  319. 'js_view_lines' => 'lines: {n}',
  320. 'nav_update' => 'Updates',
  321. 'update_title' => 'Updates',
  322. 'update_nav_new' => 'Update available',
  323. 'update_current' => 'Installed version {v}',
  324. 'update_latest' => 'You have the latest version',
  325. 'update_new' => 'New version',
  326. 'update_available' => 'Version {v} is available',
  327. 'update_released' => 'Released {d}',
  328. 'update_changes' => 'What’s new',
  329. 'update_install' => 'Update to {v}',
  330. 'update_confirm' => 'Install version {v}? SyncDrop makes a backup before changing any files.',
  331. 'update_check' => 'Check again',
  332. 'update_checked' => 'Checked {t}',
  333. '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.',
  334. 'update_backups' => 'Backups',
  335. '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.',
  336. 'update_backups_empty' => 'No backups yet.',
  337. 'col_versions' => 'Versions',
  338. 'update_restore' => 'Restore',
  339. 'update_restore_confirm' => 'Restore version {v}? The files from this update will be replaced with the backup.',
  340. 'update_delete' => 'Delete',
  341. 'update_delete_confirm' => 'Delete this backup? This cannot be undone.',
  342. 'update_msg_done' => 'Installed version {v} ({n} files).',
  343. 'update_msg_restored' => 'Restored version {v} ({n} files).',
  344. 'update_msg_restore_partial' => 'Restored {n} files, but {s} could not be written. The backup was kept; check the permissions of the SyncDrop folder.',
  345. 'update_msg_deleted' => 'Backup deleted.',
  346. 'update_need_zip' => 'This server is missing the PHP zip extension, so updates are unavailable.',
  347. 'update_need_sodium' => 'This server is missing the PHP sodium extension, so signatures cannot be checked and updates are unavailable.',
  348. 'update_need_http' => 'This server cannot make HTTPS requests (no curl or openssl), so updates are unavailable.',
  349. 'update_err_network' => 'Could not reach the update server. Try again later.',
  350. 'update_err_server' => 'The update server returned an error. Try again later.',
  351. 'update_err_manifest' => 'The update server sent data that could not be read.',
  352. 'update_err_size' => 'The update package is too large, so it was not downloaded.',
  353. 'update_err_storage' => 'Could not write a temporary file in the SyncDrop data folder.',
  354. 'update_err_checksum' => 'The download does not match its checksum, so it was not used. Try again.',
  355. 'update_err_archive' => 'The downloaded package is damaged. Try again.',
  356. 'update_err_signature' => 'The package signature is invalid, so the update was stopped. Nothing was changed.',
  357. 'update_err_current' => 'There is no newer version to install.',
  358. 'update_err_busy' => 'An update is already running. Wait a moment.',
  359. 'update_err_backup' => 'The backup could not be made, so nothing was changed.',
  360. 'update_err_write' => 'The files could not be written, so every change was undone. Check the permissions of the SyncDrop folder.',
  361. 'update_err_restore' => 'This backup cannot be restored. Only the newest backup can be restored, and only when it belongs to the installed version.',
  362. 'update_err_missing' => 'This backup was not found.',
  363. 'ev_update_ok' => 'Updated',
  364. 'ev_update_failed' => 'Update undone',
  365. 'ev_update_rejected' => 'Package rejected',
  366. 'ev_update_restored' => 'Version restored',
  367. 'ev_update_deleted' => 'Backup deleted',
  368. 'alert_update_subject' => 'Updated to version {to}',
  369. 'alert_update_body' => 'SyncDrop was updated from version {from} to {to}. A backup of the previous files is on the Updates page.',
  370. ];
  371. ​